summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLu Qiuwen <[email protected]>2023-08-08 16:49:18 +0800
committerLu Qiuwen <[email protected]>2023-08-08 16:49:18 +0800
commit460843290f1bedc8343d6fb370c97fce77b0772f (patch)
treef9b0514764d67486935c9a7a62961480e5d5ea7a
parent525abd9e514c4397dc80ba007e349f8b396438f2 (diff)
virtual-wire允许配置null设备。v4.6.42-20230808
-rw-r--r--service/src/node_vwire.c98
1 files changed, 69 insertions, 29 deletions
diff --git a/service/src/node_vwire.c b/service/src/node_vwire.c
index 8262fb0..846ac4d 100644
--- a/service/src/node_vwire.c
+++ b/service/src/node_vwire.c
@@ -221,8 +221,17 @@ static __rte_always_inline uint16_t vwire_egress_node_process(struct rte_graph *
priv_data->port_egress = vwire_fwd_rule->int_dev_port_id;
}
- /* goto eth_egress node */
- next0 = VWIRE_EGRESS_NEXT_NODE_ETH_EGRESS;
+ /* null device */
+ if(vwire_fwd_rule->int_dev == NULL || vwire_fwd_rule->ext_dev == NULL)
+ {
+ /* nothing to map, drop this packet */
+ next0 = VWIRE_EGRESS_NEXT_NODE_PKT_DROP;
+ }
+ else
+ {
+ /* goto eth_egress node */
+ next0 = VWIRE_EGRESS_NEXT_NODE_ETH_EGRESS;
+ }
if (unlikely(next_index ^ next0))
{
@@ -290,53 +299,84 @@ static int vwire_forward_rule_add__DEV_TYPE(struct vwire_node_main * vwire_main,
MR_VERIFY_MALLOC(fwd_rule);
/* internal device/tag */
- struct mr_dev_desc * int_dev_desc = mr_dev_desc_lookup(sc->devmgr_main, int_dev);
- if (int_dev_desc != NULL)
+ struct mr_dev_desc * int_dev_desc = NULL;
+ struct mr_dev_desc * ext_dev_desc = NULL;
+
+ if(strcmp(int_dev, "null") == 0)
{
- fwd_rule->int_dev = int_dev_desc;
- fwd_rule->int_dev_port_id = int_dev_desc->port_id;
+ int_dev_desc = NULL;
}
else
{
- MR_ERROR("Internal Device %s is not existed, cannot create virtual-wire rule.", int_dev);
- goto errout;
+ int_dev_desc = mr_dev_desc_lookup(sc->devmgr_main, int_dev);
+ if (int_dev_desc != NULL)
+ {
+ fwd_rule->int_dev = int_dev_desc;
+ fwd_rule->int_dev_port_id = int_dev_desc->port_id;
+ }
+ else
+ {
+ MR_ERROR("Internal Device %s is not existed, cannot create virtual-wire rule.", int_dev);
+ goto errout;
+ }
}
- struct mr_dev_desc * ext_dev_desc = mr_dev_desc_lookup(sc->devmgr_main, ext_dev);
- if (ext_dev_desc != NULL)
+ if(strcmp(ext_dev, "null") == 0)
{
- fwd_rule->ext_dev = ext_dev_desc;
- fwd_rule->ext_dev_port_id = ext_dev_desc->port_id;
+ ext_dev_desc = NULL;
}
else
{
- MR_ERROR("External Device %s is not existed, cannot create virtual-wire rule.", ext_dev);
- goto errout;
+ ext_dev_desc = mr_dev_desc_lookup(sc->devmgr_main, ext_dev);
+ if (ext_dev_desc != NULL)
+ {
+ fwd_rule->ext_dev = ext_dev_desc;
+ fwd_rule->ext_dev_port_id = ext_dev_desc->port_id;
+ }
+ else
+ {
+ MR_ERROR("External Device %s is not existed, cannot create virtual-wire rule.", ext_dev);
+ goto errout;
+ }
}
/* construct the forward lookup map, internal->external */
- struct vwire_map_result * int_to_ext_map_result = &vwire_main->vwire_map[fwd_rule->int_dev_port_id];
- if (int_to_ext_map_result->rule_object != NULL)
+ struct vwire_map_result * int_to_ext_map_result = NULL;
+ struct vwire_map_result * ext_to_int_map_result = NULL;
+
+ if(fwd_rule->int_dev != NULL)
{
- MR_ERROR("Internal Device %s has already be a member of virtual-wire group, rejected.", int_dev);
- goto errout;
+ int_to_ext_map_result = &vwire_main->vwire_map[fwd_rule->int_dev_port_id];
+ if (int_to_ext_map_result->rule_object != NULL)
+ {
+ MR_ERROR("Internal Device %s has already be a member of virtual-wire group, rejected.", int_dev);
+ goto errout;
+ }
}
- /* external->internal */
- struct vwire_map_result * ext_to_int_map_result = &vwire_main->vwire_map[fwd_rule->ext_dev_port_id];
- if (ext_to_int_map_result->rule_object != NULL)
+ if(fwd_rule->ext_dev != NULL)
{
- MR_ERROR("External Device %s has already be a member of virtual-wire group, rejected.", ext_dev);
- goto errout;
+ ext_to_int_map_result = &vwire_main->vwire_map[fwd_rule->ext_dev_port_id];
+ if (ext_to_int_map_result->rule_object != NULL)
+ {
+ MR_ERROR("External Device %s has already be a member of virtual-wire group, rejected.", ext_dev);
+ goto errout;
+ }
}
- int_to_ext_map_result->rule_object = fwd_rule;
- int_to_ext_map_result->is_ext_to_int_dir = 0;
- int_to_ext_map_result->egress_port_id = fwd_rule->ext_dev_port_id;
+ if(int_to_ext_map_result != NULL)
+ {
+ int_to_ext_map_result->rule_object = fwd_rule;
+ int_to_ext_map_result->is_ext_to_int_dir = 0;
+ int_to_ext_map_result->egress_port_id = fwd_rule->ext_dev_port_id;
+ }
- ext_to_int_map_result->rule_object = fwd_rule;
- ext_to_int_map_result->egress_port_id = fwd_rule->int_dev_port_id;
- ext_to_int_map_result->is_ext_to_int_dir = 1;
+ if(ext_to_int_map_result != NULL)
+ {
+ ext_to_int_map_result->rule_object = fwd_rule;
+ ext_to_int_map_result->egress_port_id = fwd_rule->int_dev_port_id;
+ 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;