620e19a1b4
We've already gotten rid of most of the IPv4/IPv6 specific data structures in udp.c by merging them with each other. One significant one remains: udp[46]_mh_recv. This was a bit awkward to remove because of a subtle interaction. We initialise the msg_namelen fields to represent the total size we have for a socket address, but when we receive into the arrays those are modified to the actual length of the sockaddr we received. That meant that naively merging the arrays meant that if we received IPv4 datagrams, then IPv6 datagrams, the addresses for the latter would be truncated. In this patch address that by resetting the received msg_namelen as soon as we've found a flow for the datagram. Finding the flow is the only thing that might use the actual sockaddr length, although we in fact don't need it for the time being. This also removes the last use of the 'v6' field from udp_listen_epoll_ref, so remove that as well. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
52 lines
1.6 KiB
C
52 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright (c) 2021 Red Hat GmbH
|
|
* Author: Stefano Brivio <sbrivio@redhat.com>
|
|
*/
|
|
|
|
#ifndef UDP_H
|
|
#define UDP_H
|
|
|
|
#define UDP_TIMER_INTERVAL 1000 /* ms */
|
|
|
|
void udp_portmap_clear(void);
|
|
void udp_listen_sock_handler(const struct ctx *c, union epoll_ref ref,
|
|
uint32_t events, const struct timespec *now);
|
|
void udp_reply_sock_handler(const struct ctx *c, union epoll_ref ref,
|
|
uint32_t events, const struct timespec *now);
|
|
int udp_tap_handler(const struct ctx *c, uint8_t pif,
|
|
sa_family_t af, const void *saddr, const void *daddr,
|
|
const struct pool *p, int idx, const struct timespec *now);
|
|
int udp_sock_init(const struct ctx *c, int ns, sa_family_t af,
|
|
const void *addr, const char *ifname, in_port_t port);
|
|
int udp_init(struct ctx *c);
|
|
void udp_timer(struct ctx *c, const struct timespec *now);
|
|
void udp_update_l2_buf(const unsigned char *eth_d, const unsigned char *eth_s);
|
|
|
|
/**
|
|
* union udp_listen_epoll_ref - epoll reference for "listening" UDP sockets
|
|
* @port: Source port for connected sockets, bound port otherwise
|
|
* @pif: pif for this socket
|
|
* @u32: Opaque u32 value of reference
|
|
*/
|
|
union udp_listen_epoll_ref {
|
|
struct {
|
|
in_port_t port;
|
|
uint8_t pif;
|
|
};
|
|
uint32_t u32;
|
|
};
|
|
|
|
|
|
/**
|
|
* struct udp_ctx - Execution context for UDP
|
|
* @fwd_in: Port forwarding configuration for inbound packets
|
|
* @fwd_out: Port forwarding configuration for outbound packets
|
|
* @timer_run: Timestamp of most recent timer run
|
|
*/
|
|
struct udp_ctx {
|
|
struct fwd_ports fwd_in;
|
|
struct fwd_ports fwd_out;
|
|
struct timespec timer_run;
|
|
};
|
|
|
|
#endif /* UDP_H */
|