parent
86514214e3
commit
9c8e3101ce
|
@ -374,9 +374,8 @@ int lldp_mib_add_objects(Prioq *by_expiry,
|
|||
}
|
||||
|
||||
/* Admission Control: Can this port attached to the existing chassis ? */
|
||||
if (REFCNT_GET(c->n_ref) >= LLDP_MIB_MAX_PORT_PER_CHASSIS) {
|
||||
log_lldp("Port limit reached. Chassis has: %d ports. Dropping ...",
|
||||
REFCNT_GET(c->n_ref));
|
||||
if (c->n_ref >= LLDP_MIB_MAX_PORT_PER_CHASSIS) {
|
||||
log_lldp("Port limit reached. Chassis has: %d ports. Dropping ...", c->n_ref);
|
||||
|
||||
c = NULL;
|
||||
goto drop;
|
||||
|
@ -394,7 +393,7 @@ int lldp_mib_add_objects(Prioq *by_expiry,
|
|||
|
||||
/* Attach new port to chassis */
|
||||
LIST_PREPEND(port, c->ports, p);
|
||||
REFCNT_INC(c->n_ref);
|
||||
c->n_ref ++;
|
||||
|
||||
p = NULL;
|
||||
c = NULL;
|
||||
|
@ -424,7 +423,8 @@ void lldp_neighbour_port_remove_and_free(lldp_neighbour_port *p) {
|
|||
lldp_neighbour_port_free(p);
|
||||
|
||||
/* Drop the Chassis if no port is attached */
|
||||
if (REFCNT_DEC(c->n_ref) <= 1) {
|
||||
c->n_ref --;
|
||||
if (c->n_ref <= 1) {
|
||||
hashmap_remove(c->neighbour_mib, &c->chassis_id);
|
||||
lldp_chassis_free(c);
|
||||
}
|
||||
|
@ -486,7 +486,7 @@ void lldp_chassis_free(lldp_chassis *c) {
|
|||
if (!c)
|
||||
return;
|
||||
|
||||
if (REFCNT_GET(c->n_ref) > 1)
|
||||
if (c->n_ref > 1)
|
||||
return;
|
||||
|
||||
free(c->chassis_id.data);
|
||||
|
@ -513,7 +513,7 @@ int lldp_chassis_new(tlv_packet *tlv,
|
|||
if (!c)
|
||||
return -ENOMEM;
|
||||
|
||||
c->n_ref = REFCNT_INIT;
|
||||
c->n_ref = 1;
|
||||
c->chassis_id.type = type;
|
||||
c->chassis_id.length = length;
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
#include "log.h"
|
||||
#include "list.h"
|
||||
#include "refcnt.h"
|
||||
#include "lldp-tlv.h"
|
||||
#include "prioq.h"
|
||||
|
||||
|
@ -63,7 +62,7 @@ struct lldp_chassis_id {
|
|||
};
|
||||
|
||||
struct lldp_chassis {
|
||||
RefCount n_ref;
|
||||
unsigned n_ref;
|
||||
|
||||
lldp_chassis_id chassis_id;
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <sys/ioctl.h>
|
||||
|
||||
#include "socket-util.h"
|
||||
#include "refcnt.h"
|
||||
#include "async.h"
|
||||
|
||||
#include "dhcp6-internal.h"
|
||||
|
@ -47,7 +46,7 @@ enum icmp6_nd_state {
|
|||
typedef struct ICMP6Prefix ICMP6Prefix;
|
||||
|
||||
struct ICMP6Prefix {
|
||||
RefCount n_ref;
|
||||
unsigned n_ref;
|
||||
|
||||
LIST_FIELDS(ICMP6Prefix, prefixes);
|
||||
|
||||
|
@ -57,7 +56,7 @@ struct ICMP6Prefix {
|
|||
};
|
||||
|
||||
struct sd_icmp6_nd {
|
||||
RefCount n_ref;
|
||||
unsigned n_ref;
|
||||
|
||||
enum icmp6_nd_state state;
|
||||
sd_event *event;
|
||||
|
@ -78,13 +77,18 @@ struct sd_icmp6_nd {
|
|||
#define log_icmp6_nd(p, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "ICMPv6 CLIENT: " fmt, ##__VA_ARGS__)
|
||||
|
||||
static ICMP6Prefix *icmp6_prefix_unref(ICMP6Prefix *prefix) {
|
||||
if (prefix && REFCNT_DEC(prefix->n_ref) <= 0) {
|
||||
prefix->timeout_valid =
|
||||
sd_event_source_unref(prefix->timeout_valid);
|
||||
|
||||
free(prefix);
|
||||
}
|
||||
if (!prefix)
|
||||
return NULL;
|
||||
|
||||
assert(prefix->n_ref > 0);
|
||||
prefix->n_ref--;
|
||||
|
||||
if (prefix->n_ref > 0)
|
||||
return NULL;
|
||||
|
||||
prefix->timeout_valid = sd_event_source_unref(prefix->timeout_valid);
|
||||
free(prefix);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -97,7 +101,7 @@ static int icmp6_prefix_new(ICMP6Prefix **ret) {
|
|||
if (!prefix)
|
||||
return -ENOMEM;
|
||||
|
||||
prefix->n_ref = REFCNT_INIT;
|
||||
prefix->n_ref = 1;
|
||||
LIST_INIT(prefixes, prefix);
|
||||
|
||||
*ret = prefix;
|
||||
|
@ -176,9 +180,12 @@ sd_event *sd_icmp6_nd_get_event(sd_icmp6_nd *nd) {
|
|||
}
|
||||
|
||||
sd_icmp6_nd *sd_icmp6_nd_ref(sd_icmp6_nd *nd) {
|
||||
assert (nd);
|
||||
|
||||
assert_se(REFCNT_INC(nd->n_ref) >= 2);
|
||||
if (!nd)
|
||||
return NULL;
|
||||
|
||||
assert(nd->n_ref > 0);
|
||||
nd->n_ref++;
|
||||
|
||||
return nd;
|
||||
}
|
||||
|
@ -194,21 +201,28 @@ static int icmp6_nd_init(sd_icmp6_nd *nd) {
|
|||
}
|
||||
|
||||
sd_icmp6_nd *sd_icmp6_nd_unref(sd_icmp6_nd *nd) {
|
||||
if (nd && REFCNT_DEC(nd->n_ref) == 0) {
|
||||
ICMP6Prefix *prefix, *p;
|
||||
ICMP6Prefix *prefix, *p;
|
||||
|
||||
icmp6_nd_init(nd);
|
||||
sd_icmp6_nd_detach_event(nd);
|
||||
if (!nd)
|
||||
return NULL;
|
||||
|
||||
LIST_FOREACH_SAFE(prefixes, prefix, p, nd->prefixes) {
|
||||
LIST_REMOVE(prefixes, nd->prefixes, prefix);
|
||||
assert(nd->n_ref > 0);
|
||||
nd->n_ref--;
|
||||
|
||||
prefix = icmp6_prefix_unref(prefix);
|
||||
}
|
||||
if (nd->n_ref > 0)
|
||||
return NULL;
|
||||
|
||||
free(nd);
|
||||
icmp6_nd_init(nd);
|
||||
sd_icmp6_nd_detach_event(nd);
|
||||
|
||||
LIST_FOREACH_SAFE(prefixes, prefix, p, nd->prefixes) {
|
||||
LIST_REMOVE(prefixes, nd->prefixes, prefix);
|
||||
|
||||
prefix = icmp6_prefix_unref(prefix);
|
||||
}
|
||||
|
||||
free(nd);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -224,7 +238,7 @@ int sd_icmp6_nd_new(sd_icmp6_nd **ret) {
|
|||
if (!nd)
|
||||
return -ENOMEM;
|
||||
|
||||
nd->n_ref = REFCNT_INIT;
|
||||
nd->n_ref = 1;
|
||||
|
||||
nd->index = -1;
|
||||
nd->fd = -1;
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "util.h"
|
||||
#include "siphash24.h"
|
||||
#include "list.h"
|
||||
#include "refcnt.h"
|
||||
#include "random-util.h"
|
||||
|
||||
#include "ipv4ll-internal.h"
|
||||
|
@ -68,7 +67,7 @@ typedef enum IPv4LLState {
|
|||
} IPv4LLState;
|
||||
|
||||
struct sd_ipv4ll {
|
||||
RefCount n_ref;
|
||||
unsigned n_ref;
|
||||
|
||||
IPv4LLState state;
|
||||
int index;
|
||||
|
@ -598,30 +597,39 @@ int sd_ipv4ll_stop(sd_ipv4ll *ll) {
|
|||
}
|
||||
|
||||
sd_ipv4ll *sd_ipv4ll_ref(sd_ipv4ll *ll) {
|
||||
if (ll)
|
||||
assert_se(REFCNT_INC(ll->n_ref) >= 2);
|
||||
|
||||
if (!ll)
|
||||
return NULL;
|
||||
|
||||
assert(ll->n_ref >= 1);
|
||||
ll->n_ref++;
|
||||
|
||||
return ll;
|
||||
}
|
||||
|
||||
sd_ipv4ll *sd_ipv4ll_unref(sd_ipv4ll *ll) {
|
||||
if (ll && REFCNT_DEC(ll->n_ref) == 0) {
|
||||
ll->receive_message =
|
||||
sd_event_source_unref(ll->receive_message);
|
||||
ll->fd = safe_close(ll->fd);
|
||||
|
||||
ll->timer = sd_event_source_unref(ll->timer);
|
||||
|
||||
sd_ipv4ll_detach_event(ll);
|
||||
|
||||
free(ll->random_data);
|
||||
free(ll->random_data_state);
|
||||
free(ll);
|
||||
|
||||
if (!ll)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ll;
|
||||
assert(ll->n_ref >= 1);
|
||||
ll->n_ref--;
|
||||
|
||||
if (ll->n_ref > 0)
|
||||
return ll;
|
||||
|
||||
ll->receive_message = sd_event_source_unref(ll->receive_message);
|
||||
ll->fd = safe_close(ll->fd);
|
||||
|
||||
ll->timer = sd_event_source_unref(ll->timer);
|
||||
|
||||
sd_ipv4ll_detach_event(ll);
|
||||
|
||||
free(ll->random_data);
|
||||
free(ll->random_data_state);
|
||||
free(ll);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_ipv4ll*, sd_ipv4ll_unref);
|
||||
|
@ -636,7 +644,7 @@ int sd_ipv4ll_new(sd_ipv4ll **ret) {
|
|||
if (!ll)
|
||||
return -ENOMEM;
|
||||
|
||||
ll->n_ref = REFCNT_INIT;
|
||||
ll->n_ref = 1;
|
||||
ll->state = IPV4LL_STATE_INIT;
|
||||
ll->index = -1;
|
||||
ll->fd = -1;
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "random-util.h"
|
||||
#include "socket-util.h"
|
||||
#include "async.h"
|
||||
#include "refcnt.h"
|
||||
#include "utf8.h"
|
||||
|
||||
#define PPPOE_MAX_PACKET_SIZE 1484
|
||||
|
@ -68,7 +67,7 @@ typedef struct PPPoETags {
|
|||
} PPPoETags;
|
||||
|
||||
struct sd_pppoe {
|
||||
RefCount n_ref;
|
||||
unsigned n_ref;
|
||||
|
||||
PPPoEState state;
|
||||
uint64_t host_uniq;
|
||||
|
@ -202,23 +201,34 @@ int sd_pppoe_detach_event(sd_pppoe *ppp) {
|
|||
}
|
||||
|
||||
sd_pppoe *sd_pppoe_ref(sd_pppoe *ppp) {
|
||||
if (ppp)
|
||||
assert_se(REFCNT_INC(ppp->n_ref) >= 2);
|
||||
|
||||
if (!ppp)
|
||||
return NULL;
|
||||
|
||||
assert(ppp->n_ref > 0);
|
||||
ppp->n_ref++;
|
||||
|
||||
return ppp;
|
||||
}
|
||||
|
||||
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) {
|
||||
if (ppp && REFCNT_DEC(ppp->n_ref) <= 0) {
|
||||
pppoe_tags_clear(&ppp->tags);
|
||||
free(ppp->ifname);
|
||||
free(ppp->service_name);
|
||||
sd_pppoe_stop(ppp);
|
||||
sd_pppoe_detach_event(ppp);
|
||||
|
||||
free(ppp);
|
||||
}
|
||||
if (!ppp)
|
||||
return NULL;
|
||||
|
||||
assert(ppp->n_ref > 0);
|
||||
ppp->n_ref--;
|
||||
|
||||
if (ppp->n_ref > 0)
|
||||
return NULL;
|
||||
|
||||
pppoe_tags_clear(&ppp->tags);
|
||||
free(ppp->ifname);
|
||||
free(ppp->service_name);
|
||||
sd_pppoe_stop(ppp);
|
||||
sd_pppoe_detach_event(ppp);
|
||||
|
||||
free(ppp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -231,7 +241,7 @@ int sd_pppoe_new (sd_pppoe **ret) {
|
|||
if (!ppp)
|
||||
return -ENOMEM;
|
||||
|
||||
ppp->n_ref = REFCNT_INIT;
|
||||
ppp->n_ref = 1;
|
||||
ppp->state = _PPPOE_STATE_INVALID;
|
||||
ppp->ifindex = -1;
|
||||
ppp->fd = -1;
|
||||
|
|
Loading…
Reference in a new issue