diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2023-08-22 15:29:57 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-08-22 12:15:33 +0200 |
commit | 955dd3251c9e9b0a1469015748e4600f68e8de0a (patch) | |
tree | cf8a69238316c2e8a526f77b8faad6873c7c7cfe /udp.c | |
parent | 5bf200ae8a1ab298cb393bf1956599d1178567cb (diff) | |
download | passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar.gz passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar.bz2 passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar.lz passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar.xz passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.tar.zst passt-955dd3251c9e9b0a1469015748e4600f68e8de0a.zip |
tcp, udp: Don't pre-fill IPv4 destination address in headers
Because packets sent on the tap interface will always be going to the
guest/namespace, we more-or-less know what address they'll be going to. So
we pre-fill this destination address in our header buffers for IPv4. We
can't do the same for IPv6 because we could need either the global or
link-local address for the guest. In future we're going to want more
flexibility for the destination address, so this pre-filling will get in
the way.
Change the flow so we always fill in the IPv4 destination address for each
packet, rather than prefilling it from proto_update_l2_buf(). In fact for
TCP we already redundantly filled the destination for each packet anyway.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'udp.c')
-rw-r--r-- | udp.c | 9 |
1 files changed, 2 insertions, 7 deletions
@@ -276,10 +276,8 @@ static void udp_update_check4(struct udp4_l2_buf_t *buf) * udp_update_l2_buf() - Update L2 buffers with Ethernet and IPv4 addresses * @eth_d: Ethernet destination address, NULL if unchanged * @eth_s: Ethernet source address, NULL if unchanged - * @ip_da: Pointer to IPv4 destination address, NULL if unchanged */ -void udp_update_l2_buf(const unsigned char *eth_d, const unsigned char *eth_s, - const struct in_addr *ip_da) +void udp_update_l2_buf(const unsigned char *eth_d, const unsigned char *eth_s) { int i; @@ -289,10 +287,6 @@ void udp_update_l2_buf(const unsigned char *eth_d, const unsigned char *eth_s, tap_update_mac(&b4->taph, eth_d, eth_s); tap_update_mac(&b6->taph, eth_d, eth_s); - - if (ip_da) { - b4->iph.daddr = ip_da->s_addr; - } } } @@ -578,6 +572,7 @@ static size_t udp_update_hdr4(const struct ctx *c, int n, in_port_t dstport, ip_len = udp4_l2_mh_sock[n].msg_len + sizeof(b->iph) + sizeof(b->uh); b->iph.tot_len = htons(ip_len); + b->iph.daddr = c->ip4.addr_seen.s_addr; src_port = ntohs(b->s_in.sin_port); |