diff options
| author | songyanchao <[email protected]> | 2024-01-12 08:02:17 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-01-12 08:02:17 +0000 |
| commit | d61f6b7b9c1fd4955074c9a49ecb07a5adb6803f (patch) | |
| tree | 82f2c1008a67d13aa0b0444effea30e79f996074 | |
| parent | 5843c1833801d118b334382956ac393045fe7064 (diff) | |
✨ feat(DPISDN-33): Support non-contiguous configuration for Vwire ID.
Support non-contiguous configuration for Vwire ID.
| -rw-r--r-- | include/internal/adapter_define.h | 2 | ||||
| -rw-r--r-- | service/src/node_classifier.c | 8 | ||||
| -rw-r--r-- | service/src/node_vwire.c | 61 | ||||
| -rw-r--r-- | test/vwire_test.py | 235 |
4 files changed, 286 insertions, 20 deletions
diff --git a/include/internal/adapter_define.h b/include/internal/adapter_define.h index 4a56928..b0e1b8d 100644 --- a/include/internal/adapter_define.h +++ b/include/internal/adapter_define.h @@ -12,7 +12,7 @@ enum adapter_type }; unsigned int nr_ef_adapters_get(); -unsigned int nr_vwire_adapters_get(); +unsigned int nr_max_vwires_get(); unsigned int nr_tera_adapters_get(); int ef_adapter_id_check(uint32_t ef_adapter_id); int vwire_id_check(uint32_t vwire_id); diff --git a/service/src/node_classifier.c b/service/src/node_classifier.c index cde5653..052c8d7 100644 --- a/service/src/node_classifier.c +++ b/service/src/node_classifier.c @@ -27,7 +27,7 @@ struct classifier_stats struct node_classifier_main { unsigned int nr_ef_adapters; - unsigned int nr_vwire_adapters; + unsigned int nr_max_vwires; unsigned int nr_tera_adapters; unsigned int ignore_all_icmp_pkts; unsigned int ignore_all_icmp6_pkts; @@ -105,7 +105,7 @@ static inline uint16_t domain_field_generator_for_classifier(enum adapter_type t domain_field = classifier_main->nr_ef_adapters + adapter_id; break; case ADAPTER_TYPE_TERA: - domain_field = classifier_main->nr_ef_adapters + classifier_main->nr_vwire_adapters + adapter_id; + domain_field = classifier_main->nr_ef_adapters + classifier_main->nr_max_vwires + adapter_id; break; default: domain_field = UINT16_MAX; @@ -217,11 +217,11 @@ int classifier_init(struct sc_main * sc) /* Create a new packet classifier engine. */ classifier_main->nr_ef_adapters = nr_ef_adapters_get(); - classifier_main->nr_vwire_adapters = nr_vwire_adapters_get(); + classifier_main->nr_max_vwires = nr_max_vwires_get(); classifier_main->nr_tera_adapters = nr_tera_adapters_get(); uint16_t nr_domains = classifier_main->nr_ef_adapters; - nr_domains += classifier_main->nr_vwire_adapters; + nr_domains += classifier_main->nr_max_vwires; nr_domains += +classifier_main->nr_tera_adapters; /* Create pkt classifier engine */ diff --git a/service/src/node_vwire.c b/service/src/node_vwire.c index 964f13b..178a56f 100644 --- a/service/src/node_vwire.c +++ b/service/src/node_vwire.c @@ -69,21 +69,30 @@ struct vwire_node_main }; static struct vwire_node_main * p_vwire_node_main = NULL; -static unsigned int g_vwire_max_entry = 256; +static unsigned int nr_max_vwires = 256; int olp_set_used(char * dev_sym, uint32_t channel_id); -/* Get vwire adapters num */ -unsigned int nr_vwire_adapters_get() +/* Get max vwires num */ +unsigned int nr_max_vwires_get() { - return p_vwire_node_main->nr_forward_rules; + return nr_max_vwires; } /* Vwire service id check */ int vwire_id_check(uint32_t vwire_id) { - if (vwire_id >= p_vwire_node_main->nr_forward_rules) + if (vwire_id >= nr_max_vwires) return RT_ERR; + + struct vwire_forward_rule * forward_rule = p_vwire_node_main->forward_rules[vwire_id]; + + if (forward_rule == NULL) + return RT_ERR; + + if (forward_rule->vwire_id != vwire_id) + return RT_ERR; + return RT_SUCCESS; } @@ -216,7 +225,7 @@ static __rte_always_inline uint16_t vwire_egress_node_process(struct rte_graph * /* Get vwire item */ unsigned int vwire_id = priv_data->cur_sid - p_vwire_node_main->sid_start; - assert(vwire_id < p_vwire_node_main->nr_forward_rules); + assert(vwire_id < nr_max_vwires); struct vwire_forward_rule * vwire_fwd_rule = p_vwire_node_main->forward_rules[vwire_id]; assert(vwire_fwd_rule != NULL); @@ -304,7 +313,7 @@ RTE_NODE_REGISTER(vwire_ingress_node_base); RTE_NODE_REGISTER(vwire_egress_node_base); static int vwire_forward_rule_add__DEV_TYPE(struct vwire_node_main * vwire_main, struct sc_main * sc, - const char * int_dev, const char * ext_dev) + const char * int_dev, const char * ext_dev, unsigned int vwire_id) { struct vwire_forward_rule * fwd_rule = ZMALLOC(sizeof(struct vwire_forward_rule)); MR_VERIFY_MALLOC(fwd_rule); @@ -389,8 +398,9 @@ static int vwire_forward_rule_add__DEV_TYPE(struct vwire_node_main * vwire_main, ext_to_int_map_result->is_ext_to_int_dir = 1; } - fwd_rule->vwire_id = vwire_main->nr_forward_rules; - vwire_main->forward_rules[vwire_main->nr_forward_rules++] = fwd_rule; + vwire_main->nr_forward_rules++; + fwd_rule->vwire_id = vwire_id; + vwire_main->forward_rules[vwire_id] = fwd_rule; MR_INFO("Virtual Wire: ID=%d, internal_dev=%s, external_dev=%s created.", fwd_rule->vwire_id, int_dev, ext_dev); return RT_SUCCESS; @@ -407,11 +417,11 @@ errout: int vwire_init(struct sc_main * sc) { /* Get ef max entry,default is 256 */ - MESA_load_profile_uint_def(sc->local_cfgfile, "vwires", "max_rules", &g_vwire_max_entry, 256); + MESA_load_profile_uint_def(sc->local_cfgfile, "limits", "nr_max_vwires", &nr_max_vwires, 256); struct vwire_node_main * vwire_node_main = ZMALLOC(sizeof(struct vwire_node_main)); MR_VERIFY_MALLOC(vwire_node_main); - vwire_node_main->forward_rules = ZMALLOC(sizeof(struct vwire_forward_rule *) * g_vwire_max_entry); + vwire_node_main->forward_rules = ZMALLOC(sizeof(struct vwire_forward_rule *) * nr_max_vwires); MR_VERIFY_MALLOC(vwire_node_main->forward_rules); p_vwire_node_main = vwire_node_main; @@ -433,7 +443,7 @@ int vwire_init(struct sc_main * sc) /* load vwire rules */ int ret = 0; - for (unsigned int i = 0; i < g_vwire_max_entry; i++) + for (unsigned int i = 0; i < nr_max_vwires; i++) { char sec_symbol[MR_SYMBOL_MAX] = {0}; snprintf(sec_symbol, sizeof(sec_symbol) - 1, "vwire:%u", i); @@ -458,7 +468,21 @@ int vwire_init(struct sc_main * sc) continue; } - vwire_forward_rule_add__DEV_TYPE(p_vwire_node_main, sc, str_int_dev, str_ext_dev); + unsigned int vwire_id; + ret = MESA_load_profile_uint_nodef(sc->local_cfgfile, sec_symbol, "vwire_id", &vwire_id); + if (ret < 0) + { + MR_DEBUG("vwire_id is not existed in section %s, ignore this section", sec_symbol); + continue; + } + + if (vwire_id >= nr_max_vwires) + { + MR_ERROR("Service Vwire id:%u out of range:%u .", vwire_id, nr_max_vwires); + return RT_ERR; + } + + vwire_forward_rule_add__DEV_TYPE(p_vwire_node_main, sc, str_int_dev, str_ext_dev, vwire_id); char str_obp_dev[MR_SYMBOL_MAX] = {0}; ret = MESA_load_profile_string_nodef(sc->local_cfgfile, sec_symbol, "obp_device", str_obp_dev, @@ -483,8 +507,15 @@ int vwire_init(struct sc_main * sc) } /* inserter sid to forwarder table */ - for (uint16_t sid = sid_start; sid < sid_start + p_vwire_node_main->nr_forward_rules; sid++) + for (int i = 0; i < nr_max_vwires; i++) + { + struct vwire_forward_rule * fwd_rule = p_vwire_node_main->forward_rules[i]; + if (fwd_rule == NULL) + continue; + + uint16_t sid = sid_start + fwd_rule->vwire_id; forwarder_table_inserter(sid, FORWARDER_TYPE_VWIRE); + } /* Save sid info */ p_vwire_node_main->nr_sid = nr_sid; @@ -493,7 +524,7 @@ int vwire_init(struct sc_main * sc) /* Link db ctx create */ uint32_t max_entries; - MESA_load_profile_uint_def(sc->local_cfgfile, "link_dbs", "max_rules", &max_entries, 32); + MESA_load_profile_uint_def(sc->local_cfgfile, "limits", "nr_max_link_dbs", &max_entries, 32); p_vwire_node_main->link_db_ctx = link_db_create(LINK_DB_TYPE_VWIRE, max_entries); if (p_vwire_node_main->link_db_ctx == NULL) return RT_ERR; diff --git a/test/vwire_test.py b/test/vwire_test.py index 8a377e3..fa9141d 100644 --- a/test/vwire_test.py +++ b/test/vwire_test.py @@ -205,50 +205,62 @@ sid_end=2000 # vwire [vwire:0] +vwire_id = 0 interface_int = veth0 interface_ext = veth1 [vwire:1] +vwire_id = 1 interface_int = veth2 interface_ext = veth3 [vwire:2] +vwire_id = 2 interface_int = veth4 interface_ext = veth5 [vwire:3] +vwire_id = 3 interface_int = veth6 interface_ext = veth7 [vwire:4] +vwire_id = 4 interface_int = veth8 interface_ext = veth9 [vwire:5] +vwire_id = 5 interface_int = veth10 interface_ext = veth11 [vwire:6] +vwire_id = 6 interface_int = veth12 interface_ext = veth13 [vwire:7] +vwire_id = 7 interface_int = veth14 interface_ext = veth15 [vwire:8] +vwire_id = 8 interface_int = veth16 interface_ext = veth17 [vwire:9] +vwire_id = 9 interface_int = veth18 interface_ext = veth19 [vwire:10] +vwire_id = 10 interface_int = veth20 interface_ext = veth21 [vwire:11] +vwire_id = 11 interface_int = veth22 interface_ext = veth23 """ @@ -307,3 +319,226 @@ class TestSendAndReceive(BaseTest): finally: mrzcpd.stop() + + +start_conf_with_non_contiguous_test = """ +[device] +device = veth0,veth1,veth2,veth3,veth4,veth5,veth6,veth7,veth8 +sz_tunnel = 8192 +sz_buffer = 0 + +[device:veth0] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth1] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth2] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth3] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth4] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth5] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth6] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth7] +promisc = 1 +mtu = 1500 +driver = 2 +role = 1 + +[device:veth8] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[service] +iocore = 1 +distmode = 2 +hashmode = 0 + +[eal] +virtaddr = 0x600000000000 +loglevel = 7 +nohuge = 1 +mem = 65535 + +[keepalive] +check_spinlock = 1 + +[ctrlzone] +ctrlzone0 = tunnat, 64 +ctrlzone1 = vsys, 64 + +[pool] +create_mode = 3 +sz_direct_pktmbuf = 4096 +sz_indirect_pktmbuf = 4096 +sz_cache = 256 +sz_data = 3000 + +[ctrlmsg] +listen_addr = 0.0.0.0 +listen_port = 46789 + +[rpc] +addr = 127.0.0.1 +port = 56789 + +# sid +[ef_adapters] +sid_start=100 +sid_end=200 +max_rules=256 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=256 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# vwire +[vwire:0] +vwire_id = 0 +interface_int = veth0 +interface_ext = veth1 + +[vwire:1] +vwire_id = 2 +interface_int = veth3 +interface_ext = veth4 + +[vwire:2] +vwire_id = 4 +interface_int = veth6 +interface_ext = veth7 + +# load balance +[load_balance:0] +mode=balance +devices=veth2,normal + +[load_balance:1] +mode=balance +devices=veth5,normal + +[load_balance:2] +mode=balance +devices=veth8,normal + +""" + +dynamic_conf_with_non_contiguous_test = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +vwire_id=0 + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1001 +vwire_id=2 + +[classifier_rule:2] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1002 +vwire_id=4 +""" + +""" + +--------------+ +----------++-----------+----------+ + | PTF | | Mrzcpd | + +--------------+ +----------++-----------+----------+ + | veth0-ptf0 | ---> | veth0 | | | +------------+ + +--------------+ +----------+ | veth2 | ---> | veth2-ptf2 | + | veth1-ptf1 | <-\- | veth1 | | | +------------+ + +--------------+ +----------+ +----------+ + | veth3-ptf3 | ---> | veth3 | | | +------------+ + +--------------+ +----------+ | veth5 | ---> | veth5-ptf5 | + | veth4-ptf4 | <-\- | veth4 | | | +------------+ + +--------------+ +----------+ +----------+ + | veth6-ptf6 | ---> | veth6 | | | +------------+ + +--------------+ +----------+ | veth8 | ---> | veth8-ptf8 | + | veth7-ptf7 | <-\- | veth7 | | | +------------+ + +--------------+ +----------++----------++----------+ +""" +@group("id_non_contiguous_test") +class IdNonContiguousTest(BaseTest): + # Base test init + def __init__(self): + BaseTest.__init__(self) + + # Dataplane set up + def setUp(self): + self.dataplane = ptf.dataplane_instance + + # Run test + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(start_conf_with_non_contiguous_test,dynamic_conf_with_non_contiguous_test) + mrzcpd.start() + + packets=[] + + # Create packets + for i in range(0,3): + packets.append(simple_tcp_packet(eth_dst='00:11:11:11:11:11', + eth_src='00:22:22:22:22:22', + ip_dst='10.0.0.' + str(i), + ip_id=101, + ip_ttl=64)) + + # Traverse all ports + for i in range(0, 3): + # Send pkt for the port + send_packet(self, i * 3 , packets[i]) + # Verify pkt for specified port + verify_packets(self, packets[i], [2 + i*3]) + + finally: + mrzcpd.stop() |
