35 #include <sys/socket.h> 37 #include <sys/types.h> 60 for (i=0; i<len; i+=2)
61 if (i != chksumoffset) {
62 uint16_t w = (ip_header[i] << 8) + ip_header[i+1];
65 int to_add = sum >> 16;
66 sum = (sum & 0xffff) + to_add;
71 ip_header[chksumoffset + 0] = sum >> 8;
72 ip_header[chksumoffset + 1] = sum & 0xff;
92 int tcp_len,
unsigned char *srcaddr,
unsigned char *dstaddr,
96 unsigned char pseudoh[12];
99 memcpy(pseudoh + 0, srcaddr, 4);
100 memcpy(pseudoh + 4, dstaddr, 4);
102 pseudoh[9] = udpflag? 17 : 6;
103 pseudoh[10] = tcp_len >> 8;
104 pseudoh[11] = tcp_len & 255;
106 for (i=0; i<12; i+=2) {
107 uint16_t w = (pseudoh[i] << 8) + pseudoh[i+1];
109 while (sum > 65535) {
110 int to_add = sum >> 16;
111 sum = (sum & 0xffff) + to_add;
120 for (i=0; i<tcp_len; i+=2)
121 if (i != chksumoffset) {
123 if (!pad || i < tcp_len-2)
124 w = (tcp_header[i] << 8) + tcp_header[i+1];
126 w = (tcp_header[i] << 8) + 0x00;
128 while (sum > 65535) {
129 int to_add = sum >> 16;
130 sum = (sum & 0xffff) + to_add;
135 tcp_header[chksumoffset + 0] = sum >> 8;
136 tcp_header[chksumoffset + 1] = sum & 0xff;
158 static void net_ip_icmp(
struct net *
net,
void *extra,
159 unsigned char *packet,
int len)
168 debug(
"[ ICMP echo ]\n");
172 memcpy(lp->
data + 12, packet + 12, len - 12);
175 memcpy(lp->
data + 0, packet + 6, 6);
176 memcpy(lp->
data + 6, packet + 0, 6);
179 memcpy(lp->
data + 26, packet + 30, 4);
180 memcpy(lp->
data + 30, packet + 26, 4);
196 fatal(
"[ net: ICMP type %i not yet implemented ]\n", type);
206 static void tcp_closeconnection(
struct net *net,
int con_id)
229 int con_id,
int connecting,
unsigned char *
data,
int datalen,
int rst)
232 int tcp_length, ip_len, option_len = 20;
239 tcp_length = 20 + option_len + datalen;
240 ip_len = 20 + tcp_length;
252 lp->
data[16] = ip_len >> 8;
253 lp->
data[17] = ip_len & 0xff;
261 outside_ip_address, 4);
263 inside_ip_address, 4);
272 outside_seqnr >> 24) & 0xff;
274 outside_seqnr >> 16) & 0xff;
276 outside_seqnr >> 8) & 0xff;
278 outside_seqnr & 0xff;
280 outside_acknr >> 24) & 0xff;
282 outside_acknr >> 16) & 0xff;
284 outside_acknr >> 8) & 0xff;
288 lp->
data[46] = (option_len + 20) / 4 * 0x10;
291 lp->
data[47] |= 0x02;
293 lp->
data[47] |= 0x08;
295 lp->
data[47] |= 0x04;
297 lp->
data[47] |= 0x01;
324 inside_timestamp >> 24) & 0xff;
326 inside_timestamp >> 16) & 0xff;
328 inside_timestamp >> 8) & 0xff;
330 inside_timestamp & 0xff;
334 memcpy(lp->
data + 74, data, datalen);
345 fatal(
"[ net_ip_tcp_connectionreply(%i): ", connecting);
346 for (i=0; i<ip_len+14; i++)
379 static void net_ip_tcp(
struct net *net,
void *
extra,
380 unsigned char *packet,
int len)
382 int con_id, free_con_id, i, res;
383 int srcport, dstport, data_offset, window, checksum, urgptr;
384 int syn, ack, psh, rst, urg, fin;
385 uint32_t seqnr, acknr;
386 struct sockaddr_in remote_ip;
392 fatal(
"[ net: TCP: ");
394 fatal(
"%02x", packet[i]);
398 srcport = (packet[34] << 8) + packet[35];
399 dstport = (packet[36] << 8) + packet[37];
401 seqnr = (packet[38] << 24) + (packet[39] << 16)
402 + (packet[40] << 8) + packet[41];
403 acknr = (packet[42] << 24) + (packet[43] << 16)
404 + (packet[44] << 8) + packet[45];
407 fatal(
"%i.%i.%i.%i:%i -> %i.%i.%i.%i:%i, seqnr=%lli acknr=%lli ",
408 packet[26], packet[27], packet[28], packet[29], srcport,
409 packet[30], packet[31], packet[32], packet[33], dstport,
410 (
long long)seqnr, (
long long)acknr);
413 data_offset = (packet[46] >> 4) * 4 + 34;
416 urg = packet[47] & 32;
417 ack = packet[47] & 16;
418 psh = packet[47] & 8;
419 rst = packet[47] & 4;
420 syn = packet[47] & 2;
421 fin = packet[47] & 1;
422 window = (packet[48] << 8) + packet[49];
423 checksum = (packet[50] << 8) + packet[51];
424 urgptr = (packet[52] << 8) + packet[53];
427 fatal(urg?
"URG " :
"");
428 fatal(ack?
"ACK " :
"");
429 fatal(psh?
"PSH " :
"");
430 fatal(rst?
"RST " :
"");
431 fatal(syn?
"SYN " :
"");
432 fatal(fin?
"FIN " :
"");
434 fatal(
"window=0x%04x checksum=0x%04x urgptr=0x%04x ",
435 window, checksum, urgptr);
438 for (i=34+20; i<data_offset; i++)
439 fatal(
"%02x", packet[i]);
442 for (i=data_offset; i<len; i++)
443 fatal(
"%02x", packet[i]);
449 packet + 26, packet + 30, 0);
450 if (packet[50] * 256 + packet[51] != checksum) {
451 debug(
"TCP: dropping packet because of checksum mismatch " 452 "(0x%04x != 0x%04x)\n", packet[50] * 256 + packet[51],
459 con_id = free_con_id = -1;
467 packet + 26, 4) == 0 &&
469 packet + 30, 4) == 0) {
479 if (con_id < 0 && !syn) {
480 debug(
"[ net: TCP: dropping packet from unknown connection," 481 " %i.%i.%i.%i:%i -> %i.%i.%i.%i:%i %s%s%s%s%s]\n",
482 packet[26], packet[27], packet[28], packet[29], srcport,
483 packet[30], packet[31], packet[32], packet[33], dstport,
484 fin?
"FIN ":
"", syn?
"SYN ":
"", ack?
"ACK ":
"",
485 psh?
"PSH ":
"", rst?
"RST ":
"");
490 if (con_id >= 0 && syn) {
491 debug(
"[ net: TCP: ignoring redundant SYN packet from known" 492 " connection, %i.%i.%i.%i:%i -> %i.%i.%i.%i:%i ]\n",
493 packet[26], packet[27], packet[28], packet[29], srcport,
494 packet[30], packet[31], packet[32], packet[33], dstport);
501 if (con_id < 0 && syn) {
502 debug(
"[ net: TCP: new outgoing connection, %i.%i.%i.%i:%i" 503 " -> %i.%i.%i.%i:%i ]\n",
504 packet[26], packet[27], packet[28], packet[29], srcport,
505 packet[30], packet[31], packet[32], packet[33], dstport);
508 if (free_con_id < 0) {
514 fatal(
"[ TOO MANY TCP CONNECTIONS IN USE! " 515 "Increase MAX_TCP_CONNECTIONS! ]\n");
519 int64_t oldest = net->
520 tcp_connections[0].last_used_timestamp;
523 fatal(
"[ NO FREE TCP SLOTS, REUSING OLDEST ONE ]\n");
526 last_used_timestamp < oldest) {
531 tcp_closeconnection(net, free_con_id);
535 con_id = free_con_id;
549 socket(AF_INET, SOCK_STREAM, 0);
551 fatal(
"[ net: TCP: socket() returned %i ]\n",
556 debug(
"[ new tcp outgoing socket=%i ]\n",
566 remote_ip.sin_family = AF_INET;
567 memcpy((
unsigned char *)&remote_ip.sin_addr,
569 remote_ip.sin_port = htons(
573 (
struct sockaddr *)&remote_ip,
sizeof(remote_ip));
583 ((random() & 0xffff) << 16) + (random() & 0xffff);
587 debug(
"[ 'rst': disconnecting TCP connection %i ]\n", con_id);
589 tcp_closeconnection(net, con_id);
595 debug(
"[ 'ack': guestOS's final termination of TCP " 596 "connection %i ]\n", con_id);
602 tcp_closeconnection(net, con_id);
608 debug(
"[ 'fin': response to outside's disconnection of " 609 "TCP connection %i ]\n", con_id);
619 debug(
"[ 'fin': guestOS disconnecting TCP connection %i ]\n",
631 debug(
"ACK %i bytes, inside_acknr=%u outside_seqnr=%u\n",
639 debug(
" all acked\n");
647 if (packet[34 + 30] == 0x08 && packet[34 + 31] == 0x0a)
649 (packet[34 + 32 + 0] << 24) +
650 (packet[34 + 32 + 1] << 16) +
651 (packet[34 + 32 + 2] << 8) +
652 (packet[34 + 32 + 3] << 0);
660 debug(
"[ not connected to outside ]\n");
665 if (data_offset >= len)
674 send_ofs = data_offset;
678 debug(
"[ %i bytes of tcp data to be sent, beginning at seqnr %u, ",
679 len - data_offset, seqnr);
680 debug(
"outside is at acknr %u ==> %i actual bytes to be sent ]\n",
687 debug(
"!! outgoing TCP packet dropped (seqnr = %u, " 688 "outside_acknr = %u)\n", seqnr,
693 if (len - send_ofs > 0) {
697 tv.tv_sec = tv.tv_usec = 0;
700 NULL, &rfds, NULL, &tv);
704 debug(
"[ TCP: disconnect on select for writing ]\n");
709 packet + send_ofs, len - send_ofs);
713 }
else if (errno == EAGAIN) {
717 debug(
"[ error writing %i bytes to TCP connection %i:" 718 " errno = %i ]\n", len - send_ofs, con_id, errno);
721 debug(
"[ TCP: disconnect on write() ]\n");
749 static void net_ip_udp(
struct net *net,
void *extra,
750 unsigned char *packet,
int len)
752 int con_id, free_con_id, i, srcport, dstport, udp_len;
754 struct sockaddr_in remote_ip;
756 if ((packet[20] & 0x3f) != 0) {
757 fatal(
"[ net_ip_udp(): WARNING! fragmented UDP " 762 srcport = (packet[34] << 8) + packet[35];
763 dstport = (packet[36] << 8) + packet[37];
764 udp_len = (packet[38] << 8) + packet[39];
767 debug(
"[ net: UDP: ");
768 debug(
"srcport=%i dstport=%i len=%i ", srcport, dstport, udp_len);
769 for (i=42; i<len; i++) {
770 if (packet[i] >=
' ' && packet[i] < 127)
771 debug(
"%c", packet[i]);
773 debug(
"[%02x]", packet[i]);
778 con_id = free_con_id = -1;
786 packet + 26, 4) == 0 &&
788 packet + 30, 4) == 0) {
794 debug(
"&& UDP connection is ");
799 if (free_con_id < 0) {
800 int64_t oldest = net->
801 udp_connections[0].last_used_timestamp;
804 debug(
", NO FREE SLOTS, REUSING OLDEST ONE");
813 con_id = free_con_id;
829 fatal(
"[ net: UDP: socket() returned %i ]\n",
844 debug(
", connection id %i\n", con_id);
849 remote_ip.sin_family = AF_INET;
850 memcpy((
unsigned char *)&remote_ip.sin_addr,
861 memcpy((
unsigned char *)&remote_ip.sin_addr,
866 remote_ip.sin_port = htons(
870 len - 42, 0, (
const struct sockaddr *)&remote_ip,
874 debug(
"[ net: UDP: unable to send %i bytes ]\n", len-42);
876 debug(
"[ net: UDP: OK!!! ]\n");
885 void net_ip(
struct net *net,
void *extra,
unsigned char *packet,
int len)
890 debug(
"[ net: IP: ");
891 debug(
"ver=%02x ", packet[14]);
892 debug(
"tos=%02x ", packet[15]);
893 debug(
"len=%02x%02x ", packet[16], packet[17]);
894 debug(
"id=%02x%02x ", packet[18], packet[19]);
895 debug(
"ofs=%02x%02x ", packet[20], packet[21]);
896 debug(
"ttl=%02x ", packet[22]);
897 debug(
"p=%02x ", packet[23]);
898 debug(
"sum=%02x%02x ", packet[24], packet[25]);
899 debug(
"src=%02x%02x%02x%02x ",
900 packet[26], packet[27], packet[28], packet[29]);
901 debug(
"dst=%02x%02x%02x%02x ",
902 packet[30], packet[31], packet[32], packet[33]);
903 for (i=34; i<len; i++)
904 debug(
"%02x", packet[i]);
909 if (len > 14 + packet[16]*256 + packet[17])
910 len = 14 + packet[16]*256 + packet[17];
912 if (packet[14] == 0x45) {
914 switch (packet[23]) {
916 net_ip_icmp(net, extra, packet, len);
919 net_ip_tcp(net, extra, packet, len);
922 net_ip_udp(net, extra, packet, len);
925 fatal(
"[ net: IP: UNIMPLEMENTED protocol %i ]\n",
929 fatal(
"[ net: IP: UNIMPLEMENTED ip, first byte = 0x%02x ]\n",
942 static void net_ip_broadcast_dhcp(
struct net *net,
void *extra,
943 unsigned char *packet,
int len)
952 fatal(
"[ net: IPv4 DHCP: ");
954 fatal(
"ver=%02x ", packet[14]);
955 fatal(
"tos=%02x ", packet[15]);
956 fatal(
"len=%02x%02x ", packet[16], packet[17]);
957 fatal(
"id=%02x%02x ", packet[18], packet[19]);
958 fatal(
"ofs=%02x%02x ", packet[20], packet[21]);
959 fatal(
"ttl=%02x ", packet[22]);
960 fatal(
"p=%02x ", packet[23]);
961 fatal(
"sum=%02x%02x ", packet[24], packet[25]);
963 fatal(
"src=%02x%02x%02x%02x ",
964 packet[26], packet[27], packet[28], packet[29]);
965 fatal(
"dst=%02x%02x%02x%02x ",
966 packet[30], packet[31], packet[32], packet[33]);
968 for (i=34; i<
len; i++)
969 fatal(
"%02x", packet[i]);
972 if (len < 34 + 8 + 236) {
973 fatal(
"[ DHCP packet too short? Len=%i ]\n", len);
985 fatal(
"op=%02x ", packet[42]);
986 fatal(
"htype=%02x ", packet[43]);
987 fatal(
"hlen=%02x ", packet[44]);
988 fatal(
"hops=%02x ", packet[45]);
989 fatal(
"xid=%02x%02x%02x%02x ", packet[46], packet[47],
990 packet[48], packet[49]);
991 fatal(
"secs=%02x%02x ", packet[50], packet[51]);
992 fatal(
"flags=%02x%02x ", packet[52], packet[53]);
993 fatal(
"ciaddr=%02x%02x%02x%02x ", packet[54], packet[55],
994 packet[56], packet[57]);
995 fatal(
"yiaddr=%02x%02x%02x%02x ", packet[58], packet[59],
996 packet[60], packet[61]);
997 fatal(
"siaddr=%02x%02x%02x%02x ", packet[62], packet[63],
998 packet[64], packet[65]);
999 fatal(
"giaddr=%02x%02x%02x%02x ", packet[66], packet[67],
1000 packet[68], packet[69]);
1002 for (i=70; i<70+16; i++)
1003 fatal(
"%02x", packet[i]);
1014 memcpy(lp->
data, packet, 278);
1017 memcpy(lp->
data + 0, packet + 6, 6);
1021 lp->
data[16] = (reply_len - 14) >> 8;
1022 lp->
data[17] = (reply_len - 14) & 0xff;
1026 lp->
data[30] = 0xff;
1027 lp->
data[31] = 0xff;
1028 lp->
data[32] = 0xff;
1029 lp->
data[33] = 0xff;
1032 memcpy(lp->
data + 34, packet + 36, 2);
1033 memcpy(lp->
data + 36, packet + 34, 2);
1036 lp->
data[38] = (reply_len - 34) >> 8;
1037 lp->
data[39] = (reply_len - 34) & 0xff;
1049 lp->
data[42] = 0x02;
1051 snprintf((
char *)lp->
data + 70+16+64, 8,
"gxemul");
1055 lp->
data[279] = 130;
1062 lp->
data[284] = 255;
1075 lp->
data[306] = 255;
1087 fatal(
"[ net: IPv4 DHCP REPLY: ");
1088 for (i=0; i<14; i++)
1089 fatal(
"%02x", packet[i]);
1090 fatal(
"ver=%02x ", packet[14]);
1091 fatal(
"tos=%02x ", packet[15]);
1092 fatal(
"len=%02x%02x ", packet[16], packet[17]);
1093 fatal(
"id=%02x%02x ", packet[18], packet[19]);
1094 fatal(
"ofs=%02x%02x ", packet[20], packet[21]);
1095 fatal(
"ttl=%02x ", packet[22]);
1096 fatal(
"p=%02x ", packet[23]);
1097 fatal(
"sum=%02x%02x ", packet[24], packet[25]);
1098 fatal(
"src=%02x%02x%02x%02x ",
1099 packet[26], packet[27], packet[28], packet[29]);
1100 fatal(
"dst=%02x%02x%02x%02x ",
1101 packet[30], packet[31], packet[32], packet[33]);
1102 fatal(
"op=%02x ", packet[42]);
1103 fatal(
"htype=%02x ", packet[43]);
1104 fatal(
"hlen=%02x ", packet[44]);
1105 fatal(
"hops=%02x ", packet[45]);
1106 fatal(
"xid=%02x%02x%02x%02x ", packet[46], packet[47],
1107 packet[48], packet[49]);
1108 fatal(
"secs=%02x%02x ", packet[50], packet[51]);
1109 fatal(
"flags=%02x%02x ", packet[52], packet[53]);
1110 fatal(
"ciaddr=%02x%02x%02x%02x ", packet[54], packet[55],
1111 packet[56], packet[57]);
1112 fatal(
"yiaddr=%02x%02x%02x%02x ", packet[58], packet[59],
1113 packet[60], packet[61]);
1114 fatal(
"siaddr=%02x%02x%02x%02x ", packet[62], packet[63],
1115 packet[64], packet[65]);
1116 fatal(
"giaddr=%02x%02x%02x%02x ", packet[66], packet[67],
1117 packet[68], packet[69]);
1119 for (i=70; i<70+16; i++)
1120 fatal(
"%02x", packet[i]);
1134 unsigned char *packet,
int len)
1136 unsigned char *p = (
unsigned char *) &net->
netmask_ipv4;
1138 int i, xl, warning = 0, match = 0;
1141 fatal(
"[ net: IP BROADCAST: ");
1142 fatal(
"ver=%02x ", packet[14]);
1143 fatal(
"tos=%02x ", packet[15]);
1144 fatal(
"len=%02x%02x ", packet[16], packet[17]);
1145 fatal(
"id=%02x%02x ", packet[18], packet[19]);
1146 fatal(
"ofs=%02x%02x ", packet[20], packet[21]);
1147 fatal(
"ttl=%02x ", packet[22]);
1148 fatal(
"p=%02x ", packet[23]);
1149 fatal(
"sum=%02x%02x ", packet[24], packet[25]);
1150 fatal(
"src=%02x%02x%02x%02x ",
1151 packet[26], packet[27], packet[28], packet[29]);
1152 fatal(
"dst=%02x%02x%02x%02x ",
1153 packet[30], packet[31], packet[32], packet[33]);
1154 for (i=34; i<
len; i++)
1155 fatal(
"%02x", packet[i]);
1161 y = (packet[30] << 24) + (packet[31] << 16) +
1162 (packet[32] << 8) + packet[33];
1164 x = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
1179 if (y == 0xffffffff)
1183 fatal(
"[ net_ip_broadcast(): warning: broadcast to " 1184 "0x%08x, expecting broadcast to 0x%08x or " 1185 "0xffffffff ]\n", y, x);
1188 if (len > 14 + packet[16]*256 + packet[17])
1189 len = 14 + packet[16]*256 + packet[17];
1192 if (packet[14] == 0x45 &&
1193 packet[23] == 0x11 &&
1194 packet[34] == 0 && packet[35] == 68 &&
1195 packet[36] == 0 && packet[37] == 67) {
1196 net_ip_broadcast_dhcp(net, extra, packet, len);
1201 fatal(
"[ net: UNIMPLEMENTED IP BROADCAST: ");
1202 fatal(
"ver=%02x ", packet[14]);
1203 fatal(
"tos=%02x ", packet[15]);
1204 fatal(
"len=%02x%02x ", packet[16], packet[17]);
1205 fatal(
"id=%02x%02x ", packet[18], packet[19]);
1206 fatal(
"ofs=%02x%02x ", packet[20], packet[21]);
1207 fatal(
"ttl=%02x ", packet[22]);
1208 fatal(
"p=%02x ", packet[23]);
1209 fatal(
"sum=%02x%02x ", packet[24], packet[25]);
1210 fatal(
"src=%02x%02x%02x%02x ",
1211 packet[26], packet[27], packet[28], packet[29]);
1212 fatal(
"dst=%02x%02x%02x%02x ",
1213 packet[30], packet[31], packet[32], packet[33]);
1214 for (i=34; i<
len; i++)
1215 fatal(
"%02x", packet[i]);
1227 int received_packets_this_tick = 0;
1228 int max_packets_this_tick = 200;
1233 unsigned char buf[66000];
1234 unsigned char udp_data[66008];
1235 struct sockaddr_in from;
1236 socklen_t from_len =
sizeof(from);
1237 int ip_len, udp_len;
1240 int bytes_converted = 0;
1241 int this_packets_data_length;
1242 int fragment_ofs = 0;
1244 if (received_packets_this_tick > max_packets_this_tick)
1251 fatal(
"INTERNAL ERROR in net.c, udp socket < 0 " 1257 sizeof(buf), 0, (
struct sockaddr *)&from, &from_len);
1275 memcpy(((
unsigned char *)(&from))+4,
1294 max_per_packet = 1500;
1299 udp_data[0] = ((
unsigned char *)&from)[2];
1300 udp_data[1] = ((
unsigned char *)&from)[3];
1302 inside_udp_port >> 8) & 0xff;
1304 inside_udp_port & 0xff;
1305 udp_data[4] = udp_len >> 8;
1306 udp_data[5] = udp_len & 0xff;
1309 memcpy(udp_data + 8, buf, res);
1316 while (bytes_converted < udp_len) {
1317 this_packets_data_length = udp_len - bytes_converted;
1320 if (this_packets_data_length > max_per_packet-34) {
1321 this_packets_data_length =
1322 max_per_packet - 34;
1323 while (this_packets_data_length & 7)
1324 this_packets_data_length --;
1327 ip_len = 20 + this_packets_data_length;
1330 14 + 20 + this_packets_data_length);
1334 ethernet_address, 6);
1336 lp->
data[12] = 0x08;
1337 lp->
data[13] = 0x00;
1340 lp->
data[14] = 0x45;
1341 lp->
data[15] = 0x00;
1342 lp->
data[16] = ip_len >> 8;
1343 lp->
data[17] = ip_len & 0xff;
1347 lp->
data[20] = (fragment_ofs >> 8);
1348 if (bytes_converted + this_packets_data_length
1350 lp->
data[20] |= 0x20;
1351 lp->
data[21] = fragment_ofs & 0xff;
1352 lp->
data[22] = 0x40;
1354 lp->
data[26] = ((
unsigned char *)&from)[4];
1355 lp->
data[27] = ((
unsigned char *)&from)[5];
1356 lp->
data[28] = ((
unsigned char *)&from)[6];
1357 lp->
data[29] = ((
unsigned char *)&from)[7];
1359 inside_ip_address, 4);
1362 memcpy(lp->
data+34, udp_data + bytes_converted,
1363 this_packets_data_length);
1365 bytes_converted += this_packets_data_length;
1366 fragment_ofs = bytes_converted / 8;
1368 received_packets_this_tick ++;
1386 int received_packets_this_tick = 0;
1387 int max_packets_this_tick = 200;
1391 unsigned char buf[66000];
1396 if (received_packets_this_tick > max_packets_this_tick)
1403 fatal(
"INTERNAL ERROR in net.c, tcp socket < 0" 1419 tv.tv_sec = tv.tv_usec = 0;
1422 NULL, &rfds, NULL, &tv);
1424 if (errno == ECONNREFUSED) {
1425 fatal(
"[ ECONNREFUSED: TODO ]\n");
1428 fatal(
"CHANGING TO TCP_OUTSIDE_DISCONNECTED " 1429 "(refused connection)\n");
1433 if (errno == ETIMEDOUT) {
1434 fatal(
"[ ETIMEDOUT: TODO ]\n");
1438 fatal(
"CHANGING TO TCP_OUTSIDE_DISCONNECTED " 1447 debug(
"CHANGING TO TCP_OUTSIDE_CONNECTED\n");
1466 debug(
" at seqnr %u but backing back to %u," 1467 " resending %i bytes\n",
1475 incoming_buf_rounds = 0;
1484 incoming_buf_len, 0);
1501 tv.tv_sec = tv.tv_usec = 0;
1516 debug(
" putting %i bytes (seqnr %u) in the incoming " 1518 incoming_buf_seqnr);
1524 }
else if (res == 0) {
1527 debug(
"CHANGING TO TCP_OUTSIDE_DISCONNECTED, read" 1534 fatal(
"CHANGING TO TCP_OUTSIDE_DISCONNECTED, " 1535 "read res<=0, errno = %i\n", errno);
void fatal(const char *fmt,...)
#define TCP_INCOMING_BUF_LEN
unsigned char gateway_ipv4_addr[4]
unsigned char outside_ip_address[4]
void net_ip_tcp_connectionreply(struct net *net, void *extra, int con_id, int connecting, unsigned char *data, int datalen, int rst)
unsigned char * incoming_buf
#define TCP_OUTSIDE_DISCONNECTED2
#define MAX_TCP_CONNECTIONS
unsigned char inside_ip_address[4]
unsigned char ethernet_address[6]
void net_ip_checksum(unsigned char *ip_header, int chksumoffset, int len)
struct ethernet_packet_link * net_allocate_ethernet_packet_link(struct net *net, void *extra, size_t len)
unsigned char ethernet_address[6]
#define TCP_OUTSIDE_TRYINGTOCONNECT
#define CHECK_ALLOCATION(ptr)
unsigned char inside_ip_address[4]
int64_t last_used_timestamp
uint32_t inside_timestamp
#define TCP_OUTSIDE_DISCONNECTED
void net_ip_tcp_checksum(unsigned char *tcp_header, int chksumoffset, int tcp_len, unsigned char *srcaddr, unsigned char *dstaddr, int udpflag)
unsigned char outside_ip_address[4]
#define TCP_OUTSIDE_CONNECTED
struct in_addr nameserver_ipv4
void net_ip_broadcast(struct net *net, void *extra, unsigned char *packet, int len)
int64_t last_used_timestamp
void net_udp_rx_avail(struct net *net, void *extra)
#define MAX_UDP_CONNECTIONS
void net_tcp_rx_avail(struct net *net, void *extra)
struct in_addr netmask_ipv4
unsigned char gateway_ethernet_addr[6]
struct udp_connection udp_connections[MAX_UDP_CONNECTIONS]
uint32_t incoming_buf_seqnr
void net_ip(struct net *net, void *extra, unsigned char *packet, int len)
struct tcp_connection tcp_connections[MAX_TCP_CONNECTIONS]