summaryrefslogtreecommitdiffstats
path: root/src/examples/sample-plugin
AgeCommit message (Expand)AuthorFilesLines
2019-10-07docs: change VPP_WITH_SAMPLE_PLUGIN to SAMPLE_PLUGIN in sample plugin documen...Haggai Eran1-4/+4
2019-09-25api: split api generated filesOle Troan4-200/+9
2019-09-16api: autogenerate api trace print/endianOle Troan1-1/+1
2019-07-29misc: add vnet/pipeline.h exampleDave Barach1-1/+89
2019-07-09vat: unload unused vat pluginsDave Barach1-27/+11
2019-05-30sample-plugin: refactor .api to use explicit typesOle Troan1-8/+9
2018-11-14Remove c-11 memcpy checks from perf-critical codeDave Barach1-28/+28
2018-09-14cpack: add deb/rpm packaging to VPP moduleDamjan Marion2-0/+8
2018-09-12cmake: create cmake VPP module, update sample-plugin so it uses itDamjan Marion5-126/+32
2018-08-22Consolidate the [un]format_mac_address implementationsNeale Ranns1-7/+1
2018-08-01Store USE_DLMALLOC in vppinfra/config.hDamjan Marion2-4/+1
2018-07-26Improve the sample plugin node dispatch functionDave Barach1-128/+473
2018-07-20fix issue with missing sample_main in sample pluginDamjan Marion1-0/+2
2018-07-18Add config option to use dlmalloc instead of mheapDave Barach2-1/+14
2018-04-25Fix sample-plugin build with newer clang versionsDamjan Marion1-0/+20
2018-03-14Clean up vpp build bootstrap stepDave Barach1-3/+4
2018-01-23VPPAPIGEN: vppapigen replacement in Python PLY.Ole Troan2-5/+3
2017-10-24Add extern to *_main global variable declarations in header files.Dave Wallace1-1/+1
2017-10-09vppapigen: support per-file (major,minor,patch) version stampsDave Barach1-0/+2
2017-10-03Repair vlib API socket serverDave Barach2-2/+0
2017-08-23NAT: Rename snat plugin to nat (VPP-955)Matus Fabian1-1/+1
2017-06-09Sample plugin: Add sample plugin documentationRay Kinsella2-7/+89
2017-04-25"autoreply" flag: autogenerate standard xxx_reply_t messagesDave Barach1-9/+1
2017-04-20Extend ebuild to specify "configure" subdir, enable verify for sample-pluginDamjan Marion1-2/+0
2017-03-22vlib: add description field in plugin registrationDamjan Marion1-0/+1
2017-03-16API:replaced all REPLY_MACRO's with api_helper_macros.hEyal Bari1-23/+2
2017-03-04Fix duplicate binary API registration messages / bugsDave Barach1-2/+2
2017-02-22Support multiple plugin build in the sample-pluginAnlu Yan3-18/+52
2017-02-16Fix sample plugin breakage.Anlu Yan2-22/+9
2017-02-02Refactor fragile msg macro W and W2 to not burry return control flow.Jon Loeliger1-1/+3
2017-02-02Convert message macro S to accept a message pointer parameter;Jon Loeliger1-1/+1
2017-02-02Ensure all M() and M2() second parameters are the message pointer.Jon Loeliger1-1/+1
2017-01-28Add files to CLEANFILES for robust make clean.Burt Silverman1-0/+2
2017-01-25Repair plugin binary API message numberingDave Barach1-0/+2
2017-01-23binary-api debug CLI works with pluginsDave Barach1-36/+1
2017-01-17sample-plugin: fix buildDamjan Marion2-2/+2
2017-01-01Move java,lua api and remaining plugins to src/Damjan Marion9-0/+951
setUpClass(cls): super(Test6RD, cls).setUpClass() cls.create_pg_interfaces(range(4)) cls.interfaces = list(cls.pg_interfaces) @classmethod def tearDownClass(cls): super(Test6RD, cls).tearDownClass() def setUp(self): super(Test6RD, self).setUp() t4 = VppIpTable(self, 10) t6 = VppIpTable(self, 20, True) t4.add_vpp_config() t6.add_vpp_config() for n in range(4): i = self.pg_interfaces[n] i.admin_up() if n > 1: i.set_table_ip4(10) i.set_table_ip6(20) i.config_ip4() i.config_ip6() i.disable_ipv6_ra() i.resolve_arp() i.resolve_ndp() def tearDown(self): for i in self.pg_interfaces: i.unconfig_ip4() i.unconfig_ip6() i.set_table_ip4(0) i.set_table_ip6(0) i.admin_down() super(Test6RD, self).tearDown() def validate_6in4(self, rx, expected): if IP not in rx: self.fail() if IPv6 not in rx: self.fail() self.assertEqual(rx[IP].src, expected[IP].src) self.assertEqual(rx[IP].dst, expected[IP].dst) self.assertEqual(rx[IP].proto, expected[IP].proto) self.assertEqual(rx[IPv6].src, expected[IPv6].src) self.assertEqual(rx[IPv6].dst, expected[IPv6].dst) def validate_4in6(self, rx, expected): if IPv6 not in rx: self.fail() if IP in rx: self.fail() self.assertEqual(rx[IPv6].src, expected[IPv6].src) self.assertEqual(rx[IPv6].dst, expected[IPv6].dst) self.assertEqual(rx[IPv6].nh, expected[IPv6].nh) def payload(self, len): return "x" * len def test_6rd_ip6_to_ip4(self): """ip6 -> ip4 (encap) 6rd test""" p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) p_ip6 = IPv6(src="1::1", dst="2002:AC10:0202::1", nh="UDP") rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index self.vapi.cli("show ip6 fib") p_payload = UDP(sport=1234, dport=1234) p = p_ether / p_ip6 / p_payload p_reply = ( IP(src=self.pg0.local_ip4, dst=self.pg1.remote_ip4, proto="ipv6") / p_ip6 ) rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_6in4(p, p_reply) # MTU tests (default is 1480) plen = 1481 - 40 - 8 p_ip6 = IPv6(src="1::1", dst="2002:AC10:0202::1") p_payload = UDP(sport=1234, dport=1234) / Raw(self.payload(plen)) p = p_ether / p_ip6 / p_payload p_reply = ( IP(src=self.pg0.local_ip4, dst=self.pg1.remote_ip4, proto="ipv6") / p_ip6 ) rx = self.send_and_assert_no_replies(self.pg0, p * 10) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_ip6_to_ip4_vrf(self): """ip6 -> ip4 (encap) 6rd VRF test""" p_ether = Ether(src=self.pg2.remote_mac, dst=self.pg2.local_mac) p_ip6 = IPv6(src="1::1", dst="2002:AC10:0402::1", nh="UDP") rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=20, ip4_table_id=10, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg2.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index self.vapi.cli("show ip6 fib") p_payload = UDP(sport=1234, dport=1234) p = p_ether / p_ip6 / p_payload p_reply = ( IP(src=self.pg2.local_ip4, dst=self.pg3.remote_ip4, proto="ipv6") / p_ip6 ) rx = self.send_and_expect(self.pg2, p * 10, self.pg3) for p in rx: self.validate_6in4(p, p_reply) # MTU tests (default is 1480) plen = 1481 - 40 - 8 p_ip6 = IPv6(src="1::1", dst="2002:AC10:0402::1") p_payload = UDP(sport=1234, dport=1234) / Raw(self.payload(plen)) p = p_ether / p_ip6 / p_payload p_reply = ( IP(src=self.pg2.local_ip4, dst=self.pg3.remote_ip4, proto="ipv6") / p_ip6 ) rx = self.send_and_assert_no_replies(self.pg0, p * 10) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_ip4_to_ip6(self): """ip4 -> ip6 (decap) 6rd test""" rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index rv = self.vapi.ipip_6rd_del_tunnel(rv.sw_if_index) rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index p_ip6 = IPv6(src="2002:AC10:0202::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p = ( Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg1.remote_ip4, dst=self.pg0.local_ip4) / p_ip6 ) p_reply = p_ip6 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_reply) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_ip4_to_ip6_vrf(self): """ip4 -> ip6 (decap) 6rd VRF test""" rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=20, ip4_table_id=10, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg2.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index rv = self.vapi.ipip_6rd_del_tunnel(rv.sw_if_index) rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=20, ip4_table_id=10, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg2.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index self.vapi.sw_interface_set_table(self.tunnel_index, 1, 20) p_ip6 = IPv6(src="2002:AC10:0402::1", dst=self.pg3.remote_ip6) / UDP( sport=1234, dport=1234 ) p = ( Ether(src=self.pg2.remote_mac, dst=self.pg2.local_mac) / IP(src=self.pg3.remote_ip4, dst=self.pg2.local_ip4) / p_ip6 ) p_reply = p_ip6 rx = self.send_and_expect(self.pg2, p * 10, self.pg3) for p in rx: self.validate_4in6(p, p_reply) self.vapi.sw_interface_set_table(self.tunnel_index, 1, 0) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_ip4_to_ip6_multiple(self): """ip4 -> ip6 (decap) 6rd test""" self.tunnel_index = [] rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index.append(rv.sw_if_index) rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2003::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg1.local_ip4, security_check=True, ) self.tunnel_index.append(rv.sw_if_index) self.vapi.cli("show ip6 fib") p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) p_ip4 = IP(src=self.pg1.remote_ip4, dst=self.pg0.local_ip4) p_ip6_1 = IPv6(src="2002:AC10:0202::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p_ip6_2 = IPv6(src="2003:AC10:0202::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p = p_ether / p_ip4 / p_ip6_1 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_ip6_1) p = p_ether / p_ip4 / p_ip6_2 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_ip6_2) for i in self.tunnel_index: self.vapi.ipip_6rd_del_tunnel(i) def test_6rd_ip4_to_ip6_suffix(self): """ip4 -> ip6 (decap) 6rd test""" rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="172.0.0.0/8", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index self.vapi.cli("show ip6 fib") p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) p_ip4 = IP(src=self.pg1.remote_ip4, dst=self.pg0.local_ip4) p_ip6 = IPv6(src="2002:1002:0200::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p = p_ether / p_ip4 / p_ip6 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_ip6) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_ip4_to_ip6_sec_check(self): """ip4 -> ip6 (decap) security check 6rd test""" rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=True, ) self.tunnel_index = rv.sw_if_index self.vapi.cli("show ip6 fib") p_ip6 = IPv6(src="2002:AC10:0202::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p_ip6_fail = IPv6(src="2002:DEAD:0202::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p = ( Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg1.remote_ip4, dst=self.pg0.local_ip4) / p_ip6 ) p_reply = p_ip6 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_reply) p = ( Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg1.remote_ip4, dst=self.pg0.local_ip4) / p_ip6_fail ) rx = self.send_and_assert_no_replies(self.pg0, p * 10) self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) def test_6rd_bgp_tunnel(self): """6rd BGP tunnel""" rv = self.vapi.ipip_6rd_add_tunnel( ip6_table_id=0, ip4_table_id=0, ip6_prefix="2002::/16", ip4_prefix="0.0.0.0/0", ip4_src=self.pg0.local_ip4, security_check=False, ) self.tunnel_index = rv.sw_if_index default_route = VppIpRoute( self, "DEAD::", 16, [VppRoutePath("2002:0808:0808::", self.tunnel_index)] ) default_route.add_vpp_config() ip4_route = VppIpRoute( self, "8.0.0.0", 8, [VppRoutePath(self.pg1.remote_ip4, 0xFFFFFFFF)] ) ip4_route.add_vpp_config() # Via recursive route 6 -> 4 p = ( Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IPv6(src="1::1", dst="DEAD:BEEF::1") / UDP(sport=1234, dport=1234) ) p_reply = IP(src=self.pg0.local_ip4, dst="8.8.8.8", proto="ipv6") / IPv6( src="1::1", dst="DEAD:BEEF::1", nh="UDP" ) rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_6in4(p, p_reply) # Via recursive route 4 -> 6 (Security check must be disabled) p_ip6 = IPv6(src="DEAD:BEEF::1", dst=self.pg1.remote_ip6) / UDP( sport=1234, dport=1234 ) p = ( Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="8.8.8.8", dst=self.pg0.local_ip4) / p_ip6 ) p_reply = p_ip6 rx = self.send_and_expect(self.pg0, p * 10, self.pg1) for p in rx: self.validate_4in6(p, p_reply) ip4_route.remove_vpp_config() default_route.remove_vpp_config() self.vapi.ipip_6rd_del_tunnel(self.tunnel_index) if __name__ == "__main__": unittest.main(testRunner=VppTestRunner)