git: 147f018a720b - main - Move in6_pcbsetport() to in6_pcb.c

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Mon, 18 Oct 2021 17:33:53 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=147f018a720b80da4ba61bec90a6efc6eaa4913e

commit 147f018a720b80da4ba61bec90a6efc6eaa4913e
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2021-10-18 17:11:20 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2021-10-18 17:19:03 +0000

    Move in6_pcbsetport() to in6_pcb.c
    
    This function was originally carved out of in6_pcbbind(), which
    is in in6_pcb.c. This function also uses KPI private to the PCB
    database - in_pcb_lport().
---
 sys/netinet6/in6_pcb.c | 38 ++++++++++++++++++++++++++++++++++++++
 sys/netinet6/in6_src.c | 42 ------------------------------------------
 2 files changed, 38 insertions(+), 42 deletions(-)

diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index 14b95dfe0254..10a29f339773 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -114,6 +114,44 @@ __FBSDID("$FreeBSD$");
 #include <netinet6/in6_fib.h>
 #include <netinet6/scope6_var.h>
 
+int
+in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
+{
+	struct socket *so = inp->inp_socket;
+	u_int16_t lport = 0;
+	int error, lookupflags = 0;
+#ifdef INVARIANTS
+	struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
+#endif
+
+	INP_WLOCK_ASSERT(inp);
+	INP_HASH_WLOCK_ASSERT(pcbinfo);
+
+	error = prison_local_ip6(cred, laddr,
+	    ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0));
+	if (error)
+		return(error);
+
+	/* XXX: this is redundant when called from in6_pcbbind */
+	if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT|SO_REUSEPORT_LB)) == 0)
+		lookupflags = INPLOOKUP_WILDCARD;
+
+	inp->inp_flags |= INP_ANONPORT;
+
+	error = in_pcb_lport(inp, NULL, &lport, cred, lookupflags);
+	if (error != 0)
+		return (error);
+
+	inp->inp_lport = lport;
+	if (in_pcbinshash(inp) != 0) {
+		inp->in6p_laddr = in6addr_any;
+		inp->inp_lport = 0;
+		return (EAGAIN);
+	}
+
+	return (0);
+}
+
 int
 in6_pcbbind(struct inpcb *inp, struct sockaddr *nam,
     struct ucred *cred)
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index 7f623709de13..875e0a63745c 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -926,48 +926,6 @@ in6_selecthlim(struct inpcb *inp, struct ifnet *ifp)
 	return (V_ip6_defhlim);
 }
 
-/*
- * XXX: this is borrowed from in6_pcbbind(). If possible, we should
- * share this function by all *bsd*...
- */
-int
-in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
-{
-	struct socket *so = inp->inp_socket;
-	u_int16_t lport = 0;
-	int error, lookupflags = 0;
-#ifdef INVARIANTS
-	struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
-#endif
-
-	INP_WLOCK_ASSERT(inp);
-	INP_HASH_WLOCK_ASSERT(pcbinfo);
-
-	error = prison_local_ip6(cred, laddr,
-	    ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0));
-	if (error)
-		return(error);
-
-	/* XXX: this is redundant when called from in6_pcbbind */
-	if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT|SO_REUSEPORT_LB)) == 0)
-		lookupflags = INPLOOKUP_WILDCARD;
-
-	inp->inp_flags |= INP_ANONPORT;
-
-	error = in_pcb_lport(inp, NULL, &lport, cred, lookupflags);
-	if (error != 0)
-		return (error);
-
-	inp->inp_lport = lport;
-	if (in_pcbinshash(inp) != 0) {
-		inp->in6p_laddr = in6addr_any;
-		inp->inp_lport = 0;
-		return (EAGAIN);
-	}
-
-	return (0);
-}
-
 void
 addrsel_policy_init(void)
 {