X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flacp.c;h=4aee64f4835acacb7b724bd897bf1de8f7288535;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=fce65b31d470da7b126e20a45ff076f4925ba0e5;hpb=9dd165e0508143d36c73f258d8bcfdbbb356830a;p=sliver-openvswitch.git diff --git a/lib/lacp.c b/lib/lacp.c index fce65b31d..4aee64f48 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2012, 2013 Nicira, Inc. +/* Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,14 @@ #include +#include "connectivity.h" #include "dynamic-string.h" #include "hash.h" #include "hmap.h" #include "ofpbuf.h" #include "packets.h" #include "poll-loop.h" +#include "seq.h" #include "shash.h" #include "timer.h" #include "timeval.h" @@ -104,7 +106,7 @@ struct lacp { bool update; /* True if lacp_update() needs to be called. */ bool fallback_ab; /* True if fallback to active-backup on LACP failure. */ - atomic_int ref_cnt; + struct ovs_refcount ref_cnt; }; struct slave { @@ -179,7 +181,8 @@ parse_lacp_packet(const struct ofpbuf *b) { const struct lacp_pdu *pdu; - pdu = ofpbuf_at(b, (uint8_t *)b->l3 - (uint8_t *)b->data, LACP_PDU_LEN); + pdu = ofpbuf_at(b, (uint8_t *)ofpbuf_l3(b) - (uint8_t *)ofpbuf_data(b), + LACP_PDU_LEN); if (pdu && pdu->subtype == 1 && pdu->actor_type == 1 && pdu->actor_len == 20 @@ -214,7 +217,7 @@ lacp_create(void) OVS_EXCLUDED(mutex) lacp = xzalloc(sizeof *lacp); hmap_init(&lacp->slaves); - atomic_init(&lacp->ref_cnt, 1); + ovs_refcount_init(&lacp->ref_cnt); ovs_mutex_lock(&mutex); list_push_back(all_lacps, &lacp->node); @@ -227,9 +230,7 @@ lacp_ref(const struct lacp *lacp_) { struct lacp *lacp = CONST_CAST(struct lacp *, lacp_); if (lacp) { - int orig; - atomic_add(&lacp->ref_cnt, 1, &orig); - ovs_assert(orig > 0); + ovs_refcount_ref(&lacp->ref_cnt); } return lacp; } @@ -238,15 +239,7 @@ lacp_ref(const struct lacp *lacp_) void lacp_unref(struct lacp *lacp) OVS_EXCLUDED(mutex) { - int orig; - - if (!lacp) { - return; - } - - atomic_sub(&lacp->ref_cnt, 1, &orig); - ovs_assert(orig > 0); - if (orig == 1) { + if (lacp && ovs_refcount_unref(&lacp->ref_cnt) == 1) { struct slave *slave, *next; ovs_mutex_lock(&mutex); @@ -509,11 +502,16 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex) ovs_mutex_lock(&mutex); HMAP_FOR_EACH (slave, node, &lacp->slaves) { if (timer_expired(&slave->rx)) { + enum slave_status old_status = slave->status; + if (slave->status == LACP_CURRENT) { slave_set_expired(slave); } else if (slave->status == LACP_EXPIRED) { slave_set_defaulted(slave); } + if (slave->status != old_status) { + seq_change(connectivity_seq_get()); + } } } @@ -544,6 +542,7 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex) : LACP_SLOW_TIME_TX); timer_set_duration(&slave->tx, duration); + seq_change(connectivity_seq_get()); } } ovs_mutex_unlock(&mutex); @@ -897,7 +896,7 @@ lacp_print_details(struct ds *ds, struct lacp *lacp) OVS_REQUIRES(mutex) status = "defaulted"; break; default: - NOT_REACHED(); + OVS_NOT_REACHED(); } ds_put_format(ds, "\nslave: %s: %s %s\n", slave->name, status,