]>
git.ipfire.org Git - thirdparty/lldpd.git/blob - src/lldpd-structs.c
1 /* -*- mode: c; c-file-style: "openbsd" -*- */
3 * Copyright (c) 2008 Vincent Bernat <bernat@luffy.cx>
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 #include "lldpd-structs.h"
25 lldpd_chassis_mgmt_cleanup(struct lldpd_chassis
*chassis
)
27 struct lldpd_mgmt
*mgmt
, *mgmt_next
;
29 log_debug("alloc", "cleanup management addresses for chassis %s",
30 chassis
->c_name
? chassis
->c_name
: "(unknwon)");
32 for (mgmt
= TAILQ_FIRST(&chassis
->c_mgmt
);
35 mgmt_next
= TAILQ_NEXT(mgmt
, m_entries
);
38 TAILQ_INIT(&chassis
->c_mgmt
);
42 lldpd_chassis_cleanup(struct lldpd_chassis
*chassis
, int all
)
44 lldpd_chassis_mgmt_cleanup(chassis
);
45 log_debug("alloc", "cleanup chassis %s",
46 chassis
->c_name
? chassis
->c_name
: "(unknwon)");
48 free(chassis
->c_med_hw
);
49 free(chassis
->c_med_sw
);
50 free(chassis
->c_med_fw
);
51 free(chassis
->c_med_sn
);
52 free(chassis
->c_med_manuf
);
53 free(chassis
->c_med_model
);
54 free(chassis
->c_med_asset
);
57 free(chassis
->c_name
);
58 free(chassis
->c_descr
);
65 lldpd_vlan_cleanup(struct lldpd_port
*port
)
67 struct lldpd_vlan
*vlan
, *vlan_next
;
68 for (vlan
= TAILQ_FIRST(&port
->p_vlans
);
72 vlan_next
= TAILQ_NEXT(vlan
, v_entries
);
75 TAILQ_INIT(&port
->p_vlans
);
79 lldpd_ppvid_cleanup(struct lldpd_port
*port
)
81 struct lldpd_ppvid
*ppvid
, *ppvid_next
;
82 for (ppvid
= TAILQ_FIRST(&port
->p_ppvids
);
85 ppvid_next
= TAILQ_NEXT(ppvid
, p_entries
);
88 TAILQ_INIT(&port
->p_ppvids
);
92 lldpd_pi_cleanup(struct lldpd_port
*port
)
94 struct lldpd_pi
*pi
, *pi_next
;
95 for (pi
= TAILQ_FIRST(&port
->p_pids
);
99 pi_next
= TAILQ_NEXT(pi
, p_entries
);
102 TAILQ_INIT(&port
->p_pids
);
106 /* Cleanup a remote port. The before last argument, `expire` is a function that
107 * should be called when a remote port is removed. If the last argument is 1,
108 * all remote ports are removed.
111 lldpd_remote_cleanup(struct lldpd_hardware
*hardware
,
112 void(*expire
)(struct lldpd_hardware
*, struct lldpd_port
*),
115 struct lldpd_port
*port
, *port_next
;
117 time_t now
= time(NULL
);
119 log_debug("alloc", "cleanup remote port on %s",
121 for (port
= TAILQ_FIRST(&hardware
->h_rports
);
124 port_next
= TAILQ_NEXT(port
, p_entries
);
127 (now
- port
->p_lastupdate
>= port
->p_chassis
->c_ttl
)) {
128 hardware
->h_ageout_cnt
++;
129 hardware
->h_delete_cnt
++;
133 expire(hardware
, port
);
134 TAILQ_REMOVE(&hardware
->h_rports
, port
, p_entries
);
135 lldpd_port_cleanup(port
, 1);
139 if (all
) TAILQ_INIT(&hardware
->h_rports
);
142 /* If `all' is true, clear all information, including information that
143 are not refreshed periodically. Port should be freed manually. */
145 lldpd_port_cleanup(struct lldpd_port
*port
, int all
)
147 #ifdef ENABLE_LLDPMED
150 for (i
=0; i
< LLDP_MED_LOCFORMAT_LAST
; i
++)
151 free(port
->p_med_location
[i
].data
);
154 lldpd_vlan_cleanup(port
);
155 lldpd_ppvid_cleanup(port
);
156 lldpd_pi_cleanup(port
);
161 free(port
->p_lastframe
);
162 if (port
->p_chassis
) { /* chassis may not have been attributed, yet */
163 port
->p_chassis
->c_refcount
--;
164 port
->p_chassis
= NULL
;
170 lldpd_config_cleanup(struct lldpd_config
*config
)
172 log_debug("alloc", "general configuration cleanup");
173 free(config
->c_mgmt_pattern
);
174 free(config
->c_cid_pattern
);
175 free(config
->c_iface_pattern
);
176 free(config
->c_platform
);
177 free(config
->c_description
);