Split tap_ip_send() into IPv4 and IPv6 specific functions
The IPv4 and IPv6 paths in tap_ip_send() have very little in common, and it turns out that every caller (statically) knows if it is using IPv4 or IPv6. So split into separate tap_ip4_send() and tap_ip6_send() functions. Use a new tap_l2_hdr() function for the very small common part. While we're there, make some minor cleanups: - We were double writing some fields in the IPv6 header, so that it temporary matched the pseudo-header for checksum calculation. With recent checksum reworks, this isn't neccessary any more. - We don't use any IPv4 header options, so use some sizeof() constructs instead of some open coded values for header length. - The comment used to say that the flow label was for TCP over IPv6, but in fact the only thing we used it for was DHCPv6 over UDP traffic Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:

committed by
Stefano Brivio

parent
fb5d1c5d7d
commit
f616ca231e
10
icmp.c
10
icmp.c
@@ -69,10 +69,6 @@ static uint8_t icmp_act[IP_VERSIONS][DIV_ROUND_UP(ICMP_NUM_IDS, 8)];
|
||||
void icmp_sock_handler(const struct ctx *c, union epoll_ref ref,
|
||||
uint32_t events, const struct timespec *now)
|
||||
{
|
||||
struct in6_addr a6 = { .s6_addr = { 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0xff, 0xff,
|
||||
0, 0, 0, 0 } };
|
||||
union icmp_epoll_ref *iref = &ref.r.p.icmp;
|
||||
struct sockaddr_storage sr;
|
||||
socklen_t sl = sizeof(sr);
|
||||
@@ -109,7 +105,7 @@ void icmp_sock_handler(const struct ctx *c, union epoll_ref ref,
|
||||
icmp_id_map[V6][id].seq = seq;
|
||||
}
|
||||
|
||||
tap_ip_send(c, &sr6->sin6_addr, IPPROTO_ICMPV6, buf, n, 0);
|
||||
tap_ip6_send(c, &sr6->sin6_addr, IPPROTO_ICMPV6, buf, n, 0);
|
||||
} else {
|
||||
struct sockaddr_in *sr4 = (struct sockaddr_in *)&sr;
|
||||
struct icmphdr *ih = (struct icmphdr *)buf;
|
||||
@@ -127,9 +123,7 @@ void icmp_sock_handler(const struct ctx *c, union epoll_ref ref,
|
||||
icmp_id_map[V4][id].seq = seq;
|
||||
}
|
||||
|
||||
memcpy(&a6.s6_addr[12], &sr4->sin_addr, sizeof(sr4->sin_addr));
|
||||
|
||||
tap_ip_send(c, &a6, IPPROTO_ICMP, buf, n, 0);
|
||||
tap_ip4_send(c, sr4->sin_addr.s_addr, IPPROTO_ICMP, buf, n);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user