def setup_source_flow(self, ipv4_src, ipv4_dst, sport, dport, instructions, max_hop): ipv4_src_ = ipv4_to_binary(ipv4_src) ipv4_dst_ = ipv4_to_binary(ipv4_dst) ipv4_mask = ipv4_to_binary("255.255.255.255") sport_ = stringify(sport, 2) dport_ = stringify(dport, 2) port_mask = stringify(65535, 2) instructions = set(instructions) ins_mask = self.get_ins_mask(instructions) ins_cnt = len(instructions) ins_mask0407 = (ins_mask >> 8) & 0xF ins_mask0003 = ins_mask >> 12 max_hop_ = stringify(max_hop, 1) ins_cnt_ = stringify(ins_cnt, 1) ins_mask0003_ = stringify(ins_mask0003, 1) ins_mask0407_ = stringify(ins_mask0407, 1) self.send_request_add_entry_to_action( "tb_int_source", [ self.Ternary("ipv4_src", ipv4_src_, ipv4_mask), self.Ternary("ipv4_dst", ipv4_dst_, ipv4_mask), self.Ternary("l4_sport", sport_, port_mask), self.Ternary("l4_dport", dport_, port_mask), ], "int_source_dscp", [("max_hop", max_hop_), ("ins_cnt", ins_cnt_), ("ins_mask0003", ins_mask0003_), ("ins_mask0407", ins_mask0407_)], priority=DEFAULT_PRIORITY)
def setUp(self): super(SpgwSimpleTest, self).setUp() self.add_forwarding_unicast_v4_entry(self.S1U_ENB_IPV4, 32, 1) self.add_forwarding_unicast_v4_entry(self.END_POINT_IPV4, 32, 2) self.add_next_hop_L3(1, self.port2, self.SWITCH_MAC_2, self.DMAC_2) self.add_next_hop_L3(2, self.port1, self.SWITCH_MAC_1, self.DMAC_1) req = p4runtime_pb2.WriteRequest() req.device_id = self.device_id s1u_enb_ipv4_ = ipv4_to_binary(self.S1U_ENB_IPV4) s1u_sgw_ipv4_ = ipv4_to_binary(self.S1U_SGW_IPV4) end_point_ipv4_ = ipv4_to_binary(self.END_POINT_IPV4) self.push_update_add_entry_to_action( req, "spgw_ingress.ue_filter_table", [self.Lpm("ipv4.dst_addr", end_point_ipv4_, 32)], "NoAction", []) self.push_update_add_entry_to_action( req, "spgw_ingress.s1u_filter_table", [self.Exact("spgw_meta.s1u_sgw_addr", s1u_sgw_ipv4_)], "NoAction", []) self.push_update_add_entry_to_action( req, "spgw_ingress.dl_sess_lookup", [self.Exact("ipv4.dst_addr", end_point_ipv4_)], "spgw_ingress.set_dl_sess_info", [("teid", stringify(1, 4)), ("s1u_enb_addr", s1u_enb_ipv4_), ("s1u_sgw_addr", s1u_sgw_ipv4_)]) self.write_request(req)
def setup_downlink(self, s1u_sgw_ipv4, s1u_enb_ipv4, ue_ipv4, teid): req = self.get_new_write_request() s1u_enb_ipv4_ = ipv4_to_binary(s1u_enb_ipv4) s1u_sgw_ipv4_ = ipv4_to_binary(s1u_sgw_ipv4) end_point_ipv4_ = ipv4_to_binary(ue_ipv4) teid_ = stringify(teid, 4) self.push_update_add_entry_to_action( req, "spgw_ingress.dl_sess_lookup", [self.Exact("ipv4_dst", end_point_ipv4_)], "spgw_ingress.set_dl_sess_info", [("teid", teid_), ("s1u_enb_addr", s1u_enb_ipv4_), ("s1u_sgw_addr", s1u_sgw_ipv4_)]) self.write_request(req)
def setup_uplink(self, s1u_sgw_ipv4): req = self.get_new_write_request() s1u_sgw_ipv4_ = ipv4_to_binary(s1u_sgw_ipv4) self.push_update_add_entry_to_action( req, "spgw_ingress.s1u_filter_table", [self.Exact("gtp_ipv4_dst", s1u_sgw_ipv4_)], "nop", []) self.write_request(req)
def runTest(self): ip_dst_addr = "10.0.0.1" ip_dst_addr_str = ipv4_to_binary(ip_dst_addr) ig_port = self.swports(1) eg_port = self.swports(2) # port is 9-bit in v1model, i.e. 2 bytes eg_port_str = stringify(eg_port, 2) smac = "\xee\xcd\x00\x7e\x70\x00" dmac = "\xee\x30\xca\x9d\x1e\x00" # we do not care about the src mac address or the src IP address pkt = testutils.simple_tcp_packet(eth_dst=smac, ip_dst=ip_dst_addr, ip_ttl=64) # no forwarding entry: packet must be dropped testutils.send_packet(self, ig_port, pkt) testutils.verify_no_other_packets(self) # add a forwarding entry self.send_request_add_entry_to_action( "l3_host_fwd", [self.Exact("hdr.ipv4.dst_addr", ip_dst_addr_str)], "set_nexthop", [("port", eg_port_str), ("smac", smac), ("dmac", dmac)]) # check that the entry is hit and that no other packets are received exp_pkt = testutils.simple_tcp_packet(eth_src=smac, eth_dst=dmac, ip_dst=ip_dst_addr, ip_ttl=63) testutils.send_packet(self, ig_port, pkt) testutils.verify_packets(self, exp_pkt, [eg_port])
def add_forwarding_unicast_v4_entry(self, ipv4_dstAddr, ipv4_pLen, next_id): ipv4_dstAddr_ = ipv4_to_binary(ipv4_dstAddr) next_id_ = stringify(next_id, 4) self.send_request_add_entry_to_action( "forwarding.unicast_v4", [self.Lpm("hdr.ipv4.dst_addr", ipv4_dstAddr_, ipv4_pLen)], "forwarding.set_next_id", [("next_id", next_id_)])
def setUp(self): super(SpgwMPLSTest, self).setUp() self.mpls_label = 204 # internal vlan required for MPLS self.set_internal_vlan(self.port1, vlan_valid=False, vlan_id=0, vlan_id_mask=0, new_vlan_id=4094) self.set_internal_vlan(self.port2, vlan_valid=False, vlan_id=0, vlan_id_mask=0, new_vlan_id=20) self.add_forwarding_unicast_v4_entry(self.S1U_ENB_IPV4, 32, 1) self.add_forwarding_unicast_v4_entry(self.END_POINT_IPV4, 32, 2) self.add_next_hop_L3(1, self.port2, self.SWITCH_MAC_2, self.DMAC_2) self.add_next_hop_mpls_v4(2, self.port1, self.SWITCH_MAC_1, self.DMAC_1, self.mpls_label) req = p4runtime_pb2.WriteRequest() req.device_id = self.device_id s1u_enb_ipv4_ = ipv4_to_binary(self.S1U_ENB_IPV4) s1u_sgw_ipv4_ = ipv4_to_binary(self.S1U_SGW_IPV4) end_point_ipv4_ = ipv4_to_binary(self.END_POINT_IPV4) self.push_update_add_entry_to_action( req, "spgw_ingress.ue_filter_table", [self.Lpm("ipv4.dst_addr", end_point_ipv4_, 32)], "NoAction", []) self.push_update_add_entry_to_action( req, "spgw_ingress.s1u_filter_table", [self.Exact("spgw_meta.s1u_sgw_addr", s1u_sgw_ipv4_)], "NoAction", []) self.push_update_add_entry_to_action( req, "spgw_ingress.dl_sess_lookup", [self.Exact("ipv4.dst_addr", end_point_ipv4_)], "spgw_ingress.set_dl_sess_info", [("teid", stringify(1, 4)), ("s1u_enb_addr", s1u_enb_ipv4_), ("s1u_sgw_addr", s1u_sgw_ipv4_)]) self.write_request(req)
def setup_line_v4(self, s_tag, c_tag, line_id, ipv4_addr, pppoe_session_id, ds_next_id, enabled=True): assert s_tag != 0 assert c_tag != 0 assert line_id != 0 assert pppoe_session_id != 0 c_tag_ = stringify(c_tag, 2) # inner line_id_ = stringify(line_id, 4) ipv4_addr_ = ipv4_to_binary(ipv4_addr) pppoe_session_id_ = stringify(pppoe_session_id, 2) ds_next_id_ = stringify(ds_next_id, 4) # Upstream self.set_upstream_line_map(s_tag=s_tag, c_tag=c_tag, line_id=line_id) if enabled: # Enable upstream termination. self.send_request_add_entry_to_action( "bng_ingress.upstream.t_pppoe_term_v4", [self.Exact("line_id", line_id_), self.Exact("ipv4_src", ipv4_addr_), self.Exact("pppoe_session_id", pppoe_session_id_)], "bng_ingress.upstream.term_enabled_v4", []) # Downstream if enabled: a_name = "set_line_next" a_params = [ ("line_id", line_id_), ("next_id", ds_next_id_), ] else: a_name = "set_line_drop" a_params = [ ("line_id", line_id_) ] self.send_request_add_entry_to_action( "bng_ingress.downstream.t_line_map_v4", [self.Exact("ipv4_dst", ipv4_addr_)], "bng_ingress.downstream." + a_name, a_params) self.send_request_add_entry_to_action( "bng_egress.downstream.t_session_encap", [self.Exact("line_id", line_id_)], "bng_egress.downstream.encap_v4", [ ("c_tag", c_tag_), ("pppoe_session_id", pppoe_session_id_), ])