socsvn commit: r272284 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw
dpl at FreeBSD.org
dpl at FreeBSD.org
Tue Aug 12 13:59:32 UTC 2014
Author: dpl
Date: Tue Aug 12 13:59:30 2014
New Revision: 272284
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272284
Log:
Corrected the NULL pointers, added a optimize function, and moved some of the code out of compile-time, to make our lifes easier.
Modified:
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw2.c
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw2.c
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw2.c Tue Aug 12 12:45:30 2014 (r272283)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw2.c Tue Aug 12 13:59:30 2014 (r272284)
@@ -266,6 +266,15 @@
{
struct ip_fw_chain *chain = &V_layer3_chain;
+ /* Read comment below about this variable. */
+ struct mbuf *m = args->m;
+
+ if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready))
+ return (IP_FW_PASS); /* accept */
+
+ args->f_id.fib = M_GETFIB(m); /* note mbuf not altered) */
+
+
/* If we haven't, JIT-compile the actions to be executed per-rule */
if (compiledfuncptr == 0) {
IPFW_PF_RLOCK(chain);
@@ -302,7 +311,6 @@
* (Until we start using L3offset, the packet is
* supposed to start with the ip header).
*/
- struct mbuf *m = args->m;
struct ip *ip = mtod(m, struct ip *);
/*
@@ -396,13 +404,9 @@
int done = 0; /* flag to exit the outer loop */
- if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready))
- return (IP_FW_PASS); /* accept */
-
dst_ip.s_addr = 0; /* make sure it is initialized */
src_ip.s_addr = 0; /* make sure it is initialized */
pktlen = m->m_pkthdr.len;
- args->f_id.fib = M_GETFIB(m); /* note mbuf not altered) */
proto = args->f_id.proto = 0; /* mark f_id invalid */
/* XXX 0 is a valid proto: IP/IPv6 Hop-by-Hop Option */
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Aug 12 12:45:30 2014 (r272283)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Aug 12 13:59:30 2014 (r272284)
@@ -40,6 +40,9 @@
LLVMContext con;
OwningPtr<MemoryBuffer> buffer;
IRBuilder<> irb;
+
+ // We'll store the BasicBlock objects for each rule here.
+ int rule_number;
std::vector<BasicBlock*> blocks;
// Vars Types
@@ -51,7 +54,7 @@
// Basic blocks used
BasicBlock *entry;
BasicBlock *pullup_failed;
- BasicBlock *startiter;
+ BasicBlock *startrules;
// JIT Compiled Vars
// Loop control.
@@ -77,7 +80,7 @@
Value *src_port; //unsigned
Value *dst_port; //unsigned
Value *src_ip;
- Value *dest_ip;
+ Value *dst_ip;
Value *iplen; //unsigned
Value *pktlen;
Value *etype; //unsigned
@@ -114,7 +117,7 @@
Function *jump_fast;
// Not pkg-filtering related funcs.
- Function *printf;
+ Function *printfFunc;
// Used structs.
StructType *ifnetTy;
@@ -190,18 +193,18 @@
#endif /* __FreeBSD__ */
// Create Pointer to StructType types.
- ipfw_dyn_rulePtrTy = PointerType::get(ipfw_dyn_ruleTy);
- ifnetPtrTy = PointerType::get(ifnetTy);
- in_addrPtrTy = PointerType::get(in_addrTy);
- ipPtrTy = PointerType::get(ipTy);
- ip_fw_argsPtrTy = PointerType::get(ip_fw_argsTy);
- ip_fw_chainPtrTy = PointerType::get(ip_fw_chainTy);
- ip_fwPtrTy = PointerType::get(ip_fwTy);
- ip_fw_insnPtrTy = PointerType::get(_ip_fw_insnTy);
- ipfw_insn_ifPtrTy = PointerType::get(_ipfw_insn_ifTy);
- mbufPtrTy = PointerType::get(mbufTy);
+ ipfw_dyn_rulePtrTy = PointerType::get(ipfw_dyn_ruleTy, 0);
+ ifnetPtrTy = PointerType::get(ifnetTy, 0);
+ in_addrPtrTy = PointerType::get(in_addrTy, 0);
+ ipPtrTy = PointerType::get(ipTy, 0);
+ ip_fw_argsPtrTy = PointerType::get(ip_fw_argsTy, 0);
+ ip_fw_chainPtrTy = PointerType::get(ip_fw_chainTy, 0);
+ ip_fwPtrTy = PointerType::get(ip_fwTy, 0);
+ ip_fw_insnPtrTy = PointerType::get(ip_fw_insnTy, 0);
+ ipfw_insn_ifPtrTy = PointerType::get(ipfw_insn_ifTy, 0);
+ mbufPtrTy = PointerType::get(mbufTy, 0);
#ifdef __FreeBSD__
- ucredPtrTy = PointerType::get(ucredTy);
+ ucredPtrTy = PointerType::get(ucredTy, 0);
#endif
// Allocate vars.
@@ -215,15 +218,16 @@
irb.CreateStore(ConstantInt::get(int32Ty, 0), retval);
m = irb.CreateAlloca(mbufPtrTy); // Init: args->m
- // ip = mtod(m, struct ip *)
- // #define mtod(m, t) ((t)((m)->m_data))
+ // XXX m = args->m
+
ip = irb.CreateAlloca(ipPtrTy);
+ // XXX ip = (struct ip *)((m)->m_data);
#ifdef __FreeBSD__
ucred = irb.CreateAlloca(ucredPtrTy); // Init: NULL if type ucred.
- irb.CreateStore(ConstantPointerNull::get(null), ucred);
+ irb.CreateStore(ConstantPointerNull::get(ucredPtrTy), ucred);
#else
- ucred = irb.CreateAlloca(ucredTy); // Init: NULL if type ucred.
+ ucred = irb.CreateAlloca(ucredTy);
#endif
ucred_lookup = irb.CreateAlloca(int32Ty);
@@ -241,6 +245,8 @@
irb.CreateStore(ConstantInt::get(int16Ty, 0), ip6f_mf);
proto = irb.CreateAlloca(int8Ty);
+ irb.CreateStore(ConstantInt::get(int8Ty, 0), proto);
+ // XXX proto = args->f_id.proto = 0
src_port = irb.CreateAlloca(int16Ty);
irb.CreateStore(ConstantInt::get(int16Ty, 0), src_port);
@@ -248,12 +254,16 @@
irb.CreateStore(ConstantInt::get(int16Ty, 0), dst_port);
src_ip = irb.CreateAlloca(in_addrTy);
- dest_ip = irb.CreateAlloca(in_addrTy);
+ dst_ip = irb.CreateAlloca(in_addrTy);
+ // XXX
+ //dst_ip.s_addr = 0;
+ //src_ip.s_addr = 0;
iplen = irb.CreateAlloca(int16Ty);
irb.CreateStore(ConstantInt::get(int16Ty, 0), iplen);
pktlen = irb.CreateAlloca(int32Ty);
+ //XXX pktlen = m->m_pkthdr.len;
etype = irb.CreateAlloca(int16Ty);
irb.CreateStore(ConstantInt::get(int32Ty, 0), etype);
@@ -262,11 +272,11 @@
irb.CreateStore(ConstantInt::get(int32Ty, MATCH_UNKNOWN), dyn_dir);
q = irb.CreateAlloca(ipfw_dyn_rulePtrTy);
- irb.CreateStore(ConstantPointerNull::get(null), q);
+ irb.CreateStore(ConstantPointerNull::get(ipfw_dyn_rulePtrTy), q);
// There are no (void *), we use i8*
- ulp = irb.CreateAlloca(int8PtrTy); //Init: NULL
- irb.CreateStore(ConstantPointerNull::get(null), ulp);
+ ulp = irb.CreateAlloca(int8PtrTy);
+ irb.CreateStore(ConstantPointerNull::get(int8PtrTy), ulp);
is_ipv4 = irb.CreateAlloca(int32Ty);
irb.CreateStore(ConstantInt::get(int32Ty, 0), is_ipv4);
@@ -300,14 +310,12 @@
check_uidgid = mod->getFunction("check_uidgid");
set_match = mod->getFunction("set_match");
jump_fast = mod->getFunction("jump_fast");
-
- return (0);
}
void
emit_pullup_failed()
{
- GlobalValue *is_verbose, *str;
+ Value *is_verbose, *str;
BasicBlock *print, *ret;
// VNET_DECLARE(int, fw_verbose);
@@ -320,14 +328,14 @@
// return (IP_FW_DENY);
irb.SetInsertPoint(pullup_failed);
- is_verbose = mod.getGlobalVariable("fw_verbose");
+ is_verbose = mod->getGlobalVariable("fw_verbose");
str = irb.CreateGlobalString("ipfw: pullup failed\n");
// if (V_fw_verbose)
- CreateCondBr(CreateICmpEQ(is_verbose, ConstantInt::get(int32Ty, 0)), ret, print);
+ irb.CreateCondBr(irb.CreateICmpEQ(is_verbose, ConstantInt::get(int32Ty, 0)), ret, print);
// printf("ipfw: pullup failed\n");
irb.SetInsertPoint(print);
- irb.CreateCall(printf, str);
+ irb.CreateCall(printfFunc, str);
irb.CreateBr(ret);
// return (IP_FW_DENY);
@@ -344,12 +352,12 @@
func = mod->getFunction("ipfw_chk_jit");
func->setLinkage(GlobalValue::ExternalLinkage);
- printf = mod->getFunction("printf");
+ printfFunc = mod->getFunction("printf");
// Create first BasicBlocks.
entry = BasicBlock::Create(con, "entry", func);
pullup_failed = BasicBlock::Create(con, "pullup_failed", func);
- startiter = BasicBlock::Create(con, "startiter", func);
+ startrules = BasicBlock::Create(con, "startrules", func);
// Create the code related to the pullup_failed Basic Block.
emit_pullup_failed();
@@ -366,6 +374,12 @@
delete mod;
}
+ void
+ optimize()
+ {
+ return;
+ }
+
// Returns the pointer to the compiled function.
funcptr
getFuncPtr()
@@ -377,11 +391,13 @@
int
emit_lookpkt()
{
- // If it returns one, we have to goto pullup_failed.
- CreateCondBr(CreateICmpEQ(irb.CreateCall(inspect_pkt), ConstantInt::get(int32Ty, 1)), pullup_failed, startiter);
+ // If it returns one, goto pullup_failed.
+ // Else, goto starrules.
+ irb.CreateCondBr(irb.CreateICmpEQ(irb.CreateCall(inspect_pkt), ConstantInt::get(int32Ty, 1)), pullup_failed, startrules);
return (0);
}
+ // Rules
int
emit_nop()
{
@@ -638,9 +654,9 @@
comp.emit_ipsec();
#endif
/* otherwise no match */
+/* XXX
break;
-/* XXX
#ifdef INET6
case O_IP6_SRC:
comp.emit_ip6_src();
@@ -824,5 +840,6 @@
} /* end of outer for, scan rules */
// Once we're done iterating through the rules, return the pointer.
+ comp.optimize();
return (comp.getFuncPtr());
}
More information about the svn-soc-all
mailing list