summaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2019-07-29session: fix vpp to app msg generationFlorin Coras3-68/+32
Type:fix Freeing mq messages in vpp (producer), if enqueueing fails, invalidates consumer assumption that messages can be freed without a lock. Change-Id: I748a33b8846597bdad865945d8e899346d482434 Signed-off-by: Florin Coras <fcoras@cisco.com> Signed-off-by: Tal Saiag <tal.saiag@gmail.com>
2019-07-29vcl: fix config parsing of hex valuesFlorin Coras1-24/+23
Type:fix Change-Id: I31f35dd86fb6efb04d4a449f7fc834296baaa043 Signed-off-by: Tal Saiag <tal.saiag@gmail.com> Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-29api acl: breakout acl_types.api for reuse by othersPaul Vinciguerra2-79/+101
Type: refactor Change-Id: I40518ccddcb78e58f7e6a098c27d9ec53e5a1146 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-07-28fib: add invalid source type and fix debug logBenoît Ganne3-19/+22
Add the FIB_SOURCE_INVALID fib source type. This allows to spot uninitialized fib source more easily (0 no longer means special) and we can use it as placeholder when no source is present. Use it to fix FIB_ENTRY_DBG() which was accessing the 1st source, even when no sources were present. Type: fix Fixes: 710071bf0e Change-Id: I980b6a6a07616d4a8d6f2db166a1dd335721c74d Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-07-28api: add vl_api_version_t typePaul Vinciguerra5-0/+47
Type: feature Depends-on: https://gerrit.fd.io/r/20484 Change-Id: Ifc8d7e00d7254db40856a088fdd352d9773f71d5 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-07-28build: add option to wipe/rebuild papiPaul Vinciguerra2-0/+9
Previously, the only option was to wipe/rebuild all the test dependencies. Type: make Change-Id: Ia95d6e800f67bef033dcf614dbfa249c3e43159d Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-07-28pg: add GSO supportMohsin Kazmi11-17/+319
Type: feature Change-Id: I72676495a85fbecc946aa266a75234cce70c3a5e Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
2019-07-28sr: ipv6 segment routing header (srh) updateAhmed Abdelsalam5-1584/+21
SRH has passed WG review in IETF and currently an IESG document. This patch updates the SRH definition to be compliant with IETF. - Change "first_segment" to "last_entry" - Change "reserved" to "tag" Change-Id: I1765c968671655c5646f6de478d1f7196abbc040 Type: fix Signed-off-by: Ahmed Abdelsalam <ahabdels@cisco.com>
2019-07-28sr: fix srv6 end.t behaviorAhmed Abdelsalam1-1/+2
Update the sr_localsid code to set the DPO for SRv6 End.T behavior. Change-Id: I17e102a419eb2b4fdd1de7a672b109e4ff7e1dc2 Type: fix Signed-off-by: Ahmed Abdelsalam <ahabdels@cisco.com>
2019-07-27session: define connection id lengthFlorin Coras2-7/+15
Type:feature To be used by transports overwriting the connection id. Change-Id: Ia5dbd9dccc2e3eb62e602514b24882ddc12ff1f2 Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-26session: separate ctrl, new and old eventsFlorin Coras4-89/+126
Type: feature Change-Id: I5e030b23943c012d8191ff657165055d33ec87a2 Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-26tcp: count resets sentFlorin Coras2-0/+7
Type:feature Change-Id: Ie1ab4b24af9c654d5e0ed94b7fa96ca195b01c56 Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-26quic: coverity fixesNathan Skrzypczak2-9/+30
Type: fix Change-Id: I93c083ee78168ed2da283fe4873ca022766fe861 Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
2019-07-26libmemif: fix autoconnectJakub Grajciar1-4/+4
Type: fix Change-Id: I426e210c47869904a01712b765db2356439f706f Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
2019-07-26docs: add binary api trace replay detailsDave Barach1-7/+81
Folks need to know that they MUST carefully control the set of plugins to avoid feeding messages to the wrong binary API message handlers. Change-Id: Iefeeda6670aae4627446caee21717b847305c9b5 Signed-off-by: Dave Barach <dave@barachs.net>
2019-07-26session tcp: handle rxt and acks as custom eventsFlorin Coras13-185/+212
Type: feature Control ack generation and retransmissions with session layer scheduler. Change-Id: Iacdf9f84ab81f44851980aa45a83e75f29be2b7b Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-26dhcp ip: DSCP settings for transmitted DHCP packetsNeale Ranns22-46/+356
Type: feature - Define the ip_dscp_t and use in the IP headers - Add DSCP setting to the DHCP client for use with packet TX Change-Id: If220dde0017ea78793747d65f53e11daf23a28fa Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-26dpdk: fix vlan strippingNeale Ranns1-11/+15
Type: fix Fixes: ce3e971 Change-Id: I30bbeced2f5ae7613e65546f2b9b41e2fb514208 Signed-off-by: Damjan Marion <damarion@cisco.com>
2019-07-26dhcp: send unicast and broadcast packets via the IP adjacencyNeale Ranns6-56/+122
Type: feature this means DHCP packets are subject to the IP features configured on the interface - the unicast packets already were sent throught the adj - added UT for DHCP client sending a unicast renewal Change-Id: Id50db0b71822f44bf7cb639a524195cdc9873526 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-25misc: remove unnecessary cast in classifyZhiyong Yang2-24/+14
Type: style Change-Id: I7628f7fba8250afe41f115595cca4129e43350d3 Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
2019-07-25misc: 19.04.2 Release NotesDave Wallace1-0/+9
Type: docs Change-Id: I1ee3909e042e56fd4caf3732762e9a9276aa6db1 Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
2019-07-25build: vppapigen search VPP_INCLUDE_DIR if setBenoît Ganne1-2/+8
When building out-of-tree plugins, we must search for .api in VPP installed include directory. Type: fix Change-Id: I76b7bace69ff54a385d944313879e2aeb7293648 Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-07-25build: package .api files in vpp-devBenoît Ganne1-1/+1
Type: fix Change-Id: I035ff638d346109e1b3b5e5a8cdd36d650c45e5e Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-07-25session: add transport deleted stateFlorin Coras4-11/+14
Type: fix Distinguish between closed and deleted states to avoid deleting the session prior to the transport connection. Change-Id: Ia285ce94b26a70773f8c0ce9d2c73095d3e2a337 Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-25vppinfra: fix coverity warning in mpcap.cDave Barach1-5/+14
Type: fix Ticket: VPP-1649 Change-Id: Ief77ec8d5f06bfcc63af6454c4cd9979cf0ab49d Signed-off-by: Dave Barach <dave@barachs.net>
2019-07-25build: add missing .api files for packagingBenoît Ganne1-1/+8
Type: fix Change-Id: Ic43fb0826907e3f3b42a78bfbd9a807cdbf1e8f9 Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-07-25vom: QoS supportNeale Ranns18-0/+2211
Type: feature Change-Id: If517d10c318fc17fdbd797fac8d974d9851f6442 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-25misc: leverage vlib_buffer_get_current in srpZhiyong Yang1-1/+1
Type: style Change-Id: I6c57ab3e71c693de5ecfbdfee118d521a8c9a4c2 Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
2019-07-25memif: Fix uninitialized variable as reported by coveritySteven Luong1-1/+2
When mode == ip, the variable next_index is not initialized. Although insde the while loop, ni will be fixed to contain next[0], it is easier to initialize it. Type: fix Change-Id: I6653a958bbc5105e7266bf89e3c8569ff00f0199 Signed-off-by: Steven Luong <sluong@cisco.com>
2019-07-25bonding: incorrect RX counters for bond interfaceSteven Luong2-44/+36
show interface does not display the RX counters for the bond interfaces. It displays rx-no-buf instead. The problem is VNET_INTERFACE_COUNTER_RX is a combined counter, not a simple counter. Change the code to use vlib_increment_combined_counter passing it with n_rx_packets and n_rx_bytes. Type: fix Change-Id: I8121ad7e546447049fa13da62481b6c8f5575bec Signed-off-by: Steven Luong <sluong@cisco.com>
2019-07-25libmemif: fix chained buffer flagJakub Grajciar1-0/+1
fixes issue: MEMIF_DESC_FLAG_NEXT persisted when enqueueing stored buffers Type: fix Change-Id: I9e973ed6e0339612fe1dd3e3bd80ed7c05093791 Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
2019-07-24acl: implement countersAndrew Yourtchenko6-14/+218
implement per-acl-number counters in the stats segment. They are created during the ACL creation, the counters are incremented in the dataplane using the new inline function with the extra parameter being the packet size. Counting in shared segment adds a noticeable overhead, so add also an API to turn the counters on. Type: feature Change-Id: I8af7b0c31a3d986b68089eb52452aed45df66c7b Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
2019-07-24tests: add cpu/shm info to test runner outputPaul Vinciguerra1-1/+13
Type: test Depends-on: https://gerrit.fd.io/r/#/c/20484/ Change-Id: I140132cfcc4347035fe2bb9919f8e7923342940f Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-07-24qos: QoS dump APIsNeale Ranns14-269/+774
Type: feature Change-Id: I514b40026986f3828c8727453456b20a0a45f3af Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-24api: Disable tracing of memclnt_keepalive messagesDave Barach1-6/+11
A waste of binary API trace space; an otherwise idle control-plane will eventually fill the api trace buffer with them. Type: fix Ticket: VPP-1725 Change-Id: Id8338ea4070cd76481595005986efc558f0694e6 Signed-off-by: Dave Barach <dave@barachs.net> (cherry picked from commit 996a757ff93233379bf0a464dce6d99f5d622ca4)
2019-07-24fib: Support the POP of a Psuedo Wire Control WordNeale Ranns13-44/+521
Type: feature Change-Id: Ib24547a7c4c73ceb5383d1ca8f14ec40e6a90f01 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-24dpdk: Prefetch correct size of rte_mbufNitin Saxena1-1/+1
sizeof(rte_mbuf) is 128 byte but 2* CLIB_CACHE_LINE_BYTES is 256 byte for ThunderX/OCTEONTx targets. Type: fix Change-Id: If6893b168cf1c55c44bf4669a888ce858f2ef487 Signed-off-by: Nitin Saxena <nsaxena@marvell.com>
2019-07-24vapi: add python scripts to vpp-dev packageVratko Polak3-9/+35
As requested in https://lists.fd.io/g/vpp-api-dev/message/18 three vapi scrips are packaged, destination to share/vpp/. Also: + Add "vapi" as a separate component to maintainers file. + Add also vppapigen/generate_json.py to share/vpp/. + Improve CMakeLists.txt indentation. Type: feature Change-Id: Ia06715621aa344e8ee759410b293509a54f81fdd Signed-off-by: Vratko Polak <vrpolak@cisco.com>
2019-07-24papi: add additional types to vpp_serializerPaul Vinciguerra1-0/+3
vppapigen supports additional types not handled by the papi seializer. This adds the types for the sake of parity. Change-Id: Id8efad7f169b5023879935575ace2cc3e9c291d4 Type: feature Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-07-24memif: fix vector overflow when copying stringsBenoît Ganne1-19/+27
When memif sends back socket messages containing strings, we copy vectors into C-string. Unfortunately, most vectors are not null-terminated, causing strncpy() read overflow. Moreover, strncpy() does not null-terminate string in case of max length reached. This patch introduces helpers to safely copy strings from vectors. Type: fix Fixes: d6042d4f1ea0baf02bc87c72960a331a9e08dfab Change-Id: I38489ec8d2a5d4a42b9abde1aa3dfdbd06ebe024 Signed-off-by: Benoît Ganne <bganne@cisco.com>
2019-07-24bonding: print the name on the cli when createdMohsin Kazmi1-0/+6
Type: feature Change-Id: Icd718c98ba2fa900cafaf1a59dfb100ee9914ec9 Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
2019-07-24tap: print the interface name on cli when createdMohsin Kazmi2-0/+6
Type: feature Change-Id: If11f00574322c35c1780c31d5f7b47d30e083e35 Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
2019-07-24misc: Add maintainer entry for native virtio driverMohsin Kazmi1-2/+5
Type: feature Change-Id: Ieda0d8fbd2c1524ddf9fc776bc5c315629e893bf Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
2019-07-24ipsec: GCM, Anti-replay and ESN fixessNeale Ranns10-125/+345
Type: fix Several Fixes: 1 - Anti-replay did not work with GCM becuase it overwrote the sequence number in the ESP header. To fix i added the seq num to the per-packet data so it is preserved 2 - The high sequence number was not byte swapped during ESP encrypt. 3 - openssl engine was the only one to return FAIL_DECRYPT for bad GCM the others return BAD_HMAC. removed the former 4 - improved tracing to show the low and high seq numbers 5 - documented the anti-replay window checks 6 - fixed scapy patch for ESN support for GCM 7 - tests for anti-reply (w/ and w/o ESN) for each crypto algo Change-Id: Id65d96b6d1d4dd821b2ab557e87468fff6d70e5b Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-07-24tls: handle engine listen failureFlorin Coras1-1/+12
Type:fix Change-Id: I528b7cfcb7a6aada94ee3649378e6fbe84d2e4e6 Signed-off-by: Florin Coras <fcoras@cisco.com>
2019-07-24fib: remove unused input parameterZhiyong Yang1-5/+2
Type: style Change-Id: I2a21076fffaeb5726be80356aaffc9fea3d95850 Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
2019-07-24vppinfra: add mapped pcap file supportGary Boon6-0/+822
Type: feature Change-Id: Ic720d56a6f8901efde2a58519bc9aa553205a9a6 Signed-off-by: Gary Boon <gboon@cisco.com> Signed-off-by: Dave Barach <dave@barachs.net>
2019-07-23api: binary api cleanupDave Barach22-40/+90
Multiple API message handlers call vnet_get_sup_hw_interface(...) without checking the inbound sw_if_index. This can cause a pool_elt_at_index ASSERT in a debug image, and major disorder in a production image. Given that a number of places are coded as follows, add an "api_visible_or_null" variant of vnet_get_sup_hw_interface, which returns NULL given an invalid sw_if_index, or a hidden sw interface: - hw = vnet_get_sup_hw_interface (vnm, sw_if_index); + hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index); if (hw == NULL || memif_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a memif interface"); Rename two existing xxx_safe functions -> xxx_or_null to make it obvious what they return. Type: fix Change-Id: I29996e8d0768fd9e0c5495bd91ff8bedcf2c5697 Signed-off-by: Dave Barach <dave@barachs.net>
2019-07-23quic: Refactor connections closing and deletionAloys Augustin2-21/+81
This code should handle the 3 following cases: - Active close quic_proto_on_close sets state to ACTIVE_CLOSING send packets eventually returns an error, calling quic_connection_closed which deletes the connection - Passive close quic_on_closed_by_peer -> set state to PASSIVE_CLOSING "race" between app confirmation (calling quic_proto_on_close) and quicly signalling that it's done (triggers call to quic_connection_closed). If quic_connection_closed is called first, it sets the state to PASSIVE CLOSING QUIC CLOSED, then when quic_proto_on_close is called it frees the connection. If quic_proto_on_close is called first, it sets the state to PASSIVE CLOSING APP CLOSED, then when quic_connection_closed is called it frees the connection - Error close (reset) quic_connection_closed is called in state READY. This means a timeout or protocol error happened. This calls session_transport_reset_notify, the app should confirm the deletion and quic_proto_on_close will be called to delete the connection. Change-Id: I3acbf9b079ed2439bdbb447197c428c78915d8c0 Signed-off-by: Aloys Augustin <aloaugus@cisco.com> Type: feature
2019-07-23udp: fix typo in udp connectinon flagsDave Wallace1-1/+1
Type: fix Fixes: 3b726197 Change-Id: Ib515f0995e5c837349ebcad5f63fbd1b2a197e13 Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
(payload)) # store a copy of the packet in the packet info info.data = p.copy() # append the packet to the list pkts.append(p) # return the created packet list return pkts def verify_decapped_pppoe(self, src_if, capture, sent): self.assertEqual(len(capture), len(sent)) for i in range(len(capture)): try: tx = sent[i] rx = capture[i] tx_ip = tx[IP] rx_ip = rx[IP] self.assertEqual(rx_ip.src, tx_ip.src) self.assertEqual(rx_ip.dst, tx_ip.dst) except: self.logger.error(ppp("Rx:", rx)) self.logger.error(ppp("Tx:", tx)) raise def verify_encaped_pppoe(self, src_if, capture, sent, session_id): self.assertEqual(len(capture), len(sent)) for i in range(len(capture)): try: tx = sent[i] rx = capture[i] tx_ip = tx[IP] rx_ip = rx[IP] self.assertEqual(rx_ip.src, tx_ip.src) self.assertEqual(rx_ip.dst, tx_ip.dst) rx_pppoe = rx[PPPoE] self.assertEqual(rx_pppoe.sessionid, session_id) except: self.logger.error(ppp("Rx:", rx)) self.logger.error(ppp("Tx:", tx)) raise def test_PPPoE_Decap(self): """ PPPoE Decap Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session pppoe_if = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if.add_vpp_config() pppoe_if.set_unnumbered(self.pg0.sw_if_index) # # Send tunneled packets that match the created tunnel and # are decapped and forwarded # tx2 = self.create_stream_pppoe_ip4(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id, self.pg0.remote_ip4) self.pg0.add_stream(tx2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx2 = self.pg1.get_capture(len(tx2)) self.verify_decapped_pppoe(self.pg0, rx2, tx2) self.logger.info(self.vapi.cli("show pppoe fib")) self.logger.info(self.vapi.cli("show pppoe session")) self.logger.info(self.vapi.cli("show ip fib")) # # test case cleanup # # Delete PPPoE session pppoe_if.remove_vpp_config() # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() def test_PPPoE_Encap(self): """ PPPoE Encap Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session pppoe_if = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if.add_vpp_config() pppoe_if.set_unnumbered(self.pg0.sw_if_index) # # Send a packet stream that is routed into the session # - packets are PPPoE encapped # self.vapi.cli("clear trace") tx2 = self.create_stream_ip4(self.pg1, self.pg0, self.pg0.remote_ip4, self.dst_ip, 65) self.pg1.add_stream(tx2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx2 = self.pg0.get_capture(len(tx2)) self.verify_encaped_pppoe(self.pg1, rx2, tx2, self.session_id) self.logger.info(self.vapi.cli("show pppoe fib")) self.logger.info(self.vapi.cli("show pppoe session")) self.logger.info(self.vapi.cli("show ip fib")) self.logger.info(self.vapi.cli("show adj")) # # test case cleanup # # Delete PPPoE session pppoe_if.remove_vpp_config() # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() def test_PPPoE_Add_Twice(self): """ PPPoE Add Same Session Twice Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session pppoe_if = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if.add_vpp_config() pppoe_if.set_unnumbered(self.pg0.sw_if_index) # # The double create (create the same session twice) should fail, # and we should still be able to use the original # try: pppoe_if.add_vpp_config() except Exception: pass else: self.fail("Double GRE tunnel add does not fail") # # test case cleanup # # Delete PPPoE session pppoe_if.remove_vpp_config() # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() def test_PPPoE_Del_Twice(self): """ PPPoE Delete Same Session Twice Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session pppoe_if = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if.add_vpp_config() # Delete PPPoE session pppoe_if.remove_vpp_config() # # The double del (del the same session twice) should fail, # and we should still be able to use the original # try: pppoe_if.remove_vpp_config() except Exception: pass else: self.fail("Double GRE tunnel del does not fail") # # test case cleanup # # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() def test_PPPoE_Decap_Multiple(self): """ PPPoE Decap Multiple Sessions Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery 1 tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP 1 tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session 1 pppoe_if1 = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if1.add_vpp_config() pppoe_if1.set_unnumbered(self.pg0.sw_if_index) # Send PPPoE Discovery 2 tx3 = self.create_stream_pppoe_discovery(self.pg2, self.pg1, self.pg2.remote_mac) self.pg2.add_stream(tx3) self.pg_start() # Send PPPoE PPP LCP 2 tx4 = self.create_stream_pppoe_lcp(self.pg2, self.pg1, self.pg2.remote_mac, self.session_id + 1) self.pg2.add_stream(tx4) self.pg_start() # Create PPPoE session 2 pppoe_if2 = VppPppoeInterface(self, self.pg2.remote_ip4, self.pg2.remote_mac, self.session_id + 1) pppoe_if2.add_vpp_config() pppoe_if2.set_unnumbered(self.pg0.sw_if_index) # # Send tunneled packets that match the created tunnel and # are decapped and forwarded # tx2 = self.create_stream_pppoe_ip4(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id, self.pg0.remote_ip4) self.pg0.add_stream(tx2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx2 = self.pg1.get_capture(len(tx2)) self.verify_decapped_pppoe(self.pg0, rx2, tx2) tx5 = self.create_stream_pppoe_ip4(self.pg2, self.pg1, self.pg2.remote_mac, self.session_id + 1, self.pg2.remote_ip4) self.pg2.add_stream(tx5) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx5 = self.pg1.get_capture(len(tx5)) self.verify_decapped_pppoe(self.pg2, rx5, tx5) self.logger.info(self.vapi.cli("show pppoe fib")) self.logger.info(self.vapi.cli("show pppoe session")) self.logger.info(self.vapi.cli("show ip fib")) # # test case cleanup # # Delete PPPoE session pppoe_if1.remove_vpp_config() pppoe_if2.remove_vpp_config() # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() def test_PPPoE_Encap_Multiple(self): """ PPPoE Encap Multiple Sessions Test """ self.vapi.cli("clear trace") # # Add a route that resolves the server's destination # route_sever_dst = VppIpRoute(self, "100.1.1.100", 32, [VppRoutePath(self.pg1.remote_ip4, self.pg1.sw_if_index)]) route_sever_dst.add_vpp_config() # Send PPPoE Discovery 1 tx0 = self.create_stream_pppoe_discovery(self.pg0, self.pg1, self.pg0.remote_mac) self.pg0.add_stream(tx0) self.pg_start() # Send PPPoE PPP LCP 1 tx1 = self.create_stream_pppoe_lcp(self.pg0, self.pg1, self.pg0.remote_mac, self.session_id) self.pg0.add_stream(tx1) self.pg_start() # Create PPPoE session 1 pppoe_if1 = VppPppoeInterface(self, self.pg0.remote_ip4, self.pg0.remote_mac, self.session_id) pppoe_if1.add_vpp_config() # Send PPPoE Discovery 2 tx3 = self.create_stream_pppoe_discovery(self.pg2, self.pg1, self.pg2.remote_mac) self.pg2.add_stream(tx3) self.pg_start() # Send PPPoE PPP LCP 2 tx4 = self.create_stream_pppoe_lcp(self.pg2, self.pg1, self.pg2.remote_mac, self.session_id + 1) self.pg2.add_stream(tx4) self.pg_start() # Create PPPoE session 2 pppoe_if2 = VppPppoeInterface(self, self.pg2.remote_ip4, self.pg2.remote_mac, self.session_id + 1) pppoe_if2.add_vpp_config() # # Send a packet stream that is routed into the session # - packets are PPPoE encapped # self.vapi.cli("clear trace") tx2 = self.create_stream_ip4(self.pg1, self.pg0, self.pg0.remote_ip4, self.dst_ip) self.pg1.add_stream(tx2) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx2 = self.pg0.get_capture(len(tx2)) self.verify_encaped_pppoe(self.pg1, rx2, tx2, self.session_id) tx5 = self.create_stream_ip4(self.pg1, self.pg2, self.pg2.remote_ip4, self.dst_ip) self.pg1.add_stream(tx5) self.pg_enable_capture(self.pg_interfaces) self.pg_start() rx5 = self.pg2.get_capture(len(tx5)) self.verify_encaped_pppoe(self.pg1, rx5, tx5, self.session_id + 1) self.logger.info(self.vapi.cli("show pppoe fib")) self.logger.info(self.vapi.cli("show pppoe session")) self.logger.info(self.vapi.cli("show ip fib")) # # test case cleanup # # Delete PPPoE session pppoe_if1.remove_vpp_config() pppoe_if2.remove_vpp_config() # Delete a route that resolves the server's destination route_sever_dst.remove_vpp_config() if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)