X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=816d4025f9d4bd770305b0f139f028182309411c;hb=70feacd5320c141c6f81d9557c0e608326b4d169;hp=4c25f1393884004b732b107cba4bca8d04c95ed9;hpb=576e26d7b47f4e53116ef0b5f035d260f426d37b;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 4c25f139..816d4025 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -219,7 +219,7 @@ create_dp_netdev(const char *name, int dp_idx, struct dpif **dpifp) } /* Create datapath. */ - dp_netdevs[dp_idx] = dp = xcalloc(1, sizeof *dp); + dp_netdevs[dp_idx] = dp = xzalloc(sizeof *dp); list_push_back(&dp_netdev_list, &dp->node); dp->dp_idx = dp_idx; dp->open_cnt = 0; @@ -373,9 +373,13 @@ do_add_port(struct dp_netdev *dp, const char *devname, uint16_t flags, if (!internal) { error = netdev_open(devname, NETDEV_ETH_TYPE_ANY, &netdev); } else { - char *tapname = xasprintf("tap:%s", devname); - error = netdev_open(tapname, NETDEV_ETH_TYPE_ANY, &netdev); - free(tapname); + error = netdev_create(devname, "tap", NULL); + if (!error) { + error = netdev_open(devname, NETDEV_ETH_TYPE_ANY, &netdev); + if (error) { + netdev_destroy(devname); + } + } } if (error) { return error; @@ -468,6 +472,7 @@ static int do_del_port(struct dp_netdev *dp, uint16_t port_no) { struct dp_netdev_port *port; + char *name; int error; error = get_port_by_number(dp, port_no, &port); @@ -480,7 +485,12 @@ do_del_port(struct dp_netdev *dp, uint16_t port_no) dp->n_ports--; dp->serial++; + name = xstrdup(netdev_get_name(port->netdev)); netdev_close(port->netdev); + if (port->internal) { + netdev_destroy(name); + } + free(name); free(port); return 0; @@ -665,7 +675,7 @@ dp_netdev_lookup_flow(const struct dp_netdev *dp, const flow_t *key) } static void -answer_flow_query(const struct dp_netdev_flow *flow, +answer_flow_query(struct dp_netdev_flow *flow, uint32_t query_flags, struct odp_flow *odp_flow) { if (flow) { @@ -683,6 +693,11 @@ answer_flow_query(const struct dp_netdev_flow *flow, n * sizeof *odp_flow->actions); odp_flow->n_actions = flow->n_actions; } + + if (query_flags & ODPFF_ZERO_TCP_FLAGS) { + flow->tcp_ctl = 0; + } + } else { odp_flow->stats.error = ENOENT; } @@ -696,7 +711,8 @@ dpif_netdev_flow_get(const struct dpif *dpif, struct odp_flow flows[], int n) for (i = 0; i < n; i++) { struct odp_flow *odp_flow = &flows[i]; - answer_flow_query(dp_netdev_lookup_flow(dp, &odp_flow->key), odp_flow); + answer_flow_query(dp_netdev_lookup_flow(dp, &odp_flow->key), + odp_flow->flags, odp_flow); } return 0; } @@ -788,7 +804,7 @@ add_flow(struct dpif *dpif, struct odp_flow *odp_flow) struct dp_netdev_flow *flow; int error; - flow = xcalloc(1, sizeof *flow); + flow = xzalloc(sizeof *flow); flow->key = odp_flow->key; flow->key.reserved = 0; @@ -852,7 +868,7 @@ dpif_netdev_flow_del(struct dpif *dpif, struct odp_flow *odp_flow) flow = dp_netdev_lookup_flow(dp, &odp_flow->key); if (flow) { - answer_flow_query(flow, odp_flow); + answer_flow_query(flow, 0, odp_flow); dp_netdev_free_flow(dp, flow); return 0; } else { @@ -872,7 +888,7 @@ dpif_netdev_flow_list(const struct dpif *dpif, struct odp_flow flows[], int n) if (i >= n) { break; } - answer_flow_query(flow, &flows[i++]); + answer_flow_query(flow, 0, &flows[i++]); } return hmap_count(&dp->flow_table); }