X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=1daa93b299aa53f64d05b9ff3ff940669e07c727;hb=54e05b5f6f7d3504dc74a73dcf9707cbdb28d1d1;hp=35724d9bf837be03b3f8b9eab9d33111c273b0af;hpb=fde05aded2906e113d02aa13d207d9a6e3e0ea99;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 35724d9b..1daa93b2 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -245,7 +245,7 @@ create_dp_netdev(const char *name, int dp_idx, struct dpif **dpifp) } static int -dpif_netdev_open(const char *name UNUSED, char *suffix, bool create, +dpif_netdev_open(const char *name OVS_UNUSED, char *suffix, bool create, struct dpif **dpifp) { if (create) { @@ -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; @@ -573,7 +583,7 @@ dpif_netdev_port_list(const struct dpif *dpif, struct odp_port *ports, int n) } static int -dpif_netdev_port_poll(const struct dpif *dpif_, char **devnamep UNUSED) +dpif_netdev_port_poll(const struct dpif *dpif_, char **devnamep OVS_UNUSED) { struct dpif_netdev *dpif = dpif_netdev_cast(dpif_); if (dpif->dp_serial != dpif->dp->serial) { @@ -742,7 +752,7 @@ dpif_netdev_validate_actions(const union odp_action *actions, int n_actions, case ODPAT_SET_VLAN_PCP: *mutates = true; - if (a->vlan_pcp.vlan_pcp & ~VLAN_PCP_MASK) { + if (a->vlan_pcp.vlan_pcp & ~(VLAN_PCP_MASK >> VLAN_PCP_SHIFT)) { return EINVAL; } break; @@ -1323,6 +1333,8 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_execute, dpif_netdev_recv_get_mask, dpif_netdev_recv_set_mask, + NULL, /* get_sflow_probability */ + NULL, /* set_sflow_probability */ dpif_netdev_recv, dpif_netdev_recv_wait, };