X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flearning-switch.c;h=8efbce1a5ebecc8c019e5cd9312a4e68408ba3fd;hb=ac60863f78e412004c5b69f5a64a49bc6f0bc46d;hp=c587930bad87a16ee163e71885ff8c3989a8467e;hpb=3442636d01d2a73a557952ad9140de07418c28c2;p=sliver-openvswitch.git diff --git a/lib/learning-switch.c b/lib/learning-switch.c index c587930ba..8efbce1a5 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -348,6 +348,7 @@ lswitch_process_packet(struct lswitch *sw, const struct ofpbuf *msg) case OFPTYPE_FLOW_MOD: case OFPTYPE_GROUP_MOD: case OFPTYPE_PORT_MOD: + case OFPTYPE_TABLE_MOD: case OFPTYPE_BARRIER_REQUEST: case OFPTYPE_BARRIER_REPLY: case OFPTYPE_QUEUE_GET_CONFIG_REQUEST: @@ -368,6 +369,7 @@ lswitch_process_packet(struct lswitch *sw, const struct ofpbuf *msg) case OFPTYPE_PORT_DESC_STATS_REPLY: case OFPTYPE_ROLE_REQUEST: case OFPTYPE_ROLE_REPLY: + case OFPTYPE_ROLE_STATUS: case OFPTYPE_SET_FLOW_FORMAT: case OFPTYPE_FLOW_MOD_TABLE_ID: case OFPTYPE_SET_PACKET_IN_FORMAT: @@ -476,19 +478,23 @@ lswitch_choose_destination(struct lswitch *sw, const struct flow *flow) ofp_port_t out_port; /* Learn the source MAC. */ - ovs_rwlock_wrlock(&sw->ml->rwlock); - 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->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.ofp_port); - - mac->port.ofp_port = flow->in_port.ofp_port; - mac_learning_changed(sw->ml); + if (sw->ml) { + ovs_rwlock_wrlock(&sw->ml->rwlock); + 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->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.ofp_port); + + mac->port.ofp_port = flow->in_port.ofp_port; + mac_learning_changed(sw->ml); + } } + ovs_rwlock_unlock(&sw->ml->rwlock); } - ovs_rwlock_unlock(&sw->ml->rwlock); /* Drop frames for reserved multicast addresses. */ if (eth_addr_is_reserved(flow->dl_dst)) {