aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2020-01-12 17:52:32 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2020-01-12 17:52:32 +0000
commitfe1274ee395845ade2fc2551afbae1784237daa7 (patch)
tree082d4116e87fc1556a5d500d361e0000b8e29e8a /sys/netinet6
parentc6feea3b8997133f5cc9f10fbcf104729a46b9f0 (diff)
Notes
Diffstat (limited to 'sys/netinet6')
-rw-r--r--sys/netinet6/in6_pcb.c12
-rw-r--r--sys/netinet6/in6_pcb.h2
2 files changed, 10 insertions, 4 deletions
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index b05e39d6b8982..89913ea9189de 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -411,7 +411,7 @@ in6_pcbladdr(struct inpcb *inp, struct sockaddr *nam,
*/
int
in6_pcbconnect_mbuf(struct inpcb *inp, struct sockaddr *nam,
- struct ucred *cred, struct mbuf *m)
+ struct ucred *cred, struct mbuf *m, bool rehash)
{
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
@@ -437,6 +437,8 @@ in6_pcbconnect_mbuf(struct inpcb *inp, struct sockaddr *nam,
}
if (IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr)) {
if (inp->inp_lport == 0) {
+ KASSERT(rehash == true,
+ ("Rehashing required for unbound inps"));
error = in6_pcbbind(inp, (struct sockaddr *)0, cred);
if (error)
return (error);
@@ -451,7 +453,11 @@ in6_pcbconnect_mbuf(struct inpcb *inp, struct sockaddr *nam,
inp->inp_flow |=
(htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK);
- in_pcbrehash_mbuf(inp, m);
+ if (rehash) {
+ in_pcbrehash_mbuf(inp, m);
+ } else {
+ in_pcbinshash_mbuf(inp, m);
+ }
return (0);
}
@@ -460,7 +466,7 @@ int
in6_pcbconnect(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
{
- return (in6_pcbconnect_mbuf(inp, nam, cred, NULL));
+ return (in6_pcbconnect_mbuf(inp, nam, cred, NULL, true));
}
void
diff --git a/sys/netinet6/in6_pcb.h b/sys/netinet6/in6_pcb.h
index 56ea6eebc77ec..e01d6f751f790 100644
--- a/sys/netinet6/in6_pcb.h
+++ b/sys/netinet6/in6_pcb.h
@@ -86,7 +86,7 @@ void in6_losing(struct inpcb *);
int in6_pcbbind(struct inpcb *, struct sockaddr *, struct ucred *);
int in6_pcbconnect(struct inpcb *, struct sockaddr *, struct ucred *);
int in6_pcbconnect_mbuf(struct inpcb *, struct sockaddr *,
- struct ucred *, struct mbuf *);
+ struct ucred *, struct mbuf *, bool);
void in6_pcbdisconnect(struct inpcb *);
struct inpcb *
in6_pcblookup_local(struct inpcbinfo *,