]>
Commit | Line | Data |
---|---|---|
4b292b55 VB |
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" | |
6f8925be | 22 | #include "log.h" |
4b292b55 VB |
23 | |
24 | void | |
25 | lldpd_chassis_mgmt_cleanup(struct lldpd_chassis *chassis) | |
26 | { | |
27 | struct lldpd_mgmt *mgmt, *mgmt_next; | |
6f8925be VB |
28 | |
29 | log_debug("alloc", "cleanup management addresses for chassis %s", | |
30 | chassis->c_name ? chassis->c_name : "(unknwon)"); | |
31 | ||
4b292b55 VB |
32 | for (mgmt = TAILQ_FIRST(&chassis->c_mgmt); |
33 | mgmt != NULL; | |
34 | mgmt = mgmt_next) { | |
35 | mgmt_next = TAILQ_NEXT(mgmt, m_entries); | |
36 | free(mgmt); | |
37 | } | |
38 | TAILQ_INIT(&chassis->c_mgmt); | |
39 | } | |
40 | ||
41 | void | |
42 | lldpd_chassis_cleanup(struct lldpd_chassis *chassis, int all) | |
43 | { | |
e12c2365 | 44 | lldpd_chassis_mgmt_cleanup(chassis); |
6f8925be VB |
45 | log_debug("alloc", "cleanup chassis %s", |
46 | chassis->c_name ? chassis->c_name : "(unknwon)"); | |
4b292b55 VB |
47 | #ifdef ENABLE_LLDPMED |
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); | |
55 | #endif | |
56 | free(chassis->c_id); | |
57 | free(chassis->c_name); | |
58 | free(chassis->c_descr); | |
4b292b55 VB |
59 | if (all) |
60 | free(chassis); | |
61 | } | |
62 | ||
63 | #ifdef ENABLE_DOT1 | |
64 | void | |
65 | lldpd_vlan_cleanup(struct lldpd_port *port) | |
66 | { | |
67 | struct lldpd_vlan *vlan, *vlan_next; | |
68 | for (vlan = TAILQ_FIRST(&port->p_vlans); | |
69 | vlan != NULL; | |
70 | vlan = vlan_next) { | |
71 | free(vlan->v_name); | |
72 | vlan_next = TAILQ_NEXT(vlan, v_entries); | |
73 | free(vlan); | |
74 | } | |
75 | TAILQ_INIT(&port->p_vlans); | |
76 | } | |
77 | ||
78 | void | |
79 | lldpd_ppvid_cleanup(struct lldpd_port *port) | |
80 | { | |
81 | struct lldpd_ppvid *ppvid, *ppvid_next; | |
82 | for (ppvid = TAILQ_FIRST(&port->p_ppvids); | |
83 | ppvid != NULL; | |
84 | ppvid = ppvid_next) { | |
85 | ppvid_next = TAILQ_NEXT(ppvid, p_entries); | |
86 | free(ppvid); | |
87 | } | |
88 | TAILQ_INIT(&port->p_ppvids); | |
89 | } | |
90 | ||
91 | void | |
92 | lldpd_pi_cleanup(struct lldpd_port *port) | |
93 | { | |
94 | struct lldpd_pi *pi, *pi_next; | |
95 | for (pi = TAILQ_FIRST(&port->p_pids); | |
96 | pi != NULL; | |
97 | pi = pi_next) { | |
98 | free(pi->p_pi); | |
99 | pi_next = TAILQ_NEXT(pi, p_entries); | |
100 | free(pi); | |
101 | } | |
102 | TAILQ_INIT(&port->p_pids); | |
103 | } | |
104 | #endif | |
105 | ||
4e90a9e0 VB |
106 | /* Cleanup a remote port. The last argument, `expire` is a function that should |
107 | * be called when expiration happens. If it is NULL, all remote ports are | |
108 | * removed. */ | |
4b292b55 | 109 | void |
4e90a9e0 VB |
110 | lldpd_remote_cleanup(struct lldpd_hardware *hardware, |
111 | void(*expire)(struct lldpd_hardware *, struct lldpd_port *)) | |
4b292b55 VB |
112 | { |
113 | struct lldpd_port *port, *port_next; | |
114 | int del; | |
3333d2a8 | 115 | time_t now = time(NULL); |
6f8925be VB |
116 | |
117 | log_debug("alloc", "cleanup remote port on %s", | |
118 | hardware->h_ifname); | |
4b292b55 VB |
119 | for (port = TAILQ_FIRST(&hardware->h_rports); |
120 | port != NULL; | |
121 | port = port_next) { | |
122 | port_next = TAILQ_NEXT(port, p_entries); | |
4e90a9e0 VB |
123 | del = (expire == NULL); |
124 | if (expire && | |
bea0d764 | 125 | (now - port->p_lastupdate >= port->p_chassis->c_ttl)) { |
14052b61 VB |
126 | hardware->h_ageout_cnt++; |
127 | hardware->h_delete_cnt++; | |
4e90a9e0 | 128 | expire(hardware, port); |
4b292b55 VB |
129 | del = 1; |
130 | } | |
131 | if (del) { | |
4e90a9e0 | 132 | if (expire) |
4b292b55 VB |
133 | TAILQ_REMOVE(&hardware->h_rports, port, p_entries); |
134 | lldpd_port_cleanup(port, 1); | |
135 | free(port); | |
136 | } | |
137 | } | |
4e90a9e0 | 138 | if (!expire) TAILQ_INIT(&hardware->h_rports); |
4b292b55 VB |
139 | } |
140 | ||
141 | /* If `all' is true, clear all information, including information that | |
142 | are not refreshed periodically. Port should be freed manually. */ | |
143 | void | |
144 | lldpd_port_cleanup(struct lldpd_port *port, int all) | |
145 | { | |
146 | #ifdef ENABLE_LLDPMED | |
147 | int i; | |
148 | if (all) | |
149 | for (i=0; i < LLDP_MED_LOCFORMAT_LAST; i++) | |
150 | free(port->p_med_location[i].data); | |
151 | #endif | |
152 | #ifdef ENABLE_DOT1 | |
153 | lldpd_vlan_cleanup(port); | |
154 | lldpd_ppvid_cleanup(port); | |
155 | lldpd_pi_cleanup(port); | |
156 | #endif | |
157 | free(port->p_id); | |
158 | free(port->p_descr); | |
159 | if (all) { | |
160 | free(port->p_lastframe); | |
161 | if (port->p_chassis) { /* chassis may not have been attributed, yet */ | |
162 | port->p_chassis->c_refcount--; | |
163 | port->p_chassis = NULL; | |
164 | } | |
165 | } | |
166 | } | |
8ec333bd VB |
167 | |
168 | void | |
169 | lldpd_config_cleanup(struct lldpd_config *config) | |
170 | { | |
6f8925be | 171 | log_debug("alloc", "general configuration cleanup"); |
8ec333bd VB |
172 | free(config->c_mgmt_pattern); |
173 | free(config->c_cid_pattern); | |
174 | free(config->c_iface_pattern); | |
175 | free(config->c_platform); | |
176 | free(config->c_description); | |
177 | } |