X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flearning-switch.c;h=9e028608c72d6270ba1e98f1fd60f9a9938692f1;hb=f80022d9df98d29ee41176a4bc6cb91025da84b8;hp=e572a34ca603b0a2f1bb55e0b630e520ab59e521;hpb=c545d38da7574831fec264716d626c82d90a8494;p=sliver-openvswitch.git diff --git a/lib/learning-switch.c b/lib/learning-switch.c index e572a34ca..9e028608c 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ VLOG_DEFINE_THIS_MODULE(learning_switch); struct lswitch_port { struct hmap_node hmap_node; /* Hash node for port number. */ - uint16_t port_no; /* OpenFlow port number, in host byte order. */ + ofp_port_t port_no; /* OpenFlow port number. */ uint32_t queue_id; /* OpenFlow queue number. */ }; @@ -208,7 +208,7 @@ lswitch_handshake(struct lswitch *sw) if (error) { VLOG_INFO_RL(&rl, "%s: failed to queue default flows (%s)", - rconn_get_name(sw->rconn), strerror(error)); + rconn_get_name(sw->rconn), ovs_strerror(error)); } } else { VLOG_INFO_RL(&rl, "%s: failed to set usable protocol", @@ -237,7 +237,7 @@ lswitch_destroy(struct lswitch *sw) free(node); } shash_destroy(&sw->queue_names); - mac_learning_destroy(sw->ml); + mac_learning_unref(sw->ml); rconn_packet_counter_destroy(sw->queued); free(sw); } @@ -409,7 +409,7 @@ send_features_request(struct lswitch *sw) struct ofp_switch_config *osc; int ofp_version = rconn_get_version(sw->rconn); - assert(ofp_version > 0 && ofp_version < 0xff); + ovs_assert(ofp_version > 0 && ofp_version < 0xff); /* Send OFPT_FEATURES_REQUEST. */ b = ofpraw_alloc(OFPRAW_OFPT_FEATURES_REQUEST, ofp_version, 0); @@ -433,7 +433,7 @@ queue_tx(struct lswitch *sw, struct ofpbuf *b) } else { VLOG_WARN_RL(&rl, "%016llx: %s: send: %s", sw->datapath_id, rconn_get_name(sw->rconn), - strerror(retval)); + ovs_strerror(retval)); } } } @@ -460,26 +460,27 @@ process_switch_features(struct lswitch *sw, struct ofp_header *oh) if (lp && hmap_node_is_null(&lp->hmap_node)) { lp->port_no = port.port_no; hmap_insert(&sw->queue_numbers, &lp->hmap_node, - hash_int(lp->port_no, 0)); + hash_ofp_port(lp->port_no)); } } return 0; } -static uint16_t +static ofp_port_t lswitch_choose_destination(struct lswitch *sw, const struct flow *flow) { - uint16_t out_port; + ofp_port_t out_port; /* Learn the source MAC. */ if (mac_learning_may_learn(sw->ml, flow->dl_src, 0)) { struct mac_entry *mac = mac_learning_insert(sw->ml, flow->dl_src, 0); - if (mac_entry_is_new(mac) || mac->port.i != flow->in_port) { + if (mac_entry_is_new(mac) + || mac->port.ofp_port != flow->in_port.ofp_port) { VLOG_DBG_RL(&rl, "%016llx: learned that "ETH_ADDR_FMT" is on " "port %"PRIu16, sw->datapath_id, - ETH_ADDR_ARGS(flow->dl_src), flow->in_port); + ETH_ADDR_ARGS(flow->dl_src), flow->in_port.ofp_port); - mac->port.i = flow->in_port; + mac->port.ofp_port = flow->in_port.ofp_port; mac_learning_changed(sw->ml, mac); } } @@ -495,8 +496,8 @@ lswitch_choose_destination(struct lswitch *sw, const struct flow *flow) mac = mac_learning_lookup(sw->ml, flow->dl_dst, 0, NULL); if (mac) { - out_port = mac->port.i; - if (out_port == flow->in_port) { + out_port = mac->port.ofp_port; + if (out_port == flow->in_port.ofp_port) { /* Don't send a packet back out its input port. */ return OFPP_NONE; } @@ -512,11 +513,11 @@ lswitch_choose_destination(struct lswitch *sw, const struct flow *flow) } static uint32_t -get_queue_id(const struct lswitch *sw, uint16_t in_port) +get_queue_id(const struct lswitch *sw, ofp_port_t in_port) { const struct lswitch_port *port; - HMAP_FOR_EACH_WITH_HASH (port, hmap_node, hash_int(in_port, 0), + HMAP_FOR_EACH_WITH_HASH (port, hmap_node, hash_ofp_port(in_port), &sw->queue_numbers) { if (port->port_no == in_port) { return port->queue_id; @@ -531,7 +532,7 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) { struct ofputil_packet_in pi; uint32_t queue_id; - uint16_t out_port; + ofp_port_t out_port; uint64_t ofpacts_stub[64 / 8]; struct ofpbuf ofpacts; @@ -541,6 +542,7 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) struct ofpbuf pkt; struct flow flow; + union flow_in_port in_port_; error = ofputil_decode_packet_in(&pi, oh); if (error) { @@ -558,7 +560,8 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) /* Extract flow data from 'opi' into 'flow'. */ ofpbuf_use_const(&pkt, pi.packet, pi.packet_len); - flow_extract(&pkt, 0, 0, NULL, pi.fmd.in_port, &flow); + in_port_.ofp_port = pi.fmd.in_port; + flow_extract(&pkt, 0, 0, NULL, &in_port_, &flow); flow.tunnel.tun_id = pi.fmd.tun_id; /* Choose output port. */ @@ -569,7 +572,8 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) ofpbuf_use_stack(&ofpacts, ofpacts_stub, sizeof ofpacts_stub); if (out_port == OFPP_NONE) { /* No actions. */ - } else if (queue_id == UINT32_MAX || out_port >= OFPP_MAX) { + } else if (queue_id == UINT32_MAX + || ofp_to_u16(out_port) >= ofp_to_u16(OFPP_MAX)) { ofpact_put_OUTPUT(&ofpacts)->port = out_port; } else { struct ofpact_enqueue *enqueue = ofpact_put_ENQUEUE(&ofpacts);