summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2024-01-12 08:02:17 +0000
committersongyanchao <[email protected]>2024-01-12 08:02:17 +0000
commitd61f6b7b9c1fd4955074c9a49ecb07a5adb6803f (patch)
tree82f2c1008a67d13aa0b0444effea30e79f996074
parent5843c1833801d118b334382956ac393045fe7064 (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.h2
-rw-r--r--service/src/node_classifier.c8
-rw-r--r--service/src/node_vwire.c61
-rw-r--r--test/vwire_test.py235
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()