Minishell for accessing txtinfo through sshd/dropbear
[olsrd.git] / src / print_packet.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #include "print_packet.h"
43 #include "ipcalc.h"
44 #include "mantissa.h"
45 #include "defs.h"
46 #include "olsr.h"
47 #include "lq_packet.h"
48 #include "net_olsr.h"
49
50 static int8_t print_olsr_serialized_message(FILE *, union olsr_message *);
51
52 static void
53   print_messagedump(FILE *, uint8_t *, int16_t);
54
55 static void
56   print_midmsg(FILE *, uint8_t *, int16_t);
57
58 static void
59   print_hnamsg(FILE *, uint8_t *, int16_t);
60
61 static void
62   print_olsr_tcmsg(FILE *, uint8_t *, int16_t);
63
64 static void
65   print_olsr_tcmsg_lq(FILE *, uint8_t *, int16_t);
66
67 static void
68   print_hellomsg(FILE *, uint8_t *, int16_t);
69
70 static void
71   print_hellomsg_lq(FILE *, uint8_t *, int16_t);
72
73 /* Entire packet */
74 int8_t
75 print_olsr_serialized_packet(FILE * handle, union olsr_packet *pkt, uint16_t size, union olsr_ip_addr *from_addr)
76 {
77   int16_t remainsize = size - OLSR_HEADERSIZE;
78   union olsr_message *msg;
79   struct ipaddr_str buf;
80
81   /* Print packet header (no IP4/6 difference) */
82   fprintf(handle, "  ============== OLSR PACKET ==============\n   source: %s\n   length: %d bytes\n   seqno: %d\n\n",
83           from_addr ? olsr_ip_to_string(&buf, from_addr) : "UNKNOWN", ntohs(pkt->v4.olsr_packlen), ntohs(pkt->v4.olsr_seqno));
84
85   /* Check size */
86   if (size != ntohs(pkt->v4.olsr_packlen))
87     fprintf(handle, "   SIZE MISSMATCH(%d != %d)!\n", size, ntohs(pkt->v4.olsr_packlen));
88
89   msg = (union olsr_message *)pkt->v4.olsr_msg;
90
91   /* Print all messages */
92   while ((remainsize > 0) && ntohs(msg->v4.olsr_msgsize)) {
93     print_olsr_serialized_message(handle, msg);
94     remainsize -= ntohs(msg->v4.olsr_msgsize);
95     msg = (union olsr_message *)((char *)msg + ntohs(msg->v4.olsr_msgsize));
96   }
97
98   /* Done */
99   fprintf(handle, "  =========================================\n\n");
100   return 1;
101 }
102
103 /* Single message */
104 static int8_t
105 print_olsr_serialized_message(FILE * handle, union olsr_message *msg)
106 {
107   struct ipaddr_str buf;
108
109   fprintf(handle, "   ------------ OLSR MESSAGE ------------\n");
110   fprintf(handle, "    Sender main addr: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->v4.originator));
111   fprintf(handle, "    Type: %s, size: %d, vtime: %u ms\n",
112           olsr_msgtype_to_string(msg->v4.olsr_msgtype), ntohs(msg->v4.olsr_msgsize), me_to_reltime(msg->v4.olsr_vtime));
113   fprintf(handle, "    TTL: %d, Hopcnt: %d, seqno: %d\n",
114           (olsr_cnf->ip_version == AF_INET) ? msg->v4.ttl : msg->v6.ttl,
115           (olsr_cnf->ip_version == AF_INET) ? msg->v4.hopcnt : msg->v6.hopcnt,
116           ntohs((olsr_cnf->ip_version == AF_INET) ? msg->v4.seqno : msg->v6.seqno));
117
118   switch (msg->v4.olsr_msgtype) {
119     /* Print functions for individual messagetypes */
120   case (MID_MESSAGE):
121     print_midmsg(handle,
122                  (olsr_cnf->ip_version == AF_INET) ?
123                  (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
124     break;
125   case (HNA_MESSAGE):
126     print_hnamsg(handle,
127                  (olsr_cnf->ip_version == AF_INET) ?
128                  (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
129     break;
130   case (TC_MESSAGE):
131     print_olsr_tcmsg(handle,
132                      (olsr_cnf->ip_version == AF_INET) ?
133                      (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
134     break;
135   case (LQ_TC_MESSAGE):
136     print_olsr_tcmsg_lq(handle,
137                         (olsr_cnf->ip_version == AF_INET) ?
138                         (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
139     break;
140   case (HELLO_MESSAGE):
141     print_hellomsg(handle,
142                    (olsr_cnf->ip_version == AF_INET) ?
143                    (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
144     break;
145   case (LQ_HELLO_MESSAGE):
146     print_hellomsg_lq(handle,
147                       (olsr_cnf->ip_version == AF_INET) ?
148                       (uint8_t *) & msg->v4.message : (uint8_t *) & msg->v6.message, ntohs(msg->v4.olsr_msgsize));
149     break;
150   default:
151     print_messagedump(handle, (uint8_t *) msg, ntohs(msg->v4.olsr_msgsize));
152   }
153
154   fprintf(handle, "   --------------------------------------\n\n");
155   return 1;
156 }
157
158
159 static void
160 print_messagedump(FILE * handle, uint8_t * msg, int16_t size)
161 {
162   int i, x = 0;
163
164   fprintf(handle, "     Data dump:\n     ");
165   for (i = 0; i < size; i++) {
166     if (x == 4) {
167       x = 0;
168       fprintf(handle, "\n     ");
169     }
170     x++;
171     if (olsr_cnf->ip_version == AF_INET)
172       fprintf(handle, " %-3i ", (u_char) msg[i]);
173     else
174       fprintf(handle, " %-2x ", (u_char) msg[i]);
175   }
176   fprintf(handle, "\n");
177 }
178
179
180 static void
181 print_hellomsg(FILE * handle, uint8_t * data, int16_t totsize)
182 {
183   union olsr_ip_addr *haddr;
184   int hellosize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
185
186   fprintf(handle, "    +Htime: %u ms\n", me_to_reltime(data[2]));
187
188   fprintf(handle, "    +Willingness: %d\n", data[3]);
189
190   if (olsr_cnf->ip_version == AF_INET) {
191     /* IPv4 */
192     struct hellomsg *h;
193     struct hellinfo *hinf;
194
195     h = (struct hellomsg *)data;
196
197     for (hinf = h->hell_info;
198          (char *)hinf < ((char *)data + hellosize); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->size))) {
199
200       fprintf(handle, "    ++ Link: %s, Status: %s, Size: %d\n",
201               olsr_link_to_string(EXTRACT_LINK(hinf->link_code)),
202               olsr_status_to_string(EXTRACT_STATUS(hinf->link_code)), ntohs(hinf->size));
203
204       for (haddr = (union olsr_ip_addr *)&hinf->neigh_addr;
205            (char *)haddr < (char *)hinf + ntohs(hinf->size); haddr = (union olsr_ip_addr *)&haddr->v6.s6_addr[4]) {
206         struct ipaddr_str buf;
207         fprintf(handle, "    ++ %s\n", olsr_ip_to_string(&buf, haddr));
208       }
209     }
210
211
212   } else {
213     /* IPv6 */
214     struct hellomsg6 *h6;
215     struct hellinfo6 *hinf6;
216
217     h6 = (struct hellomsg6 *)data;
218
219     for (hinf6 = h6->hell_info; (char *)hinf6 < ((char *)data + (hellosize));
220          hinf6 = (struct hellinfo6 *)((char *)hinf6 + ntohs(hinf6->size))) {
221       fprintf(handle, "    ++ Link: %s, Status: %s, Size: %d\n",
222               olsr_link_to_string(EXTRACT_LINK(hinf6->link_code)),
223               olsr_status_to_string(EXTRACT_STATUS(hinf6->link_code)), ntohs(hinf6->size));
224
225       for (haddr = (union olsr_ip_addr *)hinf6->neigh_addr; (char *)haddr < (char *)hinf6 + ntohs(hinf6->size); haddr++) {
226         struct ipaddr_str buf;
227         fprintf(handle, "    ++ %s\n", olsr_ip_to_string(&buf, haddr));
228       }
229     }
230
231   }
232
233 }
234
235 static void
236 print_hellomsg_lq(FILE * handle, uint8_t * data, int16_t totsize)
237 {
238   union olsr_ip_addr *haddr;
239   int hellosize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
240
241   fprintf(handle, "    +Htime: %u ms\n", me_to_reltime(data[2]));
242
243   fprintf(handle, "    +Willingness: %d\n", data[3]);
244
245   if (olsr_cnf->ip_version == AF_INET) {
246     /* IPv4 */
247     struct hellomsg *h;
248     struct hellinfo *hinf;
249
250     h = (struct hellomsg *)data;
251
252     for (hinf = h->hell_info;
253          (char *)hinf < ((char *)data + hellosize); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->size))) {
254
255       fprintf(handle, "    ++ Link: %s, Status: %s, Size: %d\n",
256               olsr_link_to_string(EXTRACT_LINK(hinf->link_code)),
257               olsr_status_to_string(EXTRACT_STATUS(hinf->link_code)), ntohs(hinf->size));
258
259       for (haddr = (union olsr_ip_addr *)&hinf->neigh_addr;
260            (char *)haddr < (char *)hinf + ntohs(hinf->size); haddr = (union olsr_ip_addr *)&haddr->v6.s6_addr[8]) {
261         struct ipaddr_str buf;
262         uint8_t *quality = (uint8_t *) haddr + olsr_cnf->ipsize;
263         fprintf(handle, "    ++ %s\n", olsr_ip_to_string(&buf, haddr));
264         fprintf(handle, "    ++ LQ = %d, RLQ = %d\n", quality[0], quality[1]);
265       }
266     }
267
268
269   } else {
270     /* IPv6 */
271     struct hellomsg6 *h6;
272     struct hellinfo6 *hinf6;
273
274     h6 = (struct hellomsg6 *)data;
275
276     for (hinf6 = h6->hell_info; (char *)hinf6 < ((char *)data + (hellosize));
277          hinf6 = (struct hellinfo6 *)((char *)hinf6 + ntohs(hinf6->size))) {
278       fprintf(handle, "    ++ Link: %s, Status: %s, Size: %d\n",
279               olsr_link_to_string(EXTRACT_LINK(hinf6->link_code)),
280               olsr_status_to_string(EXTRACT_STATUS(hinf6->link_code)), ntohs(hinf6->size));
281
282       for (haddr = (union olsr_ip_addr *)hinf6->neigh_addr; (char *)haddr < (char *)hinf6 + ntohs(hinf6->size) + 4; haddr++) {
283         struct ipaddr_str buf;
284         uint8_t *quality = (uint8_t *) haddr + olsr_cnf->ipsize;
285         fprintf(handle, "    ++ %s\n", olsr_ip_to_string(&buf, haddr));
286         fprintf(handle, "    ++ LQ = %d, RLQ = %d\n", quality[0], quality[1]);
287       }
288     }
289
290   }
291 }
292
293 static void
294 print_olsr_tcmsg_lq(FILE * handle, uint8_t * data, int16_t totsize)
295 {
296   int remsize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
297
298   fprintf(handle, "    +ANSN: %d\n", htons(((struct olsr_tcmsg *)data)->ansn));
299
300   data += 4;
301   remsize -= 4;
302
303   while (remsize) {
304     struct ipaddr_str buf;
305     fprintf(handle, "    +Neighbor: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)data));
306     data += olsr_cnf->ipsize;
307     fprintf(handle, "    +LQ: %d, ", *data);
308     data += 1;
309     fprintf(handle, "RLQ: %d\n", *data);
310     data += 3;
311     remsize -= (olsr_cnf->ipsize + 4);
312   }
313
314 }
315
316
317 static void
318 print_olsr_tcmsg(FILE * handle, uint8_t * data, int16_t totsize)
319 {
320   int remsize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
321
322   fprintf(handle, "    +ANSN: %d\n", htons(((struct olsr_tcmsg *)data)->ansn));
323
324   data += 4;
325   remsize -= 4;
326
327   while (remsize) {
328     struct ipaddr_str buf;
329     fprintf(handle, "    +Neighbor: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)data));
330     data += olsr_cnf->ipsize;
331
332     remsize -= olsr_cnf->ipsize;
333   }
334
335 }
336
337
338 static void
339 print_hnamsg(FILE * handle, uint8_t * data, int16_t totsize)
340 {
341   int remsize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
342
343   while (remsize) {
344     struct ipaddr_str buf;
345     fprintf(handle, "    +Network: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)data));
346     data += olsr_cnf->ipsize;
347     fprintf(handle, "    +Netmask: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)data));
348     data += olsr_cnf->ipsize;
349
350     remsize -= (olsr_cnf->ipsize * 2);
351   }
352
353 }
354
355 static void
356 print_midmsg(FILE * handle, uint8_t * data, int16_t totsize)
357 {
358   int remsize = totsize - ((olsr_cnf->ip_version == AF_INET) ? OLSR_MSGHDRSZ_IPV4 : OLSR_MSGHDRSZ_IPV6);
359
360   while (remsize) {
361     struct ipaddr_str buf;
362     fprintf(handle, "    +Alias: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)data));
363     data += olsr_cnf->ipsize;
364     remsize -= olsr_cnf->ipsize;
365   }
366 }
367
368 /*
369  * Local Variables:
370  * c-basic-offset: 2
371  * indent-tabs-mode: nil
372  * End:
373  */