44 #include <sys/types.h>
45 #include <sys/socket.h>
46 #include <netinet/in.h>
47 #include <arpa/inet.h>
120 unsigned char *packet,
int len,
int reverse)
127 debug(
"[ net: RARP: ");
129 debug(
"[ net: ARP: ");
131 debug(
"%02x", packet[i]);
134 debug(
"%02x", packet[i]);
136 debug(
"%02x", packet[4]);
138 debug(
"%02x", packet[5]);
140 debug(
"%02x", packet[6]);
141 debug(
"%02x", packet[7]);
144 debug(
"%02x", packet[i]);
146 for (i=18; i<28; i++)
147 debug(
"%02x", packet[i]);
150 if (packet[0] == 0x00 && packet[1] == 0x01 &&
151 packet[2] == 0x08 && packet[3] == 0x00 &&
152 packet[4] == 0x06 && packet[5] == 0x04) {
153 int r = (packet[6] << 8) + packet[7];
167 memset(lp->
data, 0, 60 + 14);
168 memcpy(lp->
data + 14, packet,
len);
171 memcpy(lp->
data + 0, lp->
data + 8 + 14, 6);
173 lp->
data[12] = 0x08; lp->
data[13] = 0x06;
176 memcpy(lp->
data + 18 + 14, lp->
data + 8 + 14, 10);
184 lp->
data[6 + 14] = 0x00; lp->
data[7 + 14] = 0x02;
192 memset(lp->
data, 0, 60 + 14);
193 memcpy(lp->
data + 14, packet,
len);
196 memcpy(lp->
data + 0, packet + 8, 6);
198 lp->
data[12] = 0x80; lp->
data[13] = 0x35;
201 lp->
data[6 + 14] = 0x00; lp->
data[7 + 14] = 0x04;
209 memcpy(lp->
data + 18 + 14, packet + 8, 6);
221 q = (packet[8 + 5]) >> 4;
222 lp->
data[24 + 14] = 10;
223 lp->
data[25 + 14] = 0;
224 lp->
data[26 + 14] = 0;
225 lp->
data[27 + 14] = q;
230 fatal(
"[ net: ARP: UNIMPLEMENTED request type "
234 fatal(
"[ net: ARP: UNIMPLEMENTED arp packet type: ");
235 for (i=0; i<
len; i++)
236 fatal(
"%02x", packet[i]);
263 struct sockaddr_in si;
264 socklen_t si_len =
sizeof(si);
265 int res, i, nreceived = 0;
266 unsigned char buf[60000];
270 sizeof(buf), 0, (
struct sockaddr *)&si, &si_len);
286 memcpy(lp->
data, buf, res);
289 }
while (res != -1 && nreceived < 100);
317 unsigned char **packetp,
int *lenp)
331 if (packetp == NULL || lenp == NULL)
335 (*packetp) = lp->
data;
344 if (lp->
next == NULL)
372 unsigned char *packet,
int len)
374 int i, eth_type, for_the_gateway;
383 fatal(
"[ net_ethernet_tx: Warning: dropping tiny packet "
384 "(%i bytes) ]\n",
len);
410 while (rnp != NULL) {
424 if (!for_the_gateway && packet[0] != 0xff && packet[0] != 0x00)
428 fatal(
"[ net: ethernet: ");
429 for (i=0; i<6; i++)
fatal(
"%02x", packet[i]);
fatal(
" ");
430 for (i=6; i<12; i++)
fatal(
"%02x", packet[i]);
fatal(
" ");
431 for (i=12; i<14; i++)
fatal(
"%02x", packet[i]);
fatal(
" ");
432 for (i=14; i<len; i++)
fatal(
"%02x", packet[i]);
fatal(
" ]\n");
435 eth_type = (packet[12] << 8) + packet[13];
440 if (for_the_gateway) {
446 if (packet[0] == 0xff && packet[1] == 0xff &&
447 packet[2] == 0xff && packet[3] == 0xff &&
448 packet[4] == 0xff && packet[5] == 0xff) {
454 fatal(
"[ net_ethernet_tx: IP packet not for gateway, "
455 "and not broadcast: ");
457 fatal(
"%02x", packet[i]);
465 if (len != 42 && len != 60)
466 fatal(
"[ net_ethernet_tx: WARNING! unusual "
467 "ARP len (%i) ]\n", len);
468 net_arp(
net, extra, packet + 14, len - 14, 0);
474 net_arp(
net, extra, packet + 14, len - 14, 1);
481 fatal(
"[ net: TX: UNIMPLEMENTED Sprite packet ]\n");
488 fatal(
"[ net_ethernet_tx: IPv6 is not implemented yet! ]\n");
492 fatal(
"[ net_ethernet_tx: ethernet packet type 0x%04x not yet "
493 "implemented ]\n", eth_type);
503 static void parse_resolvconf(
struct net *
net)
509 unsigned int i, start;
526 f = fopen(
"/etc/resolv.conf",
"r");
531 memset(buf, 0,
sizeof(buf));
532 len = fread(buf, 1,
sizeof(buf) - 100,
f);
534 buf[
sizeof(buf) - 1] =
'\0';
536 for (i=0; i<len; i++)
537 if (strncmp(buf+i,
"nameserver", 10) == 0) {
547 while (i<len && (buf[i]==
' ' || buf[i]==
'\t'))
554 while ((*p >=
'0' && *p <=
'9') || *p ==
'.')
558 #ifdef HAVE_INET_PTON
559 res = inet_pton(AF_INET, buf + start,
571 for (i=0; i<len; i++)
572 if (strncmp(buf+i,
"domain", 6) == 0) {
575 while (i<len && (buf[i]==
' ' || buf[i]==
'\t'))
581 while (i<len && buf[i]!=
'\n' && buf[i]!=
'\r')
604 fprintf(stderr,
"net_add_nic(): extra = NULL\n");
623 static void net_gateway_init(
struct net *
net)
629 x = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
633 x |= ((1 << xl) - 1) & ~1;
664 debug(
"simulated network: ");
668 debug(
" (max outgoing: TCP=%i, UDP=%i)\n",
671 debug(
"simulated gateway+nameserver: ");
678 debug(
"(could not determine nameserver)\n");
680 debug(
"simulated nameserver uses real nameserver ");
690 debug(
"distributed network: local port = %i\n",
693 while (rnp != NULL) {
721 const char *ipv4addr,
int netipv4len,
723 const char *settings_prefix)
729 memset(
net, 0,
sizeof(
struct net));
738 #ifdef HAVE_INET_PTON
744 fprintf(stderr,
"net_init(): could not parse IPv4 address"
745 " '%s'\n", ipv4addr);
749 if (netipv4len < 1 || netipv4len > 30) {
750 fprintf(stderr,
"net_init(): extremely weird ipv4 "
751 "network length (%i)\n", netipv4len);
758 parse_resolvconf(
net);
762 struct sockaddr_in si_self;
771 memset((
char *)&si_self, 0,
sizeof(si_self));
772 si_self.sin_family = AF_INET;
773 si_self.sin_port = htons(local_port);
774 si_self.sin_addr.s_addr = htonl(INADDR_ANY);
776 sizeof(si_self)) < 0) {
787 while ((n_remote--) != 0) {
799 if (strchr(rnp->
name,
':') != NULL)
800 strchr(rnp->
name,
':')[0] =
'\0';
802 hp = gethostbyname(rnp->
name);
804 fprintf(stderr,
"could not resolve '%s'\n",
808 memcpy(&rnp->
ipv4_addr, hp->h_addr, hp->h_length);
813 if (strchr(rnp->
name,
':') == NULL) {
814 fprintf(stderr,
"Remote network '%s' is not "
815 "'host:portnr'?\n", rnp->
name);
818 rnp->
portnr = atoi(strchr(rnp->
name,
':') + 1);
823 net_gateway_init(
net);
828 signal(SIGPIPE, SIG_IGN);