]> git.sur5r.net Git - ngadmin/blob - dump/dump.c
d57fc82403f28a0ab3b89a62c23ffb8f9054f873
[ngadmin] / dump / dump.c
1
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <arpa/inet.h>
5
6 #include <protocol.h>
7 #include <attr.h>
8
9
10 int main (void)
11 {
12         char buffer[1500];
13         struct ng_packet np;
14         int err = 0, s, len;
15         struct sockaddr_in local, remote;
16         socklen_t slen = sizeof(struct sockaddr_in);
17         unsigned char error;
18         unsigned short attr_error;
19         List *attr;
20         ListNode *ln;
21         struct attr *at;
22         
23         
24         s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
25         if (s < 0) {
26                 perror("socket");
27                 err = 1;
28                 goto end;
29         };
30         
31         
32         memset(&local, 0, sizeof(struct sockaddr_in));
33         local.sin_family = AF_INET;
34         local.sin_addr.s_addr = htonl(INADDR_ANY);
35         local.sin_port = htons(SWITCH_PORT);
36         
37         if (bind(s, (struct sockaddr*)&local, sizeof(struct sockaddr_in)) < 0) {
38                 perror("bind");
39                 err = 2;
40                 goto end;
41         }
42         
43         while (1) {
44                 
45                 len = recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr*)&remote, &slen);
46                 if (len < 0) {
47                         perror("recvfrom");
48                         err = 3;
49                         goto end;
50                 }
51                 
52                 printf("---------------------------------\n");
53                 
54                 np.buffer = buffer;
55                 np.maxlen = len;
56                 initNgPacket(&np);
57                 
58                 attr = createEmptyList();
59                 
60                         if (ntohs(remote.sin_port) != CLIENT_PORT ||
61                     len < (int)sizeof(struct ng_header) ||
62                     !validateNgHeader(np.nh, 0, NULL, NULL, 0) ||
63                     extractPacketAttributes(&np, &error, &attr_error, attr, ATTR_END, 0) < 0) {
64                         printf("wrong packet\n");
65                         goto end;
66                 }
67                 
68                 printf("received %d attribute(s)\n", attr->count);
69                 
70                 for (ln = attr->first; ln != NULL; ln = ln->next) {
71                         at = ln->data;
72                         printf("received attribute code = %04X, length = %d\n", at->attr, at->size);
73                 }
74                 
75                 destroyList(attr, (void(*)(void*))freeAttr);
76                 
77                 printf("---------------------------------\n\n");
78         }
79         
80         close(s);
81         
82 end:
83         return err;
84 }
85