Add context pointer and source address to the UDP tunnel callback
These are needed for the forthcoming vxlan implementation. The context pointer means we do not have to use a spare pointer field in the inpcb, and the source address is required to populate vxlan's forwarding table. While I highly doubt there is an out of tree consumer of the UDP tunneling callback, this change may be a difficult to eventually MFC. Phabricator: https://reviews.freebsd.org/D383 Reviewed by: gnn
This commit is contained in:
parent
1482f98247
commit
81d3ec1763
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=272886
@ -6832,7 +6832,8 @@ sctp_log_trace(uint32_t subsys, const char *str SCTP_UNUSED, uint32_t a, uint32_
|
||||
|
||||
#endif
|
||||
static void
|
||||
sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *ignored)
|
||||
sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *ignored,
|
||||
const struct sockaddr *sa SCTP_UNUSED, void *ctx SCTP_UNUSED)
|
||||
{
|
||||
struct ip *iph;
|
||||
|
||||
@ -6968,7 +6969,7 @@ sctp_over_udp_start(void)
|
||||
}
|
||||
/* Call the special UDP hook. */
|
||||
if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp4_tun_socket),
|
||||
sctp_recv_udp_tunneled_packet))) {
|
||||
sctp_recv_udp_tunneled_packet, NULL))) {
|
||||
sctp_over_udp_stop();
|
||||
return (ret);
|
||||
}
|
||||
@ -6992,7 +6993,7 @@ sctp_over_udp_start(void)
|
||||
}
|
||||
/* Call the special UDP hook. */
|
||||
if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp6_tun_socket),
|
||||
sctp_recv_udp_tunneled_packet))) {
|
||||
sctp_recv_udp_tunneled_packet, NULL))) {
|
||||
sctp_over_udp_stop();
|
||||
return (ret);
|
||||
}
|
||||
|
@ -312,7 +312,8 @@ udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off,
|
||||
*/
|
||||
up = intoudpcb(inp);
|
||||
if (up->u_tun_func != NULL) {
|
||||
(*up->u_tun_func)(n, off, inp);
|
||||
(*up->u_tun_func)(n, off, inp, (struct sockaddr *)udp_in,
|
||||
up->u_tun_ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1717,7 +1718,7 @@ udp_attach(struct socket *so, int proto, struct thread *td)
|
||||
#endif /* INET */
|
||||
|
||||
int
|
||||
udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f)
|
||||
udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f, void *ctx)
|
||||
{
|
||||
struct inpcb *inp;
|
||||
struct udpcb *up;
|
||||
@ -1733,6 +1734,7 @@ udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f)
|
||||
return (EBUSY);
|
||||
}
|
||||
up->u_tun_func = f;
|
||||
up->u_tun_ctx = ctx;
|
||||
INP_WUNLOCK(inp);
|
||||
return (0);
|
||||
}
|
||||
|
@ -55,7 +55,8 @@ struct udpiphdr {
|
||||
struct inpcb;
|
||||
struct mbuf;
|
||||
|
||||
typedef void(*udp_tun_func_t)(struct mbuf *, int off, struct inpcb *);
|
||||
typedef void(*udp_tun_func_t)(struct mbuf *, int off, struct inpcb *,
|
||||
const struct sockaddr *, void *);
|
||||
|
||||
/*
|
||||
* UDP control block; one per udp.
|
||||
@ -65,6 +66,7 @@ struct udpcb {
|
||||
u_int u_flags; /* Generic UDP flags. */
|
||||
uint16_t u_rxcslen; /* Coverage for incoming datagrams. */
|
||||
uint16_t u_txcslen; /* Coverage for outgoing datagrams. */
|
||||
void *u_tun_ctx; /* Tunneling callback context. */
|
||||
};
|
||||
|
||||
#define intoudpcb(ip) ((struct udpcb *)(ip)->inp_ppcb)
|
||||
@ -176,7 +178,8 @@ void udplite_input(struct mbuf *, int);
|
||||
struct inpcb *udp_notify(struct inpcb *inp, int errno);
|
||||
int udp_shutdown(struct socket *so);
|
||||
|
||||
int udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f);
|
||||
int udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f,
|
||||
void *ctx);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
|
@ -150,7 +150,8 @@ udp6_append(struct inpcb *inp, struct mbuf *n, int off,
|
||||
*/
|
||||
up = intoudpcb(inp);
|
||||
if (up->u_tun_func != NULL) {
|
||||
(*up->u_tun_func)(n, off, inp);
|
||||
(*up->u_tun_func)(n, off, inp, (struct sockaddr *)fromsa,
|
||||
up->u_tun_ctx);
|
||||
return;
|
||||
}
|
||||
#ifdef IPSEC
|
||||
|
Loading…
Reference in New Issue
Block a user