X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=60fae5fad5b32247ba5689f10e0c7c12e3292892;hb=2e3fa633aad59f9687e2b6e3aad3b0a308aa89fc;hp=fb0a863e3e3378177f6ad2b892d274faf7260945;hpb=2197d7abab6d765013399790d11290562a583b71;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index fb0a863e..60fae5fa 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -407,7 +407,16 @@ dpif_netdev_port_add(struct dpif *dpif, struct netdev *netdev, struct dp_netdev *dp = get_dp_netdev(dpif); int port_no; - port_no = choose_port(dpif, netdev); + if (*port_nop != UINT16_MAX) { + if (*port_nop >= MAX_PORTS) { + return EFBIG; + } else if (dp->ports[*port_nop]) { + return EBUSY; + } + port_no = *port_nop; + } else { + port_no = choose_port(dpif, netdev); + } if (port_no >= 0) { *port_nop = port_no; return do_add_port(dp, netdev_get_name(netdev), @@ -713,10 +722,9 @@ set_flow_actions(struct dp_netdev_flow *flow, } static int -add_flow(struct dpif *dpif, const struct flow *key, - const struct nlattr *actions, size_t actions_len) +dp_netdev_flow_add(struct dp_netdev *dp, const struct flow *key, + const struct nlattr *actions, size_t actions_len) { - struct dp_netdev *dp = get_dp_netdev(dpif); struct dp_netdev_flow *flow; int error; @@ -762,7 +770,8 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put) if (put->stats) { memset(put->stats, 0, sizeof *put->stats); } - return add_flow(dpif, &key, put->actions, put->actions_len); + return dp_netdev_flow_add(dp, &key, put->actions, + put->actions_len); } else { return EFBIG; } @@ -956,7 +965,7 @@ dpif_netdev_recv(struct dpif *dpif, struct dpif_upcall *upcall, free(u); ofpbuf_uninit(buf); - *buf = *u->packet; + *buf = *upcall->packet; return 0; } else {