]> git.ipfire.org Git - thirdparty/lldpd.git/blob - src/lldpd-structs.c
b142ff07db7f657d4d4b4d03f9e8ecc61d288713
[thirdparty/lldpd.git] / src / lldpd-structs.c
1 /* -*- mode: c; c-file-style: "openbsd" -*- */
2 /*
3 * Copyright (c) 2008 Vincent Bernat <bernat@luffy.cx>
4 *
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.
8 *
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.
16 */
17
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <time.h>
21 #include "lldpd-structs.h"
22
23 void
24 lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *chassis)
25 {
26 struct lldpd_mgmt *mgmt, *mgmt_next;
27 for (mgmt = TAILQ_FIRST(&chassis->c_mgmt);
28 mgmt != NULL;
29 mgmt = mgmt_next) {
30 mgmt_next = TAILQ_NEXT(mgmt, m_entries);
31 free(mgmt);
32 }
33 TAILQ_INIT(&chassis->c_mgmt);
34 }
35
36 void
37 lldpd_chassis_cleanup(struct lldpd_chassis *chassis, int all)
38 {
39 #ifdef ENABLE_LLDPMED
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);
47 #endif
48 free(chassis->c_id);
49 free(chassis->c_name);
50 free(chassis->c_descr);
51 lldpd_chassis_mgmt_cleanup(chassis);
52 if (all)
53 free(chassis);
54 }
55
56 #ifdef ENABLE_DOT1
57 void
58 lldpd_vlan_cleanup(struct lldpd_port *port)
59 {
60 struct lldpd_vlan *vlan, *vlan_next;
61 for (vlan = TAILQ_FIRST(&port->p_vlans);
62 vlan != NULL;
63 vlan = vlan_next) {
64 free(vlan->v_name);
65 vlan_next = TAILQ_NEXT(vlan, v_entries);
66 free(vlan);
67 }
68 TAILQ_INIT(&port->p_vlans);
69 }
70
71 void
72 lldpd_ppvid_cleanup(struct lldpd_port *port)
73 {
74 struct lldpd_ppvid *ppvid, *ppvid_next;
75 for (ppvid = TAILQ_FIRST(&port->p_ppvids);
76 ppvid != NULL;
77 ppvid = ppvid_next) {
78 ppvid_next = TAILQ_NEXT(ppvid, p_entries);
79 free(ppvid);
80 }
81 TAILQ_INIT(&port->p_ppvids);
82 }
83
84 void
85 lldpd_pi_cleanup(struct lldpd_port *port)
86 {
87 struct lldpd_pi *pi, *pi_next;
88 for (pi = TAILQ_FIRST(&port->p_pids);
89 pi != NULL;
90 pi = pi_next) {
91 free(pi->p_pi);
92 pi_next = TAILQ_NEXT(pi, p_entries);
93 free(pi);
94 }
95 TAILQ_INIT(&port->p_pids);
96 }
97 #endif
98
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
101 * removed. */
102 void
103 lldpd_remote_cleanup(struct lldpd_hardware *hardware,
104 void(*expire)(struct lldpd_hardware *, struct lldpd_port *))
105 {
106 struct lldpd_port *port, *port_next;
107 int del;
108 for (port = TAILQ_FIRST(&hardware->h_rports);
109 port != NULL;
110 port = port_next) {
111 port_next = TAILQ_NEXT(port, p_entries);
112 del = (expire == NULL);
113 if (expire &&
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);
118 del = 1;
119 }
120 if (del) {
121 if (expire)
122 TAILQ_REMOVE(&hardware->h_rports, port, p_entries);
123 lldpd_port_cleanup(port, 1);
124 free(port);
125 }
126 }
127 if (!expire) TAILQ_INIT(&hardware->h_rports);
128 }
129
130 /* If `all' is true, clear all information, including information that
131 are not refreshed periodically. Port should be freed manually. */
132 void
133 lldpd_port_cleanup(struct lldpd_port *port, int all)
134 {
135 #ifdef ENABLE_LLDPMED
136 int i;
137 if (all)
138 for (i=0; i < LLDP_MED_LOCFORMAT_LAST; i++)
139 free(port->p_med_location[i].data);
140 #endif
141 #ifdef ENABLE_DOT1
142 lldpd_vlan_cleanup(port);
143 lldpd_ppvid_cleanup(port);
144 lldpd_pi_cleanup(port);
145 #endif
146 free(port->p_id);
147 free(port->p_descr);
148 if (all) {
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;
153 }
154 }
155 }
156
157 void
158 lldpd_config_cleanup(struct lldpd_config *config)
159 {
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);
165 }