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];
164 net,
extra, 60 + 14);
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;
189 net,
extra, 60 + 14);
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);
282 for (i=0; i<net->
n_nics; i++) {
286 memcpy(lp->
data, buf, res);
289 }
while (res != -1 && nreceived < 100);
317 unsigned char **packetp,
int *lenp)
329 if (lp->
extra == extra) {
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);
392 if (!for_the_gateway && extra != NULL && net->
n_nics > 0) {
393 for (i=0; i<net->
n_nics; i++)
400 memcpy(lp->
data, packet, len);
408 if (!for_the_gateway && net->
remote_nets != NULL) {
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) {
441 net_ip(net, extra, packet, len);
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')
598 void net_add_nic(
struct net *net,
void *extra,
unsigned char *macaddr)
604 fprintf(stderr,
"net_add_nic(): extra = NULL\n");
623 static void net_gateway_init(
struct net *net)
625 unsigned char *p = (
unsigned char *) &net->
netmask_ipv4;
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);
761 if (local_port != 0) {
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);
void fatal(const char *fmt,...)
#define DEBUG_INDENTATION
struct remote_net * remote_nets
unsigned char gateway_ipv4_addr[4]
void net_dumpinfo(struct net *net)
#define MAX_TCP_CONNECTIONS
void f(int s, int func, int only_name)
struct ethernet_packet_link * next
struct ethernet_packet_link * net_allocate_ethernet_packet_link(struct net *net, void *extra, size_t len)
void net_ip_broadcast(struct net *net, void *extra, unsigned char *packet, int len)
void net_ip(struct net *net, void *extra, unsigned char *packet, int len)
struct ethernet_packet_link * first_ethernet_packet
#define NET_ADDR_ETHERNET
void send_udp(struct in_addr *addrp, int portnr, unsigned char *packet, size_t len)
void net_udp_rx_avail(struct net *net, void *extra)
#define CHECK_ALLOCATION(ptr)
struct net * net_init(struct emul *emul, int init_flags, const char *ipv4addr, int netipv4len, char **remote, int n_remote, int local_port, const char *settings_prefix)
void net_ethernet_tx(struct net *net, void *extra, unsigned char *packet, int len)
void net_tcp_rx_avail(struct net *net, void *extra)
#define NET_INIT_FLAG_GATEWAY
struct in_addr nameserver_ipv4
#define MAX_UDP_CONNECTIONS
void debug_indentation(int diff)
int net_ethernet_rx(struct net *net, void *extra, unsigned char **packetp, int *lenp)
struct in_addr netmask_ipv4
unsigned char gateway_ethernet_addr[6]
void net_debugaddr(void *addr, int type)
struct ethernet_packet_link * prev
void net_add_nic(struct net *net, void *extra, unsigned char *macaddr)
int net_ethernet_rx_avail(struct net *net, void *extra)
struct ethernet_packet_link * last_ethernet_packet