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