diff options
| author | Lu Qiuwen <[email protected]> | 2023-08-08 16:49:18 +0800 |
|---|---|---|
| committer | Lu Qiuwen <[email protected]> | 2023-08-08 16:49:18 +0800 |
| commit | 460843290f1bedc8343d6fb370c97fce77b0772f (patch) | |
| tree | f9b0514764d67486935c9a7a62961480e5d5ea7a | |
| parent | 525abd9e514c4397dc80ba007e349f8b396438f2 (diff) | |
virtual-wire允许配置null设备。v4.6.42-20230808
| -rw-r--r-- | service/src/node_vwire.c | 98 |
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; |
