updating the port maps on dpif open (without create) and in port_add/port_del.
Signed-off-by: Paul Blakey <pa...@mellanox.com> Signed-off-by: Shahar Klein <shah...@mellanox.com> --- lib/dpif-hw-netlink.c | 68 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/lib/dpif-hw-netlink.c b/lib/dpif-hw-netlink.c index 92ac6cb..885827a 100644 --- a/lib/dpif-hw-netlink.c +++ b/lib/dpif-hw-netlink.c @@ -574,11 +574,22 @@ dpif_hw_netlink_open(const struct dpif_class *class OVS_UNUSED, { struct dpif_hw_netlink *dpif; struct dpif *lp_dpif_netlink; - - if (dpif_create_and_open(name, "system", &lp_dpif_netlink)) { - VLOG_WARN("ERROR! %d\n", __LINE__); + struct netdev *netdev; + struct dpif_port dpif_port; + struct dpif_port_dump dump; + int error = 0; + + VLOG_DBG("%s %d %s: parameters name %s, create: %s\n", __FILE__, __LINE__, + __func__, name, (create ? "yes" : "no")); + if (create) { + if ((error = dpif_create(name, "system", &lp_dpif_netlink))) { + return error; + } + } else { + if ((error = dpif_open(name, "system", &lp_dpif_netlink))) { + return error; + } } - dpif = xzalloc(sizeof *dpif); initmaps(dpif); @@ -593,6 +604,31 @@ dpif_hw_netlink_open(const struct dpif_class *class OVS_UNUSED, *dpifp = &dpif->dpif; + if (!create) { + VLOG_DBG + ("%s %d %s(%p) requesting existing port dump, from dpif-netlink only.\n", + __FILE__, __LINE__, __func__, dpif); + DPIF_PORT_FOR_EACH(&dpif_port, &dump, dpif->lp_dpif_netlink) { + VLOG_DBG("%s %d %s(%p) port: %s, type: %s\n", __FILE__, __LINE__, + __func__, dpif, dpif_port.name, dpif_port.type); + if (dpif_port.type && !strcmp(dpif_port.type, "internal")) { + if (!strcmp(dpif_port.name, "skip_hw")) { + tc_set_skip_hw(true); + } + continue; + } + if (!netdev_open(dpif_port.name, dpif_port.type, &netdev)) { + VLOG_DBG + ("%s %d %s(%p) opened a new netdev: %s, type: %s, ifindex: %d\n", + __FILE__, __LINE__, __func__, dpif, netdev->name, + netdev->netdev_class->type, netdev_get_ifindex(netdev)); + port_add(dpif, dpif_port.port_no, netdev); + } + } + } + VLOG_DBG("%s %d %s(%p) port dump end.\n", __FILE__, __LINE__, __func__, + dpif); + return 0; } @@ -634,19 +670,35 @@ static int dpif_hw_netlink_port_add(struct dpif *dpif_, struct netdev *netdev, odp_port_t * port_nop) { + int error; struct dpif_hw_netlink *dpif = dpif_hw_netlink_cast(dpif_); - return dpif->lp_dpif_netlink->dpif_class->port_add(dpif->lp_dpif_netlink, - netdev, port_nop); + VLOG_DBG("%s %d %s (%p): request to add netdev: %s\n", __FILE__, __LINE__, + __func__, dpif, netdev->name); + error = + dpif->lp_dpif_netlink->dpif_class->port_add(dpif->lp_dpif_netlink, + netdev, port_nop); + if (!error) + port_add(dpif, *port_nop, netdev); + else + VLOG_ERR("%s %d %s (%p): failed to add port\n", __FILE__, __LINE__, + __func__, dpif); + + return error; } static int dpif_hw_netlink_port_del(struct dpif *dpif_, odp_port_t port_no) { + int error; struct dpif_hw_netlink *dpif = dpif_hw_netlink_cast(dpif_); - return dpif->lp_dpif_netlink->dpif_class->port_del(dpif->lp_dpif_netlink, - port_no); + error = + dpif->lp_dpif_netlink->dpif_class->port_del(dpif->lp_dpif_netlink, + port_no); + if (!error) + port_del(dpif, port_no); + return error; } static int -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev