socsvn commit: r272369 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw
dpl at FreeBSD.org
dpl at FreeBSD.org
Wed Aug 13 16:52:53 UTC 2014
Author: dpl
Date: Wed Aug 13 16:52:52 2014
New Revision: 272369
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272369
Log:
Added emit_check_tag() function, which compiles stuff done before iterating the rules.
Modified:
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.h
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.h
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.h Wed Aug 13 15:50:16 2014 (r272368)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.h Wed Aug 13 16:52:52 2014 (r272369)
@@ -59,6 +59,7 @@
// Functions used by JIT, external.
int printf(const char * restrict format, ...);
+int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id);
static VNET_DEFINE(int, fw_deny_unknown_exthdrs);
#define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs)
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Wed Aug 13 15:50:16 2014 (r272368)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Wed Aug 13 16:52:52 2014 (r272369)
@@ -102,6 +102,7 @@
Function *inspect_pkt;
// Auxiliary functions used by our JITed code.
+ // All this are used from our bitcode.
Function *is_icmp_query;
Function *flags_match;
Function *ipopts_match;
@@ -123,6 +124,7 @@
// Not pkg-filtering related funcs.
Function *printfFunc;
+ Function *ipfw_find_rule;
// Used structs.
StructType *ifnetTy;
@@ -172,7 +174,7 @@
// Create the needed variables to perform pkt filtering.
void
- setEnv(struct ip_fw_args *args, struct ip_fw_chain *chain)
+ setEnv()
{
// Get function arguments.
// (struct ip_fw_args *, struct ip_fw_chain *)
@@ -245,6 +247,10 @@
check_uidgid = mod->getFunction("check_uidgid");
set_match = mod->getFunction("set_match");
jump_fast = mod->getFunction("jump_fast");
+
+ // Functions declared at bitcode.
+ printfFunc = mod->getFunction("printf");
+ ipfw_find_rule = mod->getFunction("ipfw_find_rule");
}
// Allocate and initialize vars.
@@ -371,6 +377,55 @@
irb.CreateRet(ConstantInt::get(int32Ty, IP_FW_DENY));
}
+ void
+ emit_check_tag()
+ {
+ BasicBlock *tagged, *nottagged;
+ BasicBlock *yes, *no;
+
+ // if (args->rule.slot) {
+ // /*
+ // * Packet has already been tagged as a result of a previous
+ // * match on rule args->rule aka args->rule_id (PIPE, QUEUE,
+ // * REASS, NETGRAPH, DIVERT/TEE...)
+ // * Validate the slot and continue from the next one
+ // * if still present, otherwise do a lookup.
+ // */
+ // f_pos = (args->rule.chain_id == chain->id) ?
+ // args->rule.slot :
+ // ipfw_find_rule(chain, args->rule.rulenum,
+ // args->rule.rule_id);
+ // } else {
+ // f_pos = 0;
+ // }
+
+ irb.SetInsertPoint(check_tag);
+
+ // if (args->rule.slot)
+ irb.CreateCondBr(irb.CreateICmpEQ(irb.CreateInBoundsGEP(argsptr, {ConstantInt::get(int32Ty, 4),ConstantInt::get(int32Ty, 0)}), ConstantInt::get(int32Ty, 0)), nottagged, tagged);
+ // if (args->rule.chain_id == chain->id)
+ irb.SetInsertPoint(tagged);
+ irb.CreateCondBr(irb.CreateICmpEQ(irb.CreateInBoundsGEP(argsptr, {ConstantInt::get(int32Ty, 4), ConstantInt::get(int32Ty, 3)}), irb.CreateInBoundsGEP(chainptr, ConstantInt::get(int32Ty, 12))), yes, no);
+
+ // f_pos = args->rule.slot;
+ irb.SetInsertPoint(yes);
+ irb.CreateStore(irb.CreateInBoundsGEP(argsptr, {ConstantInt::get(int32Ty, 4),ConstantInt::get(int32Ty, 0)}), f_pos);
+ irb.CreateBr(nottagged);
+
+ // else fpos = ipfw_find_rule(chain, args->rule.rulenum, args->rule.rule_id)
+ irb.SetInsertPoint(no);
+ irb.CreateStore(irb.CreateCall3(ipfw_find_rule, chainptr, irb.CreateInBoundsGEP(argsptr, {ConstantInt::get(int32Ty, 4), ConstantInt::get(int32Ty, 1)}), irb.CreateInBoundsGEP(argsptr, {ConstantInt::get(int32Ty, 4), ConstantInt::get(int32Ty, 2)})), f_pos);
+
+ // Branch to nottagged because it
+ // only finishes the check_tag BasicBlock.
+ irb.CreateBr(nottagged);
+
+ // else f_pos = 0;
+ // Since f_pos is initialized by default as 0, we only br.
+ irb.SetInsertPoint(nottagged);
+ irb.CreateBr(startrules);
+ }
+
public:
ipfwJIT(struct ip_fw_args *args, struct ip_fw_chain *chain): irb(con)
{
@@ -380,8 +435,6 @@
func = mod->getFunction("ipfw_chk_jit");
func->setLinkage(GlobalValue::ExternalLinkage);
- printfFunc = mod->getFunction("printf");
-
// Create statics BasicBlocks.
entry = BasicBlock::Create(con, "entry", func);
pullup_failed = BasicBlock::Create(con, "pullup_failed", func);
More information about the svn-soc-all
mailing list