Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
    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])
Beispiel #6
0
 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_)])
Beispiel #7
0
    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)
Beispiel #8
0
    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_),
            ])