]>
git.ipfire.org Git - thirdparty/lldpd.git/blob - src/lldpd-structs.c
b142ff07db7f657d4d4b4d03f9e8ecc61d288713
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"
24 lldpd_chassis_mgmt_cleanup(struct lldpd_chassis
*chassis
)
26 struct lldpd_mgmt
*mgmt
, *mgmt_next
;
27 for (mgmt
= TAILQ_FIRST(&chassis
->c_mgmt
);
30 mgmt_next
= TAILQ_NEXT(mgmt
, m_entries
);
33 TAILQ_INIT(&chassis
->c_mgmt
);
37 lldpd_chassis_cleanup(struct lldpd_chassis
*chassis
, int all
)
40 free(chassis
->c_med_hw
);
41 free(chassis
->c_med_sw
);
42 free(chassis
->c_med_fw
);
43 free(chassis
->c_med_sn
);
44 free(chassis
->c_med_manuf
);
45 free(chassis
->c_med_model
);
46 free(chassis
->c_med_asset
);
49 free(chassis
->c_name
);
50 free(chassis
->c_descr
);
51 lldpd_chassis_mgmt_cleanup(chassis
);
58 lldpd_vlan_cleanup(struct lldpd_port
*port
)
60 struct lldpd_vlan
*vlan
, *vlan_next
;
61 for (vlan
= TAILQ_FIRST(&port
->p_vlans
);
65 vlan_next
= TAILQ_NEXT(vlan
, v_entries
);
68 TAILQ_INIT(&port
->p_vlans
);
72 lldpd_ppvid_cleanup(struct lldpd_port
*port
)
74 struct lldpd_ppvid
*ppvid
, *ppvid_next
;
75 for (ppvid
= TAILQ_FIRST(&port
->p_ppvids
);
78 ppvid_next
= TAILQ_NEXT(ppvid
, p_entries
);
81 TAILQ_INIT(&port
->p_ppvids
);
85 lldpd_pi_cleanup(struct lldpd_port
*port
)
87 struct lldpd_pi
*pi
, *pi_next
;
88 for (pi
= TAILQ_FIRST(&port
->p_pids
);
92 pi_next
= TAILQ_NEXT(pi
, p_entries
);
95 TAILQ_INIT(&port
->p_pids
);
99 /* Cleanup a remote port. The last argument, `expire` is a function that should
100 * be called when expiration happens. If it is NULL, all remote ports are
103 lldpd_remote_cleanup(struct lldpd_hardware
*hardware
,
104 void(*expire
)(struct lldpd_hardware
*, struct lldpd_port
*))
106 struct lldpd_port
*port
, *port_next
;
108 for (port
= TAILQ_FIRST(&hardware
->h_rports
);
111 port_next
= TAILQ_NEXT(port
, p_entries
);
112 del
= (expire
== NULL
);
114 (time(NULL
) - port
->p_lastupdate
> port
->p_chassis
->c_ttl
)) {
115 hardware
->h_ageout_cnt
++;
116 hardware
->h_delete_cnt
++;
117 expire(hardware
, port
);
122 TAILQ_REMOVE(&hardware
->h_rports
, port
, p_entries
);
123 lldpd_port_cleanup(port
, 1);
127 if (!expire
) TAILQ_INIT(&hardware
->h_rports
);
130 /* If `all' is true, clear all information, including information that
131 are not refreshed periodically. Port should be freed manually. */
133 lldpd_port_cleanup(struct lldpd_port
*port
, int all
)
135 #ifdef ENABLE_LLDPMED
138 for (i
=0; i
< LLDP_MED_LOCFORMAT_LAST
; i
++)
139 free(port
->p_med_location
[i
].data
);
142 lldpd_vlan_cleanup(port
);
143 lldpd_ppvid_cleanup(port
);
144 lldpd_pi_cleanup(port
);
149 free(port
->p_lastframe
);
150 if (port
->p_chassis
) { /* chassis may not have been attributed, yet */
151 port
->p_chassis
->c_refcount
--;
152 port
->p_chassis
= NULL
;
158 lldpd_config_cleanup(struct lldpd_config
*config
)
160 free(config
->c_mgmt_pattern
);
161 free(config
->c_cid_pattern
);
162 free(config
->c_iface_pattern
);
163 free(config
->c_platform
);
164 free(config
->c_description
);