Try to reply with node address only when decrementing the TTL.

Signed-off-by: Vittorio Gambaletta <openwrt@vittgam.net>
This commit is contained in:
Vittorio Gambaletta (VittGam) 2015-09-04 17:04:03 +02:00 committed by Guus Sliepen
parent 92203bdbcb
commit 17e54ea0be

View file

@ -259,7 +259,6 @@ static void route_ipv4_unreachable(node_t *source, vpn_packet_t *packet, length_
struct in_addr ip_src; struct in_addr ip_src;
struct in_addr ip_dst; struct in_addr ip_dst;
uint32_t oldlen; uint32_t oldlen;
int sockfd;
if(ratelimit(3)) if(ratelimit(3))
return; return;
@ -279,7 +278,8 @@ static void route_ipv4_unreachable(node_t *source, vpn_packet_t *packet, length_
/* Try to reply with an IP address assigned to the local machine */ /* Try to reply with an IP address assigned to the local machine */
sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (type == ICMP_TIME_EXCEEDED && code == ICMP_EXC_TTL) {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd != -1) { if (sockfd != -1) {
struct sockaddr_in addr; struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
@ -295,6 +295,7 @@ static void route_ipv4_unreachable(node_t *source, vpn_packet_t *packet, length_
} }
close(sockfd); close(sockfd);
} }
}
oldlen = packet->len - ether_size; oldlen = packet->len - ether_size;
@ -469,7 +470,6 @@ static void route_ipv6_unreachable(node_t *source, vpn_packet_t *packet, length_
struct ip6_hdr ip6; struct ip6_hdr ip6;
struct icmp6_hdr icmp6 = {0}; struct icmp6_hdr icmp6 = {0};
uint16_t checksum; uint16_t checksum;
int sockfd;
struct { struct {
struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_src; /* source address */
@ -496,7 +496,8 @@ static void route_ipv6_unreachable(node_t *source, vpn_packet_t *packet, length_
/* Try to reply with an IP address assigned to the local machine */ /* Try to reply with an IP address assigned to the local machine */
sockfd = socket(AF_INET6, SOCK_DGRAM, 0); if (type == ICMP6_TIME_EXCEEDED && code == ICMP6_TIME_EXCEED_TRANSIT) {
int sockfd = socket(AF_INET6, SOCK_DGRAM, 0);
if (sockfd != -1) { if (sockfd != -1) {
struct sockaddr_in6 addr; struct sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
@ -512,6 +513,7 @@ static void route_ipv6_unreachable(node_t *source, vpn_packet_t *packet, length_
} }
close(sockfd); close(sockfd);
} }
}
pseudo.length = packet->len - ether_size; pseudo.length = packet->len - ether_size;