X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto.c;h=56432194c2f35e82b3879ae2417c5eecc465a257;hb=fa60c01995566c3ec0f7a153aaafa6826128a23a;hp=79fe14c4d94f7be5c8fb47e2dc1b50b7904e19df;hpb=8cd4882fd5c3080816a070ad582ef06842f7c482;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 79fe14c4..56432194 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -235,7 +235,7 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); static const struct ofhooks default_ofhooks; -static uint64_t pick_datapath_id(struct dpif *, uint64_t fallback_dpid); +static uint64_t pick_datapath_id(const struct ofproto *); static uint64_t pick_fallback_dpid(void); static void send_packet_in_miss(struct ofpbuf *, void *ofproto); static void send_packet_in_action(struct ofpbuf *, void *ofproto); @@ -302,8 +302,7 @@ ofproto_create(const char *datapath, const struct ofhooks *ofhooks, void *aux, /* Initialize settings. */ p = xcalloc(1, sizeof *p); p->fallback_dpid = pick_fallback_dpid(); - p->datapath_id = pick_datapath_id(dpif, p->fallback_dpid); - VLOG_INFO("using datapath ID %012"PRIx64, p->datapath_id); + p->datapath_id = p->fallback_dpid; p->manufacturer = xstrdup("Nicira Networks, Inc."); p->hardware = xstrdup("Reference Implementation"); p->software = xstrdup(VERSION BUILDNR); @@ -363,6 +362,10 @@ ofproto_create(const char *datapath, const struct ofhooks *ofhooks, void *aux, return error; } + /* Pick final datapath ID. */ + p->datapath_id = pick_datapath_id(p); + VLOG_INFO("using datapath ID %012"PRIx64, p->datapath_id); + *ofprotop = p; return 0; } @@ -371,9 +374,7 @@ void ofproto_set_datapath_id(struct ofproto *p, uint64_t datapath_id) { uint64_t old_dpid = p->datapath_id; - p->datapath_id = (datapath_id - ? datapath_id - : pick_datapath_id(p->dpif, p->fallback_dpid)); + p->datapath_id = datapath_id ? datapath_id : pick_datapath_id(p); if (p->datapath_id != old_dpid) { VLOG_INFO("datapath ID changed to %012"PRIx64, p->datapath_id); rconn_reconnect(p->controller->rconn); @@ -431,8 +432,9 @@ ofproto_set_in_band(struct ofproto *p, bool in_band) { if (in_band != (p->in_band != NULL)) { if (in_band) { - return in_band_create(p, p->dpif, p->switch_status, - p->controller->rconn, &p->in_band); + in_band_create(p, p->switch_status, p->controller->rconn, + &p->in_band); + return 0; } else { ofproto_set_discovery(p, false, NULL, true); in_band_destroy(p->in_band); @@ -635,6 +637,12 @@ ofproto_get_datapath_id(const struct ofproto *ofproto) return ofproto->datapath_id; } +uint64_t +ofproto_get_mgmt_id(const struct ofproto *ofproto) +{ + return ofproto->mgmt_id; +} + int ofproto_get_probe_interval(const struct ofproto *ofproto) { @@ -1114,7 +1122,7 @@ make_ofport(const struct odp_port *odp_port) ofport = xmalloc(sizeof *ofport); ofport->netdev = netdev; ofport->opp.port_no = odp_port_to_ofp_port(odp_port->port); - memcpy(ofport->opp.hw_addr, netdev_get_etheraddr(netdev), ETH_ALEN); + netdev_get_etheraddr(netdev, ofport->opp.hw_addr); memcpy(ofport->opp.name, odp_port->devname, MIN(sizeof ofport->opp.name, sizeof odp_port->devname)); ofport->opp.name[sizeof ofport->opp.name - 1] = '\0'; @@ -3240,24 +3248,23 @@ send_packet_in_miss(struct ofpbuf *packet, void *p_) } static uint64_t -pick_datapath_id(struct dpif *dpif, uint64_t fallback_dpid) +pick_datapath_id(const struct ofproto *ofproto) { - char local_name[IF_NAMESIZE]; - uint8_t ea[ETH_ADDR_LEN]; - int error; + const struct ofport *port; - error = dpif_port_get_name(dpif, ODPP_LOCAL, - local_name, sizeof local_name); - if (!error) { - error = netdev_nodev_get_etheraddr(local_name, ea); + port = port_array_get(&ofproto->ports, ODPP_LOCAL); + if (port) { + uint8_t ea[ETH_ADDR_LEN]; + int error; + + error = netdev_get_etheraddr(port->netdev, ea); if (!error) { return eth_addr_to_uint64(ea); } VLOG_WARN("could not get MAC address for %s (%s)", - local_name, strerror(error)); + netdev_get_name(port->netdev), strerror(error)); } - - return fallback_dpid; + return ofproto->fallback_dpid; } static uint64_t