Date: Thu, 18 Sep 2014 14:30:28 GMT From: dpl@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r274309 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw Message-ID: <201409181430.s8IEUS7J081119@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dpl Date: Thu Sep 18 14:30:27 2014 New Revision: 274309 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=274309 Log: Corrected some wrong rules actions. Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c ============================================================================== --- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c Thu Sep 18 13:59:36 2014 (r274308) +++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_rules.c Thu Sep 18 14:30:27 2014 (r274309) @@ -2,7 +2,8 @@ #include <sys/ucred.h> #include <netinet/in.h> - #define IPFW_RULES_INLINE __unused + // #define IPFW_RULES_INLINE __unused + #define IPFW_RULES_INLINE __attribute__((used)) #include "ip_fw_rules.h" // The real function will be compiled and inserted by the JIT. Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc ============================================================================== --- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Thu Sep 18 13:59:36 2014 (r274308) +++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Thu Sep 18 14:30:27 2014 (r274309) @@ -911,7 +911,6 @@ { // Create the module and load the code. mod = loadBitcode("rules.bc"); - mod->dump(); Func = mod->getFunction("ipfw_chk_jit"); if (Func == NULL) @@ -1328,22 +1327,30 @@ void emit_nop() { - Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Match); + // rule_nop(&match); + Irb.CreateCall(RuleNop, Match); } // XXX Exec not tested. void emit_forward_mac() { - printf("Compilation error:\n"); - printf("ipfwjitter: MAC forwarding unimplemented\n"); - printf("Compilation continues.\n"); + // rule_forward_mac(cmd->opcode); + Value *CmdL = Irb.CreateLoad(Cmd); + Value *Opcode = Irb.CreateStructGEP(CmdL, 0); + Value *OpcodeL = Irb.CreateLoad(Opcode); + // Opcode is u_int8 + Value *OpcodeL32 = Irb.CreateZExt(OpcodeL, Int32Ty); + Irb.CreateCall(RuleForwardMac, {OpcodeL32}); } // XXX Exec not tested. void emit_jail() { + // rule_jail(&match, offset, proto, cmd, args, ucred_lookup, ucred_cache); + // We roll our own version because we don't have ucred_lookup. + BasicBlock *OffsetNZ = BasicBlock::Create(Con, "R_offsetnotzero", Func); BasicBlock *OffsetZE = BasicBlock::Create(Con, "R_offsetiszero", Func); BasicBlock *TCPorUDP = BasicBlock::Create(Con, "R_setmatchzero", Func); @@ -1388,57 +1395,27 @@ void emit_recv() { - //*match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd, chain, tablearg); - Value *MPkthdr = Irb.CreateStructGEP(M, 5); - Value *Rcvif = Irb.CreateStructGEP(MPkthdr, 0); - Value *RcvifL = Irb.CreateLoad(Rcvif); + // rule_recv(&match, cmd, m, chain, &tablearg); Value *CmdL = Irb.CreateLoad(Cmd); - Value *CmdBitC = Irb.CreateBitCast(CmdL, Ipfw_insn_ifPtrTy); - Value *IfaceMatchCall = Irb.CreateCall4(IfaceMatch, RcvifL, CmdBitC, Chain, Tablearg); - Irb.CreateStore(IfaceMatchCall, Match); + Irb.CreateCall(RuleRecv, {Match, CmdL, M, Chain, Tablearg}); } // XXX Exec not tested. void emit_xmit() { - //*match = iface_match(oif, (ipfw_insn_if *)cmd, chain, tablearg); + // rule_xmit(&match, oif, cmd, chain, &tablearg); Value *CmdL = Irb.CreateLoad(Cmd); - Value *Cmdc = Irb.CreateBitCast(CmdL, Ipfw_insn_ifPtrTy); - Value *IfaceMatchCall = Irb.CreateCall4(IfaceMatch, Oif, Cmdc, Chain, Tablearg); - Irb.CreateStore(IfaceMatchCall, Match); + Irb.CreateCall(RuleXmit, {Match, Oif, CmdL, Chain, Tablearg}); } // XXX Exec not tested. void emit_via() { - BasicBlock *OifNZ = BasicBlock::Create(Con, "R_OifNotZero", Func); - BasicBlock *OifZE = BasicBlock::Create(Con, "R_OifIsZero", Func); - Value *IfaceMatchCall; - - // if (oif) - // match = iface_match(oif, (ipfw_insn_if *)cmd, chain, &tablearg); - // else - // match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd, - // chain, &tablearg); - Value *Comp = Irb.CreateICmpNE(Oif, ConstantPointerNull::get((PointerType *)Oif->getType())); - Value *CmdLBitC = Irb.CreateBitCast(Cmd, Ipfw_insn_ifPtrTy); - Irb.CreateCondBr(Comp, OifNZ, OifZE ); - - Irb.SetInsertPoint(OifNZ); - // match = iface_match(oif, (ipfw_insn_if *)cmd, chain, &tablearg); - IfaceMatchCall = Irb.CreateCall4(IfaceMatch, Oif, CmdLBitC, Chain, Tablearg); - Irb.CreateStore(IfaceMatchCall, Match); - - Irb.SetInsertPoint(OifZE); - // match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd, - // chain, &tablearg); - Value *MPkthdr = Irb.CreateStructGEP(M, 5); - Value *Rcvif = Irb.CreateStructGEP(MPkthdr, 0); - Value *RcvifL = Irb.CreateLoad(Rcvif); - IfaceMatchCall = Irb.CreateCall4(IfaceMatch, RcvifL, CmdLBitC, Chain, Tablearg); - Irb.CreateStore(IfaceMatchCall, Match); + // rule_via(&match, oif, m, cmd, chain, &tablearg); + Value *CmdL = Irb.CreateLoad(Cmd); + Irb.CreateCall(RuleVia, {Match, Oif, M, CmdL, Chain, Tablearg}); } void @@ -1451,40 +1428,29 @@ { } - // XXX Exec not tested. void emit_frag() { - // match = (offset != 0); + // rule_frag(&match, offset); Value *OffsetL = Irb.CreateLoad(Offset); - Value *Comp = Irb.CreateICmpNE(OffsetL, ConstantInt::get(OffsetL->getType(), 0)); - Value *Comp32 = Irb.CreateSExt(Comp, Int32Ty); - Irb.CreateStore(Comp32, Match); + Irb.CreateCall(RuleFrag, {Match, OffsetL}); } // XXX Exec not tested. void emit_in() { - // "out" is "not in" - // match = (oif == NULL); - Value *OffsetL = Irb.CreateLoad(Offset); - Value *Comp = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(OffsetL->getType(), 0)); - Value *Comp32 = Irb.CreateSExt(Comp, Int32Ty); - Irb.CreateStore(Comp32, Match); + // rule_in(&match, oif); + Irb.CreateCall(RuleIn, {Match, Oif}); } // XXX Exec not tested. void emit_layer2() { - // match = (args->eh != NULL); - Value *EhPtr = Irb.CreateStructGEP(Args, 5); - Value *Eh = Irb.CreateLoad(EhPtr); - Value *Comp = Irb.CreateICmpNE(Eh, ConstantPointerNull::get((PointerType *)Eh->getType())); - Value *Comp32 = Irb.CreateSExt(Comp, Int32Ty); - Irb.CreateStore(Comp32, Match); + // rule_layer2(&match, args); + Irb.CreateCall(RuleLayer2, {Match, Args}); } void @@ -1501,27 +1467,10 @@ void emit_ip_src() { - // match = is_ipv4 && - // (((ipfw_insn_ip *)cmd)->addr.s_addr == - // src_ip.s_addr); - - // ((ipfw_insn_ip *)cmd)->addr.s_addr - Value *CmdBitC = Irb.CreateBitCast(Cmd, IpfwInsnIpPtrTy); - Value *CmdAddr = Irb.CreateStructGEP(CmdBitC, 1); - Value *CmdSAddr = Irb.CreateStructGEP(CmdAddr, 0); - Value *CmdSAddrL = Irb.CreateLoad(CmdSAddr); - - // src_ip.s_addr - //Value *SrcIpL = Irb.CreateLoad(SrcIp); - Value *SrcAddr = Irb.CreateStructGEP(SrcIp, 0); - Value *SrcAddrL = Irb.CreateLoad(SrcAddr); - //s_addr == src_ip.s_addr - Value *Comp = Irb.CreateICmpEQ(CmdSAddrL, SrcAddrL); - + // rule_ip_src(&match, is_ipv4, cmd, &src_ip); Value *IsIpv4L = Irb.CreateLoad(IsIpv4); - Value *Comp32 = Irb.CreateZExt(Comp, IsIpv4L->getType()); - Value *NewMatch = Irb.CreateAnd(Comp32, IsIpv4L); - Irb.CreateStore(NewMatch, Match); + Value *CmdL = Irb.CreateLoad(Cmd); + Irb.CreateCall(RuleIpSrc, {Match, IsIpv4L, CmdL, SrcIp}); } void @@ -1581,117 +1530,6 @@ Value *SrcPortL = Irb.CreateLoad(SrcPort); Irb.CreateCall(RuleIpDstport, {Match, ProtoL, OffsetL, CmdL, CmdlenL, DstPortL, SrcPortL}); - - // // /* - // // * offset == 0 && proto != 0 is enough - // // * to guarantee that we have a - // // * packet with port info. - // // */ - // // if ((proto==IPPROTO_UDP || proto==IPPROTO_TCP) - // // && offset == 0) { - // // u_int16_t x = - // // (cmd->opcode == O_IP_SRCPORT) ? - // // src_port : dst_port ; - // // u_int16_t *p = - // // ((ipfw_insn_u16 *)cmd)->ports; - // // int i; - - // // for (i = cmdlen - 1; !match && i>0; - // // i--, p += 2) - // // match = (x>=p[0] && x<=p[1]); - // // } - // BasicBlock *Yes = BasicBlock::Create(Con, "R_Yes", Func); - // BasicBlock *Out = BasicBlock::Create(Con, "R_Out", Func); - // BasicBlock *Src = BasicBlock::Create(Con, "R_Src", Func); - // BasicBlock *Dst = BasicBlock::Create(Con, "R_Dst", Func); - // BasicBlock *Loop = BasicBlock::Create(Con, "R_Loop", Func); - // BasicBlock *ContLoop = BasicBlock::Create(Con, "R_ContLoop", Func); - // Value *Comp; - - // // Perform allocations at the beginning. - // Value *X = Irb.CreateAlloca(Int16Ty, nullptr, "x"); - // Value *P = Irb.CreateAlloca(Int16PtrTy, nullptr, "p"); - // Value *I = Irb.CreateAlloca(Int32Ty, nullptr, "i"); - // // p = ((ipfw_insn_u16 *)cmd)->ports; - // Value *CmdLBitC = Irb.CreateBitCast(Cmd, IpfwInsnU16PtrTy); - // Value *Ports = Irb.CreateStructGEP(CmdLBitC, 1); - // Value *PortsGEP = Irb.CreateStructGEP(Ports, 0); - // Irb.CreateStore(PortsGEP, P); - // // New p - // Value *PL = Irb.CreateLoad(P); - - // // (proto == IPPROTO_UDP || proto == IPPROTO_TCP) - // Value *ProtoL = Irb.CreateLoad(Proto); - // Value *Comp1 = Irb.CreateICmpEQ(ProtoL, ConstantInt::get(ProtoL->getType(), IPPROTO_TCP)); - // Value *Comp2 = Irb.CreateICmpEQ(ProtoL, ConstantInt::get(ProtoL->getType(), IPPROTO_UDP)); - // Value *OrComps = Irb.CreateOr(Comp1, Comp2); - - // // (Offset == 0) - // Value *OffsetL = Irb.CreateLoad(Offset); - // Value *Comp3 = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(OffsetL->getType(), 0)); - // // (OrComps && Comp3) - // Comp = Irb.CreateAnd(OrComps, Comp3); - // Irb.CreateCondBr(Comp, Yes, Out); - - // // yes: - // Irb.SetInsertPoint(Yes); - // // if (cmd->opcode == O_IP_SRCPORT) - // Value *CmdL = Irb.CreateLoad(Cmd); - // Value *OpcodePtr = Irb.CreateStructGEP(CmdL, 0); - // Value *Opcode = Irb.CreateLoad(OpcodePtr); - // Comp = Irb.CreateICmpEQ(Opcode, ConstantInt::get(Opcode->getType(), O_IP_SRCPORT)); - // Irb.CreateCondBr(Comp, Src, Dst); - - // Irb.SetInsertPoint(Src); - // // u_int16_t x = src_port; - // Value *SrcPortL = Irb.CreateLoad(SrcPort); - // Irb.CreateStore(SrcPortL, X); - // Irb.CreateBr(Loop); - - // Irb.SetInsertPoint(Dst); - // // u_int16_t x = dst_port; - // Value *DstPortL = Irb.CreateLoad(DstPort); - // Irb.CreateStore(DstPortL, X); - // Irb.CreateBr(Loop); - - // Irb.SetInsertPoint(Loop); - // // Loop initialisation - // // i = cmdlen - 1; - // // cmdlen: signed - // Value *CmdlenL = Irb.CreateLoad(Cmdlen); - // Value *Sub = Irb.CreateNSWSub(CmdlenL, ConstantInt::get(CmdlenL->getType(), 1)); - // Irb.CreateStore(Sub, I); - // Irb.CreateBr(ContLoop); - - // // Check condition - // Irb.SetInsertPoint(ContLoop); - // // while((!match) && (i>0)) { - // Value *IL = Irb.CreateLoad(I); - // Value *MatchL = Irb.CreateLoad(Match); - // Comp1 = Irb.CreateICmpEQ(MatchL, ConstantInt::get(MatchL->getType(), 0)); - // Comp2 = Irb.CreateICmpSGT(IL, ConstantInt::get(IL->getType(), 0)); - // Value *BreakCond = Irb.CreateAnd(Comp1, Comp2); - // Irb.CreateCondBr(BreakCond, ContLoop, Out); - - // // match = ((x >= p[0]) && (x <= p[1])); - // Value *PZ = Irb.CreateInBoundsGEP(PL, ConstantInt::get(Int32Ty, 0)); - // Value *PO = Irb.CreateInBoundsGEP(PL, ConstantInt::get(Int32Ty, 1)); - // Comp1 = Irb.CreateICmpUGE(X, PZ); - // Comp2 = Irb.CreateICmpULE(X, PO); - // Comp = Irb.CreateAnd(Comp1, Comp2); - // Value *Comp32 = Irb.CreateSExt(Comp, MatchL->getType()); - // Irb.CreateStore(Comp32, Match); - - // // Increment, decrement. - // // i--; - // Value *ILD = Irb.CreateNSWSub(IL, ConstantInt::get(IL->getType(), 1)); - // Irb.CreateStore(ILD, I); - // // p += 2; - // Value *PGEP = Irb.CreateInBoundsGEP(PL, ConstantInt::get(Int32Ty, 2)); - // Irb.CreateStore(PGEP, P); - // Irb.CreateBr(ContLoop); - - // Irb.SetInsertPoint(Out); } void @@ -1916,13 +1754,8 @@ void emit_accept() { - - // retval = 0; /* accept */ - Irb.CreateStore(ConstantInt::get(Int32Ty, IP_FW_PASS), Retval); - // l = 0; /* exit inner loop */ - Irb.CreateStore(ConstantInt::get(Int32Ty, 0), L); - // done = 1; /* exit outer loop */ - Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Done); + // rule_deny(&l, &done, &retval); + Irb.CreateCall(RuleAccept, {L, Done, Retval}); } void @@ -1986,12 +1819,8 @@ void emit_deny() { - // retval = IP_FW_DENY; - Irb.CreateStore(ConstantInt::get(Int32Ty, IP_FW_DENY), Retval); - // l = 0; /* exit inner loop */ - Irb.CreateStore(ConstantInt::get(Int32Ty, 0), L); - // done = 1; /* exit outer loop */ - Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Done); + // rule_deny(&l, &done, &retval); + Irb.CreateCall(RuleDeny, {L, Done, Retval}); } void @@ -2043,7 +1872,7 @@ compiler.emit_inner_for_prologue(); // Rule to test printf("Testing rule compilation\n"); - compiler.emit_ip_dst(); + compiler.emit_forward_mac(); printf("emit_inner_for_epilogue()\n"); compiler.emit_inner_for_epilogue(); printf("emit_outer_for_epilogue()\n");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409181430.s8IEUS7J081119>