-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpeers.c
More file actions
56 lines (48 loc) · 1.31 KB
/
Copy pathpeers.c
File metadata and controls
56 lines (48 loc) · 1.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// SPDX-License-Identifier: GPL-2.0-only
#include "lldp.h"
#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_VAR(x) x[0], x[1], x[2], x[3], x[4], x[5]
void
peer_delete(struct peer *peer)
{
avl_delete(&peer->lldp->peers, &peer->avl);
uloop_timeout_cancel(&peer->timer);
free(peer->attr);
free(peer);
lldp_global.count_peers--;
}
static void
peer_timer_cb(struct uloop_timeout *timer)
{
struct peer *peer = container_of(timer, struct peer, timer);
ULOG_INFO("remove peer "MAC_FMT"\n", MAC_VAR(peer->addr));
peer_delete(peer);
}
void
peer_upsert(struct lldp *lldp, __u8 *addr, int ttl, struct blob_attr *attr)
{
struct peer *peer;
peer = avl_find_element(&lldp->peers, addr, peer, avl);
if (!peer) {
if (lldp_global.count_peers >= lldp_global.max_peers)
return;
peer = malloc(sizeof(struct peer));
if (!peer)
return;
memset(peer, 0, sizeof(*peer));
memcpy(peer->addr, addr, ETH_ALEN);
peer->avl.key = peer->addr;
peer->timer.cb = peer_timer_cb;
peer->lldp = lldp;
avl_insert(&lldp->peers, &peer->avl);
ULOG_INFO("new peer "MAC_FMT"\n", MAC_VAR(peer->addr));
lldp_global.count_peers++;
} else {
free(peer->attr);
}
peer->ttl = ttl;
peer->attr = blob_memdup(attr);
peer->rx_count++;
clock_gettime(CLOCK_MONOTONIC, &peer->seen);
uloop_timeout_set(&peer->timer, peer->ttl * 1000);
}