1 /*
2 */
3
4 #include "graph.h"
5
6 #define MK_LINK (MK_LAST << 1)
7 #define MK_PRINTED (MK_LAST << 2)
8
9 /******************************************************************************
10 Output graph in textual form
11 ******************************************************************************/
12
text_write_eq(FILE * fp)13 static void text_write_eq (FILE *fp)
14 {
15 struct node *n ;
16 struct eq *eq ;
17
18 for (eq = mobj_head (eqmobj) ; eq != NULL ; eq = eq->next)
19 MK_CLEAR (eq, MK_PRINTED) ;
20
21 for (n = mobj_head (nodemobj) ; n != NULL ; n = n->next)
22 {
23 int selected ;
24
25 eq = n->eq ;
26 selected = MK_ISSELECTED (n) || MK_ISSELECTED (eq) ;
27 if (selected && ! MK_ISSET (eq, MK_PRINTED))
28 {
29 fprintf (fp, "eq %s type %s model %s snmp %s location %s manual %d ipmac %d portmac %d\n",
30 eq->name,
31 eq->type,
32 eq->model,
33 (eq->snmp == NULL ? "-" : eq->snmp),
34 (eq->location == NULL ? "-" : eq->location),
35 eq->manual,
36 eq->ipmac,
37 eq->portmac
38 ) ;
39 MK_SET (eq, MK_PRINTED) ;
40 }
41 }
42 }
43
text_write_nodes(FILE * fp)44 static void text_write_nodes (FILE *fp)
45 {
46 struct node *n ;
47 iptext_t ipaddr ;
48 char *l1type ;
49
50 for (n = mobj_head (nodemobj) ; n != NULL ; n = n->next)
51 {
52 if (MK_ISSELECTED (n))
53 {
54 switch (n->nodetype)
55 {
56 case NT_L1 :
57 switch (n->u.l1.l1type)
58 {
59 case L1T_DISABLED :
60 l1type = "disabled" ;
61 break ;
62 case L1T_TRUNK :
63 l1type = "trunk" ;
64 break ;
65 case L1T_ETHER :
66 l1type = "ether" ;
67 break ;
68 }
69
70 fprintf (fp, "node %s type L1 eq %s name %s link %s encap %s stat %s desc %s",
71 n->name,
72 n->eq->name,
73 n->u.l1.ifname,
74 n->u.l1.link,
75 l1type,
76 (n->u.l1.stat == NULL ? "-" : n->u.l1.stat),
77 (n->u.l1.ifdesc == NULL ? "-" : n->u.l1.ifdesc)
78 ) ;
79 if (n->u.l1.radio.ssid != NULL)
80 {
81 struct radio *r ;
82 struct ssid *s ;
83
84 r = &(n->u.l1.radio) ;
85 fprintf (fp, " radio ") ;
86 switch (r->channel)
87 {
88 case CHAN_DFS :
89 fprintf (fp, " dfs") ;
90 break ;
91 default :
92 fprintf (fp, " %d", r->channel) ;
93 break ;
94 }
95 fprintf (fp, " %d", r->power) ;
96
97 for (s = r->ssid ; s != NULL ; s = s->next)
98 {
99 char *m ;
100
101 switch (s->mode)
102 {
103 case SSID_OPEN : m = "open" ; break ;
104 case SSID_AUTH : m = "auth" ; break ;
105 default : m = "???" ; break ;
106 }
107 fprintf (fp, " ssid %s %s", s->name, m) ;
108 }
109 }
110 fprintf (fp, "\n") ;
111 break ;
112 case NT_L2 :
113 fprintf (fp, "node %s type L2 eq %s vlan %d stat %s native %d ifname %s\n",
114 n->name,
115 n->eq->name,
116 n->u.l2.vlan,
117 (n->u.l2.stat == NULL ? "-" : n->u.l2.stat),
118 n->u.l2.native,
119 (n->u.l2.ifname == NULL ? "-" : n->u.l2.ifname)
120 ) ;
121 break ;
122 case NT_L3 :
123 if (! ip_ntop (&n->u.l3.addr, ipaddr, 1))
124 {
125 inconsistency ("Invalid address for node '%s'", n->name) ;
126 exit (1) ;
127 }
128 fprintf (fp, "node %s type L3 eq %s addr %s\n",
129 n->name,
130 n->eq->name,
131 ipaddr
132 ) ;
133 break ;
134 case NT_BRIDGE :
135 fprintf (fp, "node %s type bridge eq %s\n",
136 n->name,
137 n->eq->name
138 ) ;
139 break ;
140 case NT_ROUTER :
141 fprintf (fp, "node %s type router eq %s instance %s\n",
142 n->name,
143 n->eq->name,
144 n->u.router.name
145 ) ;
146 break ;
147 case NT_L2PAT :
148 fprintf (fp, "node %s type L2pat ERROR\n",
149 n->name) ;
150 break ;
151 case NT_BRPAT :
152 fprintf (fp, "node %s type brpat ERROR\n",
153 n->name) ;
154 break ;
155 default :
156 inconsistency ("Incoherent node '%s'", n->name) ;
157 exit (1) ;
158 }
159 }
160 }
161 }
162
text_write_links(FILE * fp)163 static void text_write_links (FILE *fp)
164 {
165 struct node *n ;
166
167 for (n = mobj_head (nodemobj) ; n != NULL ; n = n->next)
168 MK_CLEAR (n, MK_LINK) ;
169
170 for (n = mobj_head (nodemobj) ; n != NULL ; n = n->next)
171 {
172 struct linklist *ll ;
173
174 for (ll = n->linklist ; ll != NULL ; ll = ll->next)
175 {
176 struct link *l ;
177 struct node *n1, *n2 ;
178
179 l = ll->link ;
180 n1 = l->node [0] ;
181 n2 = l->node [1] ;
182 if (MK_ISSELECTED (n1) && MK_ISSELECTED (n2))
183 {
184 if (! (MK_ISSET (n1, MK_LINK) || MK_ISSET (n2, MK_LINK)))
185 {
186 fprintf (fp, "link %s %s", n1->name, n2->name) ;
187 if (l->name != NULL)
188 fprintf (fp, " name %s", l->name) ;
189 fprintf (fp, "\n") ;
190 }
191 }
192 }
193 MK_SET (n, MK_LINK) ;
194 }
195 }
196
text_write_rnet(FILE * fp)197 static void text_write_rnet (FILE *fp)
198 {
199 struct rnet *n ;
200 struct route *r ;
201 iptext_t addr, vrrpaddr, netaddr, gwaddr ;
202
203 for (n = mobj_head (rnetmobj) ; n != NULL ; n = n->next)
204 {
205 if (MK_ISSELECTED (n->net))
206 {
207 ip_ntop (&n->net->addr, addr, 1) ;
208 fprintf (fp, "rnet %s %s %s %s %s",
209 addr,
210 n->router->name,
211 n->l3->name,
212 n->l2->name,
213 n->l1->name) ;
214
215 if (n->vrrpaddr.preflen == 0)
216 fprintf (fp, " - -") ;
217 else
218 {
219 ip_ntop (&n->vrrpaddr, vrrpaddr, 0) ;
220 fprintf (fp, " %s %d", vrrpaddr, n->vrrpprio) ;
221 }
222
223 for (r = n->routelist ; r != NULL ; r = r->next)
224 {
225 ip_ntop (&r->net, netaddr, 1) ;
226 ip_ntop (&r->gw, gwaddr, 0) ;
227 fprintf (fp, " %s %s", netaddr, gwaddr) ;
228 }
229 fprintf (fp, "\n") ;
230 }
231 }
232 }
233
text_write_vlans(FILE * fp)234 static void text_write_vlans (FILE *fp)
235 {
236 vlan_t v ;
237 struct vlan *tab ;
238
239 tab = mobj_data (vlanmobj) ;
240 for (v = 0 ; v < MAXVLAN ; v++)
241 {
242 if (tab [v].name != NULL && MK_ISSELECTED (&tab [v]))
243 {
244 iptext_t n ;
245 struct netlist *nl ;
246
247 fprintf (fp, "vlan %d desc %s voice %d", v,
248 tab [v].name, tab [v].voice) ;
249 for (nl = tab [v].netlist ; nl != NULL ; nl = nl->next)
250 {
251 ip_ntop (&nl->net->addr, n, 1) ;
252 fprintf (fp, " net %s", n) ;
253 }
254 fprintf (fp, "\n") ;
255 }
256 }
257 }
258
text_write_lvlans(FILE * fp)259 static void text_write_lvlans (FILE *fp)
260 {
261 vlan_t v ;
262 struct vlan *tab ;
263 struct lvlan *lv ;
264
265 tab = mobj_data (vlanmobj) ;
266 for (v = 0 ; v < MAXVLAN ; v++)
267 {
268 for (lv = tab [v].lvlan ; lv != NULL ; lv = lv->next)
269 {
270 fprintf (fp, "lvlan %s %d desc %s declared %s incoming %s\n",
271 lv->eq->name, v,
272 (lv->name == NULL ? "-" : lv->name),
273 ((lv->mark & LVLAN_DECLARED) ? "yes" : "no"),
274 ((lv->mark & LVLAN_INCOMING) ? "yes" : "no")) ;
275 }
276 }
277 }
278
text_write_ssidprobes(FILE * fp)279 static void text_write_ssidprobes (FILE *fp)
280 {
281 struct ssidprobe *sp ;
282
283 for (sp = mobj_head (ssidprobemobj) ; sp != NULL ; sp = sp->next)
284 {
285 char *m ;
286
287 switch (sp->mode)
288 {
289 case SSIDPROBE_ASSOC : m = "assoc" ; break ;
290 case SSIDPROBE_AUTH : m = "auth" ; break ;
291 default : m = "???" ; break ;
292 }
293
294 fprintf (fp, "ssidprobe %s eq %s iface %s ssidname %s mode %s\n",
295 sp->name,
296 sp->eq->name,
297 sp->l1->name ,
298 sp->ssid->name,
299 m) ;
300 }
301 }
302
text_write(FILE * fp,char * object)303 void text_write (FILE *fp, char *object)
304 {
305 if (object == NULL || strcmp (object, "eq") == 0)
306 text_write_eq (fp) ;
307 if (object == NULL || strcmp (object, "node") == 0)
308 text_write_nodes (fp) ;
309 if (object == NULL || strcmp (object, "link") == 0)
310 text_write_links (fp) ;
311 if (object == NULL || strcmp (object, "rnet") == 0)
312 text_write_rnet (fp) ;
313 if (object == NULL || strcmp (object, "vlan") == 0)
314 text_write_vlans (fp) ;
315 if (object == NULL || strcmp (object, "lvlan") == 0)
316 text_write_lvlans (fp) ;
317 if (object == NULL || strcmp (object, "ssidprobe") == 0)
318 text_write_ssidprobes (fp) ;
319 }
320