1
0
mirror of https://code.semirocket.science/wrapsix synced 2024-09-19 23:11:04 +03:00

Completed translating of ICMPv4 errors

This commit is contained in:
Michal Zima 2013-03-30 13:39:01 +01:00
parent c9c167871c
commit 7a7651674c

View File

@ -56,6 +56,7 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4,
struct s_icmp *icmp; struct s_icmp *icmp;
unsigned int *icmp_extra; unsigned int *icmp_extra;
unsigned short *icmp_extra_s; unsigned short *icmp_extra_s;
unsigned char *icmp_extra_c;
unsigned char *icmp_data; unsigned char *icmp_data;
struct s_nat *connection; struct s_nat *connection;
unsigned short orig_checksum; unsigned short orig_checksum;
@ -217,6 +218,84 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4,
return 0; return 0;
} }
case ICMPV4_TIME_EXCEEDED:
if (sub_icmp4_error(icmp_data + 4,
payload_size - sizeof(struct s_icmp) - 4,
&packet[0], &new_len, &icmp, &connection)) {
/* something went wrong */
return 1;
}
icmp->type = ICMPV6_TIME_EXCEEDED;
/* new packet is almost finished, yay! */
break;
case ICMPV4_PARAM_PROBLEM:
if (icmp->code == 0 || icmp->code == 2) {
/* update the extra field */
icmp_extra = (unsigned int *)
(((unsigned char *) icmp) +
sizeof(struct s_icmp));
icmp_extra_c = (unsigned char *) icmp_extra;
switch ((int) icmp_extra_c) {
case 0:
case 1:
break;
case 2:
case 3:
*icmp_extra = htonl(4);
break;
case 8:
*icmp_extra = htonl(7);
break;
case 9:
*icmp_extra = htonl(6);
break;
case 12:
case 13:
case 14:
case 15:
*icmp_extra = htonl(8);
break;
case 16:
case 17:
case 18:
case 19:
*icmp_extra = htonl(24);
break;
default:
/* silently drop */
return 0;
}
/* update type&code */
icmp->type = ICMPV6_PARAM_PROBLEM;
icmp->code = 0;
/* translate body of the packet */
if (sub_icmp4_error(icmp_data + 4,
payload_size - sizeof(struct s_icmp) - 4,
&packet[0], &new_len, &icmp, &connection)) {
/* something went wrong */
return 1;
}
/* new packet is almost finished, yay! */
} else {
/* silently drop */
return 0;
}
break;
default: default:
/* silently drop */ /* silently drop */
return 0; return 0;