From owner-svn-soc-all@FreeBSD.ORG Thu Sep 11 10:15:16 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id BF8CB6E1 for ; Thu, 11 Sep 2014 10:15:16 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A98CFD5B for ; Thu, 11 Sep 2014 10:15:16 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id s8BAFGsx094555 for ; Thu, 11 Sep 2014 10:15:16 GMT (envelope-from dpl@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id s8BAFGDo094551 for svn-soc-all@FreeBSD.org; Thu, 11 Sep 2014 10:15:16 GMT (envelope-from dpl@FreeBSD.org) Date: Thu, 11 Sep 2014 10:15:16 GMT Message-Id: <201409111015.s8BAFGDo094551@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to dpl@FreeBSD.org using -f From: dpl@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r273962 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Sep 2014 10:15:16 -0000 Author: dpl Date: Thu Sep 11 10:15:15 2014 New Revision: 273962 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=273962 Log: Added a test function to test the compilation of rules, corrected errors, and added the _frag, _in, and _layer2 functions, whose compilation is already tested. Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc ============================================================================== --- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Thu Sep 11 10:13:18 2014 (r273961) +++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Thu Sep 11 10:15:15 2014 (r273962) @@ -81,6 +81,7 @@ // Loop control. Value *Match; Value *L; + Value *M; Value *Done; Value *FPos; Value *Retval; @@ -228,22 +229,41 @@ // Get StrucType from bitcode. MbufTy = mod->getTypeByName("struct.mbuf"); + if (MbufTy == NULL) + err(1, "bitcode fault: struct.mbuf"); IfnetTy = mod->getTypeByName("struct.ifnet"); + if (IfnetTy == NULL) + err(1, "bitcode fault: struct.ifnet"); In_addrTy = mod->getTypeByName("struct.in_addr"); + if (In_addrTy == NULL) + err(1, "bitcode fault: struct.in_addr"); IpTy = mod->getTypeByName("struct.ip"); + if (IpTy == NULL) + err(1, "bitcode fault: struct.ip"); Ip_fw_argsTy = mod->getTypeByName("struct.ip_fw_args"); + if (Ip_fw_argsTy == NULL) + err(1, "bitcode fault: struct.ip_fw_args"); Ip_fw_chainTy = mod->getTypeByName("struct.ip_fw_chain"); + if (Ip_fw_chainTy == NULL) + err(1, "bitcode fault: struct.ip_fw_chain"); Ip_fwTy = mod->getTypeByName("struct.ip_fw"); + if (Ip_fwTy == NULL) + err(1, "bitcode fault: struct.ip_fw"); Ipfw_insnTy = mod->getTypeByName("struct._ipfw_insn"); + if (Ipfw_insnTy == NULL) + err(1, "bitcode fault: struct._ipfw_insn"); IpfwInsnU16Ty = mod->getTypeByName("struct._ipfw_insn_u16"); + if (IpfwInsnU16Ty == NULL) + err(1, "bitcode fault: struct._ipfw_insn_u16"); IpfwInsnIpTy = mod->getTypeByName("struct._ipfw_insn_ip"); + if (IpfwInsnIpTy == NULL) + err(1, "bitcode fault: struct._ipfw_insn_ip"); Ipfw_insn_ifTy = mod->getTypeByName("struct._ipfw_insn_if"); + if (Ipfw_insn_ifTy == NULL) + err(1, "bitcode fault: struct._ipfw_insn_if"); Ipfw_dyn_ruleTy = mod->getTypeByName("struct._ipfw_dyn_rule"); -#ifdef __FreeBSD__ - UcredTy = mod->getTypeByName("struct.ucred"); -#else - UcredTy = mod->getTypeByName("struct.bsd_ucred"); -#endif /* __FreeBSD__ */ + if (Ipfw_dyn_ruleTy == NULL) + err(1, "bitcode fault: struct._ipfw_dyn_rule"); // Create Pointer to StructType types. MbufPtrTy = PointerType::getUnqual(MbufTy); @@ -258,35 +278,69 @@ IpfwInsnIpPtrTy = PointerType::getUnqual(IpfwInsnIpTy); Ipfw_insn_ifPtrTy = PointerType::getUnqual(Ipfw_insn_ifTy); Ipfw_dyn_rulePtrTy = PointerType::getUnqual(Ipfw_dyn_ruleTy); -#ifdef __FreeBSD__ - UcredPtrTy = PointerType::getUnqual(UcredTy); -#endif + // Get Function defs from bitcode. // All of them are auxiliary functions. InspectPkt = mod->getFunction("inspect_pkt"); + if (InspectPkt == NULL) + err(1, "bitcode fault: inspect_pkt"); IsIcmpQuery = mod->getFunction("is_icmp_query"); + if (IsIcmpQuery == NULL) + err(1, "bitcode fault: is_icmp_query"); FlagsMatch = mod->getFunction("flags_match"); + if (FlagsMatch == NULL) + err(1, "bitcode fault: flags_match"); IpoptsMatch = mod->getFunction("ipopts_match"); + if (IpoptsMatch == NULL) + err(1, "bitcode fault: ipopts_match"); TcpoptsMatch = mod->getFunction("tcpopts_match"); - IfaceMatch = mod->getFunction("ifaceMatch"); + if (TcpoptsMatch == NULL) + err(1, "bitcode fault: tcpopts_match"); + IfaceMatch = mod->getFunction("iface_match"); + if (IfaceMatch == NULL) + err(1, "bitcode fault: iface_match"); VerifyPath = mod->getFunction("verify_path"); + if (VerifyPath == NULL) + err(1, "bitcode fault: verify_path"); #ifdef INET6 Icmp6typeMatch = mod->getFunction("icmp6type_match"); + if (Icmp6typeMatch == NULL) + err(1, "bitcode fault: icmp6type_match"); SearchIp6AddrNet = mod->getFunction("search_ip6_addr_net"); + if (SearchIp6AddrNet == NULL) + err(1, "bitcode fault: search_ip6_addr_net"); Flow6idMatch = mod->getFunction("flow6id_match"); + if (Flow6idMatch == NULL) + err(1, "bitcode fault: flow6id_match"); VerifyPath6 = mod->getFunction("verify_path6"); + if (VerifyPath6 == NULL) + err(1, "bitcode fault: verify_path6"); IsIcmp6Query = mod->getFunction("is_icmp6_query"); + if (IsIcmp6Query == NULL) + err(1, "bitcode fault: is_icmp6_query"); SendReject6 = mod->getFunction("send_reject6"); + if (SendReject6 == NULL) + err(1, "bitcode fault: send_reject6"); #endif /* INET6 */ SendReject = mod->getFunction("send_reject"); + if (SendReject == NULL) + err(1, "bitcode fault: send_reject"); SetMatch = mod->getFunction("set_match"); + if (SetMatch == NULL) + err(1, "bitcode fault: set_match"); JumpFast = mod->getFunction("jump_fast"); + if (JumpFast == NULL) + err(1, "bitcode fault: jump_fast"); // Functions declared at bitcode. PrintfFunc = mod->getFunction("printf"); + if (PrintfFunc == NULL) + err(1, "bitcode fault: printf"); IpfwFindRule = mod->getFunction("ipfw_find_rule"); + if (IpfwFindRule == NULL) + err(1, "bitcode fault: ipfw_find_rule"); } // Allocate and initialize LLVM vars. @@ -310,7 +364,7 @@ // m = args->m (idx: 0) MPtr = Irb.CreateAlloca(MbufPtrTy, nullptr, "m"); Irb.CreateStore(Irb.CreateLoad(Irb.CreateStructGEP(Args, 0)), MPtr); - Value *M = Irb.CreateLoad(MPtr); + M = Irb.CreateLoad(MPtr); // ip = (struct ip *)((m)->m_data) (idx: 2) IpPtr = Irb.CreateAlloca(IpPtrTy, nullptr, "ip"); @@ -475,11 +529,6 @@ Value *Slot = Irb.CreateStructGEP(Rule, 0); Value *SlotValue = Irb.CreateLoad(Slot); Comp = Irb.CreateICmpEQ(SlotValue, ConstantInt::get(Int32Ty, 0)); - // if (1) { - // Value *Str = Irb.CreateGlobalString("args->rule.slot: %d\n"); - // Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); - // Irb.CreateCall(PrintfFunc, {StrFirstElement}); - // } Irb.CreateCondBr(Comp, Nottagged, Tagged); Irb.SetInsertPoint(Tagged); @@ -512,13 +561,6 @@ // else f_pos = 0; // Since f_pos is initialized by default as 0, we only br. Irb.SetInsertPoint(Nottagged); - // XXX Fpos - // if (1) { - // Value *Str = Irb.CreateGlobalString("f_pos: %d\n&fpos: %p\n"); - // Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); - // Irb.CreateCall(PrintfFunc, {StrFirstElement, FPos, FPos}); - // } - // Jump to first rule. Irb.CreateBr(rules.front()); } @@ -529,7 +571,11 @@ mod = loadBitcode("rules.bc"); Func = mod->getFunction("ipfw_chk_jit"); + if (Func == NULL) + err(1, "bitcode fault: ipfw_chk_jit"); + Func->setLinkage(GlobalValue::ExternalLinkage); + // Create static BasicBlocks. // The entry basic block contains all the initialization // and allocation of resources, and a basic check done @@ -593,8 +639,6 @@ exit(1); } - // mod->dump(); - // XXX We should use a NON deperecated function. return (funcptr)EE->getPointerToFunction(mod->getFunction("ipfw_chk_jit")); } @@ -937,30 +981,30 @@ // Rules - // XXX Not tested. + // XXX Exec not tested. void emit_nop() { Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Match); } - // XXX Not tested. + // XXX Exec not tested. void - emit_forward_mac(u_int8_t opcode) + emit_forward_mac() { printf("Compilation error:\n"); - printf("ipfwjitter: opcode %d unimplemented\n", opcode); + printf("ipfwjitter: MAC forwarding unimplemented\n"); printf("Compilation continues.\n"); } - // XXX Not tested. + // XXX Exec not tested. void emit_jail() { - BasicBlock *OffsetNZ = BasicBlock::Create(Con, "offsetnotzero", Func); - BasicBlock *OffsetZE = BasicBlock::Create(Con, "offsetiszero", Func); - BasicBlock *TCPorUDP = BasicBlock::Create(Con, "setmatchzero", Func); - BasicBlock *Continue = BasicBlock::Create(Con, "Continue", Func); + BasicBlock *OffsetNZ = BasicBlock::Create(Con, "R_offsetnotzero", Func); + BasicBlock *OffsetZE = BasicBlock::Create(Con, "R_offsetiszero", Func); + BasicBlock *TCPorUDP = BasicBlock::Create(Con, "R_setmatchzero", Func); + BasicBlock *Continue = BasicBlock::Create(Con, "R_Continue", Func); Value *Comp; // if (offset != 0) @@ -984,8 +1028,8 @@ // *match = 0; Irb.SetInsertPoint(OffsetZE); Value *ProtoL = Irb.CreateLoad(Proto); - Comp = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(Int8Ty, IPPROTO_TCP)); - Value *Comp2 = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(Int8Ty, IPPROTO_UDP)); + Comp = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(OffsetL->getType(), IPPROTO_TCP)); + Value *Comp2 = Irb.CreateICmpEQ(OffsetL, ConstantInt::get(OffsetL->getType(), IPPROTO_UDP)); Irb.CreateCondBr(Comp, TCPorUDP, Continue); Irb.CreateCondBr(Comp2, TCPorUDP, Continue); @@ -997,87 +1041,120 @@ Irb.SetInsertPoint(Continue); } - // XXX Not tested. + // XXX Exec not tested. void emit_recv() { //*match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd, chain, tablearg); - Value *rcvif = Irb.CreateStructGEP(Irb.CreateStructGEP(Irb.CreateLoad(MPtr), 5), 0); - Value *cmdc = Irb.CreateBitCast(Cmd, Ipfw_insn_ifPtrTy); - Value *IfaceMatchCall = Irb.CreateCall4(IfaceMatch, rcvif, cmdc, Chain, Tablearg); + Value *MPkthdr = Irb.CreateStructGEP(M, 5); + Value *Rcvif = Irb.CreateStructGEP(MPkthdr, 0); + Value *RcvifL = Irb.CreateLoad(Rcvif); + 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); } - // XXX Not tested. + // XXX Exec not tested. void emit_xmit() { //*match = iface_match(oif, (ipfw_insn_if *)cmd, chain, tablearg); - Value *Cmdc = Irb.CreateBitCast(Cmd, Ipfw_insn_ifPtrTy); + 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); } - // XXX Not tested. + // XXX Exec not tested. void emit_via() { - BasicBlock *OifNZ = BasicBlock::Create(Con, "OifNotZero", Func); - BasicBlock *OifZE = BasicBlock::Create(Con, "OifIsZero", Func); + 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); - // break; - //Value *Comp = Irb.CreateICmp(Oif, ConstantPointerNull::get(IfnetPtrTy)); + 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); } - // XXX Not tested. void emit_macaddr2() { } - // XXX Not tested. void emit_mac_type() { } - // XXX Not tested. + + // XXX Exec not tested. void emit_frag() { + // match = (offset != 0); + 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); } - // XXX Not tested. + // 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); } - // XXX Not tested. + // 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); } - // XXX Not tested. void emit_diverted() { } - // XXX Not tested. void emit_proto() { } - // XXX Not tested. + // XXX Exec not tested. void emit_ip_src() { @@ -1086,69 +1163,65 @@ // src_ip.s_addr); // ((ipfw_insn_ip *)cmd)->addr.s_addr - // addr only has one element (s_adddr) we only need one GEP. - Value *CmdL = Irb.CreateLoad(Cmd); - Value *CmdLBitC = Irb.CreateBitCast(CmdL, IpfwInsnIpPtrTy); - Value *CmdSAddr = Irb.CreateStructGEP(CmdLBitC, 1); + 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(SrcIpL, 0); - Value *Comp = Irb.CreateICmpEQ(CmdSAddrL, SrcAddr); - - Value *NewMatch = Irb.CreateAnd(Comp, IsIpv4); + //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); + + Value *IsIpv4L = Irb.CreateLoad(IsIpv4); + Value *Comp32 = Irb.CreateZExt(Comp, IsIpv4L->getType()); + Value *NewMatch = Irb.CreateAnd(Comp32, IsIpv4L); + Irb.CreateStore(NewMatch, Match); } - // XXX Not tested. void emit_ip_dst_lookup() { } - // XXX Not tested. void emit_ip_dst_mask() { } - // XXX Not tested. void emit_ip_src_me() { } - // XXX Not tested. void emit_ip6_src_me() { } - // XXX Not tested. void emit_ip_src_set() { } - // XXX Not tested. void emit_ip_dst() { } - // XXX Not tested. void emit_ip_dst_me() { } - // XXX Not tested. void emit_ip6_dst_me() { } - // XXX Not tested. + // XXX Exec not tested. void emit_ip_dstport() { @@ -1183,19 +1256,22 @@ Value *P = Irb.CreateAlloca(Int16PtrTy, nullptr, "p"); Value *I = Irb.CreateAlloca(Int32Ty, nullptr, "i"); // p = ((ipfw_insn_u16 *)cmd)->ports; - // XXX TODO Ensure correctness. Value *CmdLBitC = Irb.CreateBitCast(Cmd, IpfwInsnU16PtrTy); Value *Ports = Irb.CreateStructGEP(CmdLBitC, 1); - Irb.CreateStore(Ports, P); + Value *PortsGEP = Irb.CreateStructGEP(Ports, 0); + Irb.CreateStore(PortsGEP, P); + // New p Value *PL = Irb.CreateLoad(P); // (proto == IPPROTO_UDP || proto == IPPROTO_TCP) - Value *Comp1 = Irb.CreateICmpEQ(Proto, ConstantInt::get(Proto->getType(), IPPROTO_TCP)); - Value *Comp2 = Irb.CreateICmpEQ(Proto, ConstantInt::get(Proto->getType(), IPPROTO_UDP)); + 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 *Comp3 = Irb.CreateICmpEQ(Offset, ConstantInt::get(Offset->getType(), 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); @@ -1208,22 +1284,25 @@ 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; - Irb.CreateStore(SrcPort, X); + Value *SrcPortL = Irb.CreateLoad(SrcPort); + Irb.CreateStore(SrcPortL, X); Irb.CreateBr(Loop); Irb.SetInsertPoint(Dst); // u_int16_t x = dst_port; - Irb.CreateStore(DstPort, X); + Value *DstPortL = Irb.CreateLoad(DstPort); + Irb.CreateStore(DstPortL, X); Irb.CreateBr(Loop); Irb.SetInsertPoint(Loop); // Loop initialisation // i = cmdlen - 1; // cmdlen: signed - Value *Sub = Irb.CreateNSWSub(CmdLen, ConstantInt::get(CmdLen->getType(), 1)); + Value *CmdLenL = Irb.CreateLoad(CmdLen); + Value *Sub = Irb.CreateNSWSub(CmdLenL, ConstantInt::get(CmdLenL->getType(), 1)); Irb.CreateStore(Sub, I); Irb.CreateBr(ContLoop); @@ -1232,23 +1311,24 @@ // while((!match) && (i>0)) { Value *IL = Irb.CreateLoad(I); Value *MatchL = Irb.CreateLoad(Match); - Comp1 = Irb.CreateICmpEQ(MatchL, ConstantInt::get(Match->getType(), 0)); - Comp2 = Irb.CreateICmpSGT(IL, ConstantInt::get(I->getType(), 0)); + 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.CreateStructGEP(PL, 0); - Value *PO = Irb.CreateStructGEP(PL, 1); + // FIXME + 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, Match->getType()); + Value *Comp32 = Irb.CreateSExt(Comp, MatchL->getType()); Irb.CreateStore(Comp32, Match); // Increment, decrement. // i--; - Value *ILD = Irb.CreateNSWSub(IL, ConstantInt::get(I->getType(), 1)); + 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)); @@ -1258,199 +1338,166 @@ Irb.SetInsertPoint(Out); } - // XXX Not tested. void emit_icmptype() { } - // XXX Not tested. void emit_icmp6type() { } - // XXX Not tested. void emit_ipopt() { } - // XXX Not tested. void emit_ipver() { } - // XXX Not tested. void emit_ipttl() { } - // XXX Not tested. void emit_ipprecedence() { } - // XXX Not tested. void emit_iptos() { } - // XXX Not tested. void emit_dscp() { } - // XXX Not tested. void emit_tcpdatalen() { } - // XXX Not tested. void emit_tcpflags() { } - // XXX Not tested. void emit_tcpopts() { } - // XXX Not tested. void emit_tcpseq() { } - // XXX Not tested. void emit_tcpack() { } - // XXX Not tested. void emit_tcpwin() { } - // XXX Not tested. void emit_estab() { } - // XXX Not tested. void emit_altq() { } - // XXX Not tested. void emit_log() { } - // XXX Not tested. void emit_prob() { } - // XXX Not tested. void emit_verrevpath() { } - // XXX Not tested. void emit_versrcreach() { } - // XXX Not tested. void emit_antispoof() { } - // XXX Not tested. void emit_ipsec() { } - // XXX Not tested. void emit_ip6_src() { } - // XXX Not tested. void emit_ip6_dst() { } - // XXX Not tested. void emit_ip6_dst_mask() { } - // XXX Not tested. void emit_flow6id() { } - // XXX Not tested. void emit_ext_hdr() { } - // XXX Not tested. void emit_ip6() { } - // XXX Not tested. void emit_ip4() { } - // XXX Not tested. void emit_tag() { } - // XXX Not tested. void emit_fib() { } - // XXX Not tested. void emit_sockarg() { } - // XXX Not tested. void emit_tagged() { @@ -1498,13 +1545,11 @@ * l=0, cmdlen=0. */ - // XXX Not tested. void emit_keep_state() { } - // XXX Not tested. void emit_check_state() { @@ -1522,49 +1567,64 @@ Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Done); } - // XXX Not tested. void emit_queue() { } - // XXX Not tested. void emit_tee() { } - // XXX Not tested. void emit_count() { } - // XXX Not tested. + // TODO void emit_skipto() { + // IPFW_INC_RULE_COUNTER(f, pktlen); + // f_pos = jump_fast(chain, f, cmd->arg1, tablearg, 0); + // /* + // * Skip disabled rules, and re-enter + // * the inner loop with the correct + // * f_pos, f, l and cmd. + // * Also clear cmdlen and skip_or + // */ + // for (; f_pos < chain->n_rules - 1 && + // (V_set_disable & + // (1 << chain->map[f_pos]->set)); + // f_pos++) + // ; + // /* Re-enter the inner loop at the skipto rule. */ + // f = chain->map[f_pos]; + // l = f->cmd_len; + // cmd = f->cmd; + // match = 1; + // cmdlen = 0; + // skip_or = 0; + // continue; } - // XXX Not tested. void emit_callreturn() { } - // XXX Not tested. void emit_reject() { } - // XXX Not tested. void emit_unreach6() { } - // XXX Not tested. + // XXX Exec not tested. void emit_deny() { @@ -1576,49 +1636,66 @@ Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Done); } - // XXX Not tested. void emit_forward_ip() { } - // XXX Not tested. void emit_forward_ip6() { } - // XXX Not tested. void emit_ngtee() { } - // XXX Not tested. void emit_setfib() { } - // XXX Not tested. void emit_setdscp() { } - // XXX Not tested. void emit_nat() { } - // XXX Not tested. void emit_reass() { } }; +// Function to test compilation code. +// Filtering code has to be tested by real usage. +void +test_compilation() +{ + printf("Creating object\n"); + ipfwJIT compiler(1); + printf("emit_outer_for_prologue()\n"); + compiler.emit_outer_for_prologue(); + printf("emit_inner_for_prologue()\n"); + compiler.emit_inner_for_prologue(); + // Rule to test + printf("testing rule\n"); + compiler.emit_layer2(); + printf("emit_inner_for_epilogue()\n"); + compiler.emit_inner_for_epilogue(); + printf("emit_outer_for_epilogue()\n"); + compiler.emit_outer_for_epilogue(); + compiler.end_rule(); + printf("emit_end()\n"); + compiler.emit_end(); + err(1, "Compilation"); +} + extern "C" funcptr compile_code(struct ip_fw_args *args, struct ip_fw_chain *chain) { @@ -1628,6 +1705,8 @@ if (chain->n_rules == 0) return (NULL); + // test_compilation(); + ipfwJIT compiler(chain->n_rules); // Iterate through the rules. @@ -1656,8 +1735,9 @@ compiler.emit_nop(); break; + // XXX Not implemented in netmap-ipfw case O_FORWARD_MAC: - compiler.emit_forward_mac(cmd->opcode); + compiler.emit_forward_mac(); break; case O_GID: