Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Oct 2014 06:09:00 +0000 (UTC)
From:      Bryan Venteicher <bryanv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r272886 - in head/sys: netinet netinet6
Message-ID:  <201410100609.s9A690NU067686@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bryanv
Date: Fri Oct 10 06:08:59 2014
New Revision: 272886
URL: https://svnweb.freebsd.org/changeset/base/272886

Log:
  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

Modified:
  head/sys/netinet/sctputil.c
  head/sys/netinet/udp_usrreq.c
  head/sys/netinet/udp_var.h
  head/sys/netinet6/udp6_usrreq.c

Modified: head/sys/netinet/sctputil.c
==============================================================================
--- head/sys/netinet/sctputil.c	Fri Oct 10 03:20:12 2014	(r272885)
+++ head/sys/netinet/sctputil.c	Fri Oct 10 06:08:59 2014	(r272886)
@@ -6832,7 +6832,8 @@ sctp_log_trace(uint32_t subsys, const ch
 
 #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);
 	}

Modified: head/sys/netinet/udp_usrreq.c
==============================================================================
--- head/sys/netinet/udp_usrreq.c	Fri Oct 10 03:20:12 2014	(r272885)
+++ head/sys/netinet/udp_usrreq.c	Fri Oct 10 06:08:59 2014	(r272886)
@@ -312,7 +312,8 @@ udp_append(struct inpcb *inp, struct ip 
 	 */
 	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,
 #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 *
 		return (EBUSY);
 	}
 	up->u_tun_func = f;
+	up->u_tun_ctx = ctx;
 	INP_WUNLOCK(inp);
 	return (0);
 }

Modified: head/sys/netinet/udp_var.h
==============================================================================
--- head/sys/netinet/udp_var.h	Fri Oct 10 03:20:12 2014	(r272885)
+++ head/sys/netinet/udp_var.h	Fri Oct 10 06:08:59 2014	(r272886)
@@ -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 */
 

Modified: head/sys/netinet6/udp6_usrreq.c
==============================================================================
--- head/sys/netinet6/udp6_usrreq.c	Fri Oct 10 03:20:12 2014	(r272885)
+++ head/sys/netinet6/udp6_usrreq.c	Fri Oct 10 06:08:59 2014	(r272886)
@@ -150,7 +150,8 @@ udp6_append(struct inpcb *inp, struct mb
 	 */
 	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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410100609.s9A690NU067686>