3 * - By John Hodge (thePowersGang)
10 void PrintUsage(const char *ProgName);
11 int ParseIPAddress(const char *Address, uint8_t *Dest, int *SubnetBits);
15 * \brief Program entrypoint
17 int main(int argc, char *argv[])
19 // No args, dump interfaces
26 if( strcmp(argv[1], "route") == 0 )
28 Routes_main(argc-1, argv+1);
31 else if( strcmp(argv[1], "addr") == 0 )
33 Addr_main(argc-1, argv+1);
36 else if( strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0 )
46 * \brief Print usage instructions
48 void PrintUsage(const char *ProgName)
50 fprintf(stderr, "Usage:\n");
51 fprintf(stderr, " %s addr add <device> <ip>/<prefix>\n", ProgName);
52 fprintf(stderr, " Add a new interface listening on <device> with the specified\n");
53 fprintf(stderr, " address.\n");
54 fprintf(stderr, " %s addr del <interface>\n", ProgName);
55 fprintf(stderr, " Delete an interface\n");
56 fprintf(stderr, " %s addr [<interface>]\n", ProgName);
57 fprintf(stderr, " Print the current interfaces (or only <interface> if passed)\n");
58 fprintf(stderr, "\n");
59 fprintf(stderr, " %s route\n", ProgName);
60 fprintf(stderr, " Print the routing tables\n");
61 fprintf(stderr, " %s route add <host>[/<prefix>] [<nexthop> OR <iface>] [<metric>]\n", ProgName);
62 fprintf(stderr, " Add a new route\n");
63 fprintf(stderr, " %s route del <host>[/<prefix>]\n", ProgName);
64 fprintf(stderr, " %s route del <routenum>\n", ProgName);
65 fprintf(stderr, " Add a new route\n");
66 fprintf(stderr, "\n");
67 fprintf(stderr, "A note on Acess's IP Stack:\n");
68 fprintf(stderr, " Each interface corresponds to only one IP address (either IPv4\n");
69 fprintf(stderr, " or IPv6). A network device can have multiple interfaces bound\n");
70 fprintf(stderr, " to it, allowing multiple addresses for one network connection\n");
71 fprintf(stderr, "\n");
76 * \brief Parse an IP Address
77 * \return 0 for unknown, 4 for IPv4 and 6 for IPv6
79 int ParseIPAddress(const char *Address, uint8_t *Dest, int *SubnetBits)
81 const char *p = Address;
84 while(*p && *p >= '0' && *p <= '9') p ++;
92 for( j = 0; Address[i] && j < 4; j ++ )
95 for( ; '0' <= Address[i] && Address[i] <= '9'; i++ )
97 val = val*10 + Address[i] - '0';
100 //printf("val > 255 (%i)\n", val);
105 if(Address[i] == '.')
109 //printf("4 parts expected, %i found\n", j);
113 if(Address[i] == '/') {
116 while('0' <= Address[i] && Address[i] <= '9') {
118 val += Address[i] - '0';
122 printf("Notice: Subnet size >32 (%i)\n", val);
124 if(SubnetBits) *SubnetBits = val;
126 if(Address[i] != '\0') {
127 //printf("EOS != '\\0', '%c'\n", Address[i]);
134 if(*p == ':' || ('a' <= *p && *p <= 'f') || ('A' <= *p && *p <= 'F'))
138 int val, split = -1, end;
139 uint16_t hi[8], low[8];
141 for( j = 0; Address[i] && j < 8; j ++ )
143 if(Address[i] == '/')
146 if(Address[i] == ':') {
148 printf("Two '::'s\n");
157 for( k = 0; Address[i] && Address[i] != ':' && Address[i] != '/'; i++, k++ )
160 if('0' <= Address[i] && Address[i] <= '9')
161 val += Address[i] - '0';
162 else if('A' <= Address[i] && Address[i] <= 'F')
163 val += Address[i] - 'A' + 10;
164 else if('a' <= Address[i] && Address[i] <= 'f')
165 val += Address[i] - 'a' + 10;
167 printf("%c unexpected\n", Address[i]);
173 printf("val (0x%x) > 0xFFFF\n", val);
182 if( Address[i] == ':' ) {
189 if(Address[i] == '/') {
191 while('0' <= Address[i] && Address[i] <= '9') {
193 val += Address[i] - '0';
197 printf("Notice: Subnet size >128 (%i)\n", val);
199 if(SubnetBits) *SubnetBits = val;
202 for( j = 0; j < split; j ++ )
204 //printf("%04x:", hi[j]);
205 Dest[j*2] = hi[j]>>8;
206 Dest[j*2+1] = hi[j]&0xFF;
208 for( ; j < 8 - (end - split); j++ )
210 //printf("0000:", hi[j]);
214 for( k = 0; j < 8; j ++, k++)
216 //printf("%04x:", low[k]);
217 Dest[j*2] = low[k]>>8;
218 Dest[j*2+1] = low[k]&0xFF;