summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorozaki-r <ozaki-r@NetBSD.org>2022-10-28 05:18:39 +0000
committerozaki-r <ozaki-r@NetBSD.org>2022-10-28 05:18:39 +0000
commit140683a5e6f35842e5eed3c33780e49d9bf8a812 (patch)
tree77357d085f843e7308803167c41f06f5e704fbd6 /sys
parent175db7a8c8851b70e4b3cb1f7ffbaaf3c82e42a7 (diff)
inpcb: integrate data structures of PCB into one
Data structures of network protocol control blocks (PCBs), i.e., struct inpcb, in6pcb and inpcb_hdr, are not organized well. Users of the data structures have to handle them separately and thus the code is cluttered and duplicated. The commit integrates the data structures into one, struct inpcb. As a result, users of PCBs only have to handle just one data structure, so the code becomes simple. One drawback is that the data size of PCB for IPv4 increases by 40 bytes (from 248 bytes to 288 bytes).
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet/in_pcb.c112
-rw-r--r--sys/netinet/in_pcb.h198
-rw-r--r--sys/netinet/ip_output.c7
-rw-r--r--sys/netinet/portalgo.c158
-rw-r--r--sys/netinet/portalgo.h8
-rw-r--r--sys/netinet/raw_ip.c13
-rw-r--r--sys/netinet/tcp_input.c119
-rw-r--r--sys/netinet/tcp_output.c134
-rw-r--r--sys/netinet/tcp_subr.c325
-rw-r--r--sys/netinet/tcp_syncache.c95
-rw-r--r--sys/netinet/tcp_timer.c51
-rw-r--r--sys/netinet/tcp_usrreq.c419
-rw-r--r--sys/netinet/tcp_var.h20
-rw-r--r--sys/netinet/tcp_vtw.c34
-rw-r--r--sys/netinet/udp_usrreq.c8
-rw-r--r--sys/netinet6/icmp6.c55
-rw-r--r--sys/netinet6/in6_pcb.c566
-rw-r--r--sys/netinet6/in6_pcb.h141
-rw-r--r--sys/netinet6/in6_src.c40
-rw-r--r--sys/netinet6/ip6_input.c28
-rw-r--r--sys/netinet6/ip6_output.c121
-rw-r--r--sys/netinet6/ip6_var.h12
-rw-r--r--sys/netinet6/raw_ip6.c150
-rw-r--r--sys/netinet6/udp6_usrreq.c212
-rw-r--r--sys/netinet6/udp6_var.h4
-rw-r--r--sys/netipsec/ipsec.c137
-rw-r--r--sys/netipsec/ipsec.h17
-rw-r--r--sys/netipsec/ipsec6.h6
28 files changed, 1247 insertions, 1943 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 20e140630a1..72163d6c959 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.c,v 1.191 2022/10/14 19:39:32 ryo Exp $ */
+/* $NetBSD: in_pcb.c,v 1.192 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.191 2022/10/14 19:39:32 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.192 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -192,13 +192,13 @@ in_pcballoc(struct socket *so, void *v)
struct inpcb *inp;
int s;
- KASSERT(so->so_proto->pr_domain->dom_family == AF_INET);
+ KASSERT(soaf(so) == AF_INET || soaf(so) == AF_INET6);
inp = pool_get(&inpcb_pool, PR_NOWAIT);
if (inp == NULL)
return (ENOBUFS);
memset(inp, 0, sizeof(*inp));
- inp->inp_af = AF_INET;
+ inp->inp_af = soaf(so);
inp->inp_table = table;
inp->inp_socket = so;
inp->inp_errormtu = -1;
@@ -207,6 +207,12 @@ in_pcballoc(struct socket *so, void *v)
inp->inp_prefsrcip.s_addr = INADDR_ANY;
inp->inp_overudp_cb = NULL;
inp->inp_overudp_arg = NULL;
+#ifdef INET6
+ inp->inp_hops6 = -1; /* use kernel default */
+ inp->inp_icmp6filt = NULL;
+ if (inp->inp_af == AF_INET6 && ip6_v6only)
+ inp->inp_flags |= IN6P_IPV6_V6ONLY;
+#endif
#if defined(IPSEC)
if (ipsec_enabled) {
int error = ipsec_init_pcbpolicy(so, &inp->inp_sp);
@@ -214,14 +220,14 @@ in_pcballoc(struct socket *so, void *v)
pool_put(&inpcb_pool, inp);
return error;
}
- inp->inp_sp->sp_inph = (struct inpcb_hdr *)inp;
+ inp->inp_sp->sp_inp = inp;
}
#endif
so->so_pcb = inp;
s = splsoftnet();
- TAILQ_INSERT_HEAD(&table->inpt_queue, &inp->inp_head, inph_queue);
- LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), &inp->inp_head,
- inph_lhash);
+ TAILQ_INSERT_HEAD(&table->inpt_queue, inp, inp_queue);
+ LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), inp,
+ inp_lhash);
in_pcbstate(inp, INP_ATTACHED);
splx(s);
return (0);
@@ -260,7 +266,7 @@ in_pcbsetport(struct sockaddr_in *sin, struct inpcb *inp, kauth_cred_t cred)
/*
* Use RFC6056 randomized port selection
*/
- error = portalgo_randport(&lport, &inp->inp_head, cred);
+ error = portalgo_randport(&lport, inp, cred);
if (error)
return error;
@@ -351,7 +357,7 @@ in_pcbbind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
struct inpcb *t;
vestigial_inpcb_t vestige;
#ifdef INET6
- struct in6pcb *t6;
+ struct inpcb *t6;
struct in6_addr mapped;
#endif
enum kauth_network_req req;
@@ -374,7 +380,7 @@ in_pcbbind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
#ifdef INET6
in6_in_2_v4mapin6(&sin->sin_addr, &mapped);
t6 = in6_pcblookup_port(table, &mapped, sin->sin_port, wild, &vestige);
- if (t6 && (reuseport & t6->in6p_socket->so_options) == 0)
+ if (t6 && (reuseport & t6->inp_socket->so_options) == 0)
return (EADDRINUSE);
if (!t6 && vestige.valid) {
if (!!reuseport != !!vestige.reuse_port) {
@@ -419,9 +425,9 @@ in_pcbbind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
in_pcbstate(inp, INP_BOUND);
}
- LIST_REMOVE(&inp->inp_head, inph_lhash);
- LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), &inp->inp_head,
- inph_lhash);
+ LIST_REMOVE(inp, inp_lhash);
+ LIST_INSERT_HEAD(INPCBHASH_PORT(table, inp->inp_lport), inp,
+ inp_lhash);
return (0);
}
@@ -628,8 +634,7 @@ in_pcbdetach(void *v)
struct socket *so = inp->inp_socket;
int s;
- if (inp->inp_af != AF_INET)
- return;
+ KASSERT(inp->inp_af == AF_INET || inp->inp_af == AF_INET6);
#if defined(IPSEC)
if (ipsec_enabled)
@@ -639,14 +644,19 @@ in_pcbdetach(void *v)
s = splsoftnet();
in_pcbstate(inp, INP_ATTACHED);
- LIST_REMOVE(&inp->inp_head, inph_lhash);
- TAILQ_REMOVE(&inp->inp_table->inpt_queue, &inp->inp_head, inph_queue);
+ LIST_REMOVE(inp, inp_lhash);
+ TAILQ_REMOVE(&inp->inp_table->inpt_queue, inp, inp_queue);
splx(s);
if (inp->inp_options) {
m_free(inp->inp_options);
}
+ if (inp->inp_outputopts6 != NULL) {
+ ip6_clearpktopts(inp->inp_outputopts6, -1);
+ free(inp->inp_outputopts6, M_IP6OPT);
+ }
rtcache_free(&inp->inp_route);
+ ip6_freemoptions(inp->inp_moptions6);
ip_freemoptions(inp->inp_moptions);
sofree(so); /* drops the socket's lock */
@@ -691,7 +701,6 @@ in_pcbnotify(struct inpcbtable *table, struct in_addr faddr, u_int fport_arg,
void (*notify)(struct inpcb *, int))
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
struct inpcb *inp;
u_int16_t fport = fport_arg, lport = lport_arg;
int nmatch;
@@ -701,8 +710,7 @@ in_pcbnotify(struct inpcbtable *table, struct in_addr faddr, u_int fport_arg,
nmatch = 0;
head = INPCBHASH_CONNECT(table, faddr, fport, laddr, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- inp = (struct inpcb *)inph;
+ LIST_FOREACH(inp, head, inp_hash) {
if (inp->inp_af != AF_INET)
continue;
@@ -721,13 +729,12 @@ void
in_pcbnotifyall(struct inpcbtable *table, struct in_addr faddr, int errno,
void (*notify)(struct inpcb *, int))
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
if (in_nullhost(faddr) || notify == 0)
return;
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct inpcb *inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
if (inp->inp_af != AF_INET)
continue;
if (in_hosteq(inp->inp_faddr, faddr))
@@ -770,10 +777,9 @@ in_purgeifmcast(struct ip_moptions *imo, struct ifnet *ifp)
void
in_pcbpurgeif0(struct inpcbtable *table, struct ifnet *ifp)
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct inpcb *inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
bool need_unlock = false;
if (inp->inp_af != AF_INET)
@@ -796,10 +802,9 @@ void
in_pcbpurgeif(struct inpcbtable *table, struct ifnet *ifp)
{
struct rtentry *rt;
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct inpcb *inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
if (inp->inp_af != AF_INET)
continue;
if ((rt = rtcache_validate(&inp->inp_route)) != NULL &&
@@ -875,7 +880,7 @@ in_pcblookup_port(struct inpcbtable *table, struct in_addr laddr,
u_int lport_arg, int lookup_wildcard, vestigial_inpcb_t *vp)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
struct inpcb *match = NULL;
int matchwild = 3;
int wildcard;
@@ -885,9 +890,7 @@ in_pcblookup_port(struct inpcbtable *table, struct in_addr laddr,
vp->valid = 0;
head = INPCBHASH_PORT(table, lport);
- LIST_FOREACH(inph, head, inph_lhash) {
- struct inpcb * const inp = (struct inpcb *)inph;
-
+ LIST_FOREACH(inp, head, inp_lhash) {
if (inp->inp_af != AF_INET)
continue;
if (inp->inp_lport != lport)
@@ -988,7 +991,6 @@ in_pcblookup_connect(struct inpcbtable *table,
vestigial_inpcb_t *vp)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
struct inpcb *inp;
u_int16_t fport = fport_arg, lport = lport_arg;
@@ -996,8 +998,7 @@ in_pcblookup_connect(struct inpcbtable *table,
vp->valid = 0;
head = INPCBHASH_CONNECT(table, faddr, fport, laddr, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- inp = (struct inpcb *)inph;
+ LIST_FOREACH(inp, head, inp_hash) {
if (inp->inp_af != AF_INET)
continue;
@@ -1024,10 +1025,9 @@ in_pcblookup_connect(struct inpcbtable *table,
out:
/* Move this PCB to the head of hash chain. */
- inph = &inp->inp_head;
- if (inph != LIST_FIRST(head)) {
- LIST_REMOVE(inph, inph_hash);
- LIST_INSERT_HEAD(head, inph, inph_hash);
+ if (inp != LIST_FIRST(head)) {
+ LIST_REMOVE(inp, inp_hash);
+ LIST_INSERT_HEAD(head, inp, inp_hash);
}
return (inp);
}
@@ -1037,13 +1037,11 @@ in_pcblookup_bind(struct inpcbtable *table,
struct in_addr laddr, u_int lport_arg)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
struct inpcb *inp;
u_int16_t lport = lport_arg;
head = INPCBHASH_BIND(table, laddr, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- inp = (struct inpcb *)inph;
+ LIST_FOREACH(inp, head, inp_hash) {
if (inp->inp_af != AF_INET)
continue;
@@ -1052,8 +1050,7 @@ in_pcblookup_bind(struct inpcbtable *table,
goto out;
}
head = INPCBHASH_BIND(table, zeroin_addr, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- inp = (struct inpcb *)inph;
+ LIST_FOREACH(inp, head, inp_hash) {
if (inp->inp_af != AF_INET)
continue;
@@ -1071,10 +1068,9 @@ in_pcblookup_bind(struct inpcbtable *table,
out:
/* Move this PCB to the head of hash chain. */
- inph = &inp->inp_head;
- if (inph != LIST_FIRST(head)) {
- LIST_REMOVE(inph, inph_hash);
- LIST_INSERT_HEAD(head, inph, inph_hash);
+ if (inp != LIST_FIRST(head)) {
+ LIST_REMOVE(inp, inp_hash);
+ LIST_INSERT_HEAD(head, inp, inp_hash);
}
return (inp);
}
@@ -1083,23 +1079,25 @@ void
in_pcbstate(struct inpcb *inp, int state)
{
- if (inp->inp_af != AF_INET)
+ if (inp->inp_af == AF_INET6) {
+ in6_pcbstate(inp, state);
return;
+ }
if (inp->inp_state > INP_ATTACHED)
- LIST_REMOVE(&inp->inp_head, inph_hash);
+ LIST_REMOVE(inp, inp_hash);
switch (state) {
case INP_BOUND:
LIST_INSERT_HEAD(INPCBHASH_BIND(inp->inp_table,
- inp->inp_laddr, inp->inp_lport), &inp->inp_head,
- inph_hash);
+ inp->inp_laddr, inp->inp_lport), inp,
+ inp_hash);
break;
case INP_CONNECTED:
LIST_INSERT_HEAD(INPCBHASH_CONNECT(inp->inp_table,
inp->inp_faddr, inp->inp_fport,
- inp->inp_laddr, inp->inp_lport), &inp->inp_head,
- inph_hash);
+ inp->inp_laddr, inp->inp_lport), inp,
+ inp_hash);
break;
}
@@ -1115,6 +1113,8 @@ in_pcbrtentry(struct inpcb *inp)
struct sockaddr_in dst4;
} u;
+ if (inp->inp_af == AF_INET6)
+ return in6_pcbrtentry(inp);
if (inp->inp_af != AF_INET)
return (NULL);
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 37aa382ad76..642eb8108e1 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.h,v 1.70 2022/06/10 09:54:54 knakahara Exp $ */
+/* $NetBSD: in_pcb.h,v 1.71 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -70,9 +70,14 @@
#include <netinet/in.h>
#include <netinet/in_pcb_hdr.h>
#include <netinet/ip.h>
+#include <netinet/ip6.h>
+
+typedef int (*pcb_overudp_cb_t)(struct mbuf **, int, struct socket *,
+ struct sockaddr *, void *);
struct ip_moptions;
struct mbuf;
+struct icmp6_filter;
/*
* Common structure pcb for internet protocol implementation.
@@ -81,33 +86,63 @@ struct mbuf;
* up (to a socket structure) and down (to a protocol-specific)
* control block.
*/
+
struct inpcb {
- struct inpcb_hdr inp_head;
-#define inp_queue inp_head.inph_queue
-#define inp_af inp_head.inph_af
-#define inp_ppcb inp_head.inph_ppcb
-#define inp_state inp_head.inph_state
-#define inp_portalgo inp_head.inph_portalgo
-#define inp_socket inp_head.inph_socket
-#define inp_table inp_head.inph_table
-#define inp_sp inp_head.inph_sp
- struct route inp_route; /* placeholder for routing entry */
- u_int16_t inp_fport; /* foreign port */
- u_int16_t inp_lport; /* local port */
- int inp_flags; /* generic IP/datagram flags */
- struct ip inp_ip; /* header prototype; should have more */
- struct mbuf *inp_options; /* IP options */
- struct ip_moptions *inp_moptions; /* IP multicast options */
- int inp_errormtu; /* MTU of last xmit status = EMSGSIZE */
- uint8_t inp_ip_minttl;
- bool inp_bindportonsend;
- struct in_addr inp_prefsrcip; /* preferred src IP when wild */
- pcb_overudp_cb_t inp_overudp_cb;
- void *inp_overudp_arg;
+ LIST_ENTRY(inpcb) inp_hash;
+ LIST_ENTRY(inpcb) inp_lhash;
+ TAILQ_ENTRY(inpcb) inp_queue;
+ int inp_af; /* address family - AF_INET or AF_INET6 */
+ void * inp_ppcb; /* pointer to per-protocol pcb */
+ int inp_state; /* bind/connect state */
+#define INP_ATTACHED 0
+#define INP_BOUND 1
+#define INP_CONNECTED 2
+ int inp_portalgo;
+ struct socket *inp_socket; /* back pointer to socket */
+ struct inpcbtable *inp_table;
+ struct inpcbpolicy *inp_sp; /* security policy */
+ struct route inp_route; /* placeholder for routing entry */
+ u_int16_t inp_fport; /* foreign port */
+ u_int16_t inp_lport; /* local port */
+ int inp_flags; /* generic IP/datagram flags */
+ union { /* header prototype. */
+ struct ip inp_ip;
+ struct ip6_hdr inp_ip6;
+ };
+#define inp_flowinfo inp_ip6.ip6_flow
+ struct mbuf *inp_options; /* IP options */
+ bool inp_bindportonsend;
+
+ /* We still need both for IPv6 due to v4-mapped addresses */
+ struct ip_moptions *inp_moptions; /* IPv4 multicast options */
+ struct ip6_moptions *inp_moptions6; /* IPv6 multicast options */
+
+ union {
+ /* IPv4 only stuffs */
+ struct {
+ int inp_errormtu; /* MTU of last xmit status = EMSGSIZE */
+ uint8_t inp_ip_minttl;
+ struct in_addr inp_prefsrcip; /* preferred src IP when wild */
+ };
+ /* IPv6 only stuffs */
+ struct {
+ int inp_hops6; /* default IPv6 hop limit */
+ int inp_cksum6; /* IPV6_CHECKSUM setsockopt */
+ struct icmp6_filter *inp_icmp6filt;
+ struct ip6_pktopts *inp_outputopts6; /* IP6 options for outgoing packets */
+ };
+ };
+
+ pcb_overudp_cb_t inp_overudp_cb;
+ void *inp_overudp_arg;
};
#define inp_faddr inp_ip.ip_dst
#define inp_laddr inp_ip.ip_src
+#define inp_faddr6 inp_ip6.ip6_dst
+#define inp_laddr6 inp_ip6.ip6_src
+
+LIST_HEAD(inpcbhead, inpcb);
/* flags in inp_flags: */
#define INP_RECVOPTS 0x0001 /* receive incoming IP options */
@@ -134,17 +169,69 @@ struct inpcb {
#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR|\
INP_RECVIF|INP_RECVTTL|INP_RECVPKTINFO)
+/*
+ * Flags for IPv6 in inp_flags
+ * We define KAME's original flags in higher 16 bits as much as possible
+ * for compatibility with *bsd*s.
+ */
+#define IN6P_RECVOPTS 0x00001000 /* receive incoming IP6 options */
+#define IN6P_RECVRETOPTS 0x00002000 /* receive IP6 options for reply */
+#define IN6P_RECVDSTADDR 0x00004000 /* receive IP6 dst address */
+#define IN6P_IPV6_V6ONLY 0x00008000 /* restrict AF_INET6 socket for v6 */
+#define IN6P_PKTINFO 0x00010000 /* receive IP6 dst and I/F */
+#define IN6P_HOPLIMIT 0x00020000 /* receive hoplimit */
+#define IN6P_HOPOPTS 0x00040000 /* receive hop-by-hop options */
+#define IN6P_DSTOPTS 0x00080000 /* receive dst options after rthdr */
+#define IN6P_RTHDR 0x00100000 /* receive routing header */
+#define IN6P_RTHDRDSTOPTS 0x00200000 /* receive dstoptions before rthdr */
+#define IN6P_TCLASS 0x00400000 /* traffic class */
+#define IN6P_BINDANY 0x00800000 /* allow bind to any address */
+#define IN6P_HIGHPORT 0x01000000 /* user wants "high" port binding */
+#define IN6P_LOWPORT 0x02000000 /* user wants "low" port binding */
+#define IN6P_ANONPORT 0x04000000 /* port chosen for user */
+#define IN6P_FAITH 0x08000000 /* accept FAITH'ed connections */
+/* XXX should move to an UDP control block */
+#define IN6P_ESPINUDP INP_ESPINUDP /* ESP over UDP for NAT-T */
+
+#define IN6P_RFC2292 0x40000000 /* RFC2292 */
+#define IN6P_MTU 0x80000000 /* use minimum MTU */
+
+#define IN6P_CONTROLOPTS (IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\
+ IN6P_DSTOPTS|IN6P_RTHDR|IN6P_RTHDRDSTOPTS|\
+ IN6P_TCLASS|IN6P_RFC2292|\
+ IN6P_MTU)
+
#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb)
+#define soaf(so) (so->so_proto->pr_domain->dom_family)
#define inp_lock(inp) solock((inp)->inp_socket)
#define inp_unlock(inp) sounlock((inp)->inp_socket)
#define inp_locked(inp) solocked((inp)->inp_socket)
+TAILQ_HEAD(inpcbqueue, inpcb);
+
+struct vestigial_hooks;
+
+/* It's still referenced by kvm users */
+struct inpcbtable {
+ struct inpcbqueue inpt_queue;
+ struct inpcbhead *inpt_porthashtbl;
+ struct inpcbhead *inpt_bindhashtbl;
+ struct inpcbhead *inpt_connecthashtbl;
+ u_long inpt_porthash;
+ u_long inpt_bindhash;
+ u_long inpt_connecthash;
+ u_int16_t inpt_lastport;
+ u_int16_t inpt_lastlow;
+
+ struct vestigial_hooks *vestige;
+};
+#define inpt_lasthi inpt_lastport
+
#ifdef _KERNEL
#include <sys/kauth.h>
#include <sys/queue.h>
-struct inpcbtable;
struct lwp;
struct rtentry;
struct sockaddr_in;
@@ -185,6 +272,38 @@ struct rtentry *
in_pcbrtentry(struct inpcb *);
void in_pcbrtentry_unref(struct rtentry *, struct inpcb *);
+void in6_pcbinit(struct inpcbtable *, int, int);
+int in6_pcbbind(void *, struct sockaddr_in6 *, struct lwp *);
+int in6_pcbconnect(void *, struct sockaddr_in6 *, struct lwp *);
+void in6_pcbdetach(struct inpcb *);
+void in6_pcbdisconnect(struct inpcb *);
+struct inpcb *in6_pcblookup_port(struct inpcbtable *, struct in6_addr *,
+ u_int, int, struct vestigial_inpcb *);
+int in6_pcbnotify(struct inpcbtable *, const struct sockaddr *,
+ u_int, const struct sockaddr *, u_int, int, void *,
+ void (*)(struct inpcb *, int));
+void in6_pcbpurgeif0(struct inpcbtable *, struct ifnet *);
+void in6_pcbpurgeif(struct inpcbtable *, struct ifnet *);
+void in6_pcbstate(struct inpcb *, int);
+void in6_rtchange(struct inpcb *, int);
+void in6_setpeeraddr(struct inpcb *, struct sockaddr_in6 *);
+void in6_setsockaddr(struct inpcb *, struct sockaddr_in6 *);
+
+/* in in6_src.c */
+int in6_selecthlim(struct inpcb *, struct ifnet *);
+int in6_selecthlim_rt(struct inpcb *);
+int in6_pcbsetport(struct sockaddr_in6 *, struct inpcb *, struct lwp *);
+
+extern struct rtentry *
+ in6_pcbrtentry(struct inpcb *);
+extern void
+ in6_pcbrtentry_unref(struct rtentry *, struct inpcb *);
+extern struct inpcb *in6_pcblookup_connect(struct inpcbtable *,
+ const struct in6_addr *, u_int, const struct in6_addr *, u_int, int,
+ struct vestigial_inpcb *);
+extern struct inpcb *in6_pcblookup_bind(struct inpcbtable *,
+ const struct in6_addr *, u_int, int);
+
static inline void
in_pcb_register_overudp_cb(struct inpcb *inp, pcb_overudp_cb_t cb, void *arg)
{
@@ -193,6 +312,37 @@ in_pcb_register_overudp_cb(struct inpcb *inp, pcb_overudp_cb_t cb, void *arg)
inp->inp_overudp_arg = arg;
}
+/* compute hash value for foreign and local in6_addr and port */
+#define IN6_HASH(faddr, fport, laddr, lport) \
+ (((faddr)->s6_addr32[0] ^ (faddr)->s6_addr32[1] ^ \
+ (faddr)->s6_addr32[2] ^ (faddr)->s6_addr32[3] ^ \
+ (laddr)->s6_addr32[0] ^ (laddr)->s6_addr32[1] ^ \
+ (laddr)->s6_addr32[2] ^ (laddr)->s6_addr32[3]) \
+ + (fport) + (lport))
+
+// from in_pcb_hdr.h
+struct vestigial_inpcb;
+struct in6_addr;
+
+/* Hooks for vestigial pcb entries.
+ * If vestigial entries exist for a table (TCP only)
+ * the vestigial pointer is set.
+ */
+typedef struct vestigial_hooks {
+ /* IPv4 hooks */
+ void *(*init_ports4)(struct in_addr, u_int, int);
+ int (*next_port4)(void *, struct vestigial_inpcb *);
+ int (*lookup4)(struct in_addr, uint16_t,
+ struct in_addr, uint16_t,
+ struct vestigial_inpcb *);
+ /* IPv6 hooks */
+ void *(*init_ports6)(const struct in6_addr*, u_int, int);
+ int (*next_port6)(void *, struct vestigial_inpcb *);
+ int (*lookup6)(const struct in6_addr *, uint16_t,
+ const struct in6_addr *, uint16_t,
+ struct vestigial_inpcb *);
+} vestigial_hooks_t;
+
#endif /* _KERNEL */
#endif /* !_NETINET_IN_PCB_H_ */
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 0e5d5628e82..d2602bce733 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_output.c,v 1.320 2020/09/08 14:12:57 christos Exp $ */
+/* $NetBSD: ip_output.c,v 1.321 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.320 2020/09/08 14:12:57 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.321 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1256,8 +1256,7 @@ ip_ctloutput(int op, struct socket *so, struct sockopt *sopt)
if (error)
break;
- error = portalgo_algo_index_select(
- (struct inpcb_hdr *)inp, optval);
+ error = portalgo_algo_index_select(inp, optval);
break;
#if defined(IPSEC)
diff --git a/sys/netinet/portalgo.c b/sys/netinet/portalgo.c
index 163f23904c5..7ecb2c54f9d 100644
--- a/sys/netinet/portalgo.c
+++ b/sys/netinet/portalgo.c
@@ -1,4 +1,4 @@
-/* $NetBSD: portalgo.c,v 1.11 2017/01/11 13:08:29 ozaki-r Exp $ */
+/* $NetBSD: portalgo.c,v 1.12 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright 2011 Vlad Balan
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: portalgo.c,v 1.11 2017/01/11 13:08:29 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: portalgo.c,v 1.12 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -105,15 +105,15 @@ static bitmap inet6_reserve;
typedef struct {
const char *name;
- int (*func)(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
+ int (*func)(int, uint16_t *, struct inpcb *, kauth_cred_t);
} portalgo_algorithm_t;
-static int algo_bsd(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
-static int algo_random_start(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
-static int algo_random_pick(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
-static int algo_hash(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
-static int algo_doublehash(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
-static int algo_randinc(int, uint16_t *, struct inpcb_hdr *, kauth_cred_t);
+static int algo_bsd(int, uint16_t *, struct inpcb *, kauth_cred_t);
+static int algo_random_start(int, uint16_t *, struct inpcb *, kauth_cred_t);
+static int algo_random_pick(int, uint16_t *, struct inpcb *, kauth_cred_t);
+static int algo_hash(int, uint16_t *, struct inpcb *, kauth_cred_t);
+static int algo_doublehash(int, uint16_t *, struct inpcb *, kauth_cred_t);
+static int algo_randinc(int, uint16_t *, struct inpcb *, kauth_cred_t);
static const portalgo_algorithm_t algos[] = {
{
@@ -151,16 +151,16 @@ static uint16_t portalgo_next_ephemeral[NPROTO][NAF][NRANGES][NALGOS];
* the port range.
*/
static int
-pcb_getports(struct inpcb_hdr *inp_hdr, uint16_t *lastport,
+pcb_getports(struct inpcb *inp, uint16_t *lastport,
uint16_t *mymin, uint16_t *mymax, uint16_t **pnext_ephemeral, int algo)
{
- struct inpcbtable * const table = inp_hdr->inph_table;
+ struct inpcbtable * const table = inp->inp_table;
struct socket *so;
int portalgo_proto;
int portalgo_af;
int portalgo_range;
- so = inp_hdr->inph_socket;
+ so = inp->inp_socket;
switch (so->so_type) {
case SOCK_DGRAM: /* UDP or DCCP */
case SOCK_CONN_DGRAM:
@@ -173,11 +173,9 @@ pcb_getports(struct inpcb_hdr *inp_hdr, uint16_t *lastport,
return EPFNOSUPPORT;
}
- switch (inp_hdr->inph_af) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET: {
- struct inpcb *inp = (struct inpcb *)(void *)inp_hdr;
-
portalgo_af = PORTALGO_IPV4;
if (inp->inp_flags & INP_LOWPORT) {
*mymin = lowportmin;
@@ -195,10 +193,8 @@ pcb_getports(struct inpcb_hdr *inp_hdr, uint16_t *lastport,
#endif
#ifdef INET6
case AF_INET6: {
- struct in6pcb *in6p = (struct in6pcb *)(void *)inp_hdr;
-
portalgo_af = PORTALGO_IPV6;
- if (in6p->in6p_flags & IN6P_LOWPORT) {
+ if (inp->inp_flags & IN6P_LOWPORT) {
*mymin = ip6_lowportmin;
*mymax = ip6_lowportmax;
*lastport = table->inpt_lastlow;
@@ -241,9 +237,9 @@ pcb_getports(struct inpcb_hdr *inp_hdr, uint16_t *lastport,
* shamelessly copied from in_pcb.c.
*/
static bool
-check_suitable_port(uint16_t port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
+check_suitable_port(uint16_t port, struct inpcb *inp, kauth_cred_t cred)
{
- struct inpcbtable * const table = inp_hdr->inph_table;
+ struct inpcbtable * const table = inp->inp_table;
#ifdef INET
vestigial_inpcb_t vestigial;
#endif
@@ -255,10 +251,9 @@ check_suitable_port(uint16_t port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
DPRINTF("%s called for argument %d\n", __func__, port);
- switch (inp_hdr->inph_af) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET: { /* IPv4 */
- struct inpcb *inp = (struct inpcb *)(void *)inp_hdr;
struct inpcb *pcb;
struct sockaddr_in sin;
@@ -303,15 +298,14 @@ check_suitable_port(uint16_t port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
#endif
#ifdef INET6
case AF_INET6: { /* IPv6 */
- struct in6pcb *in6p = (struct in6pcb *)(void *)inp_hdr;
struct sockaddr_in6 sin6;
void *t;
if (__BITMAP_ISSET(port, &inet6_reserve))
return false;
- sin6.sin6_addr = in6p->in6p_laddr;
- so = in6p->in6p_socket;
+ sin6.sin6_addr = inp->inp_laddr6;
+ so = inp->inp_socket;
/* XXX: this is redundant when called from in6_pcbbind */
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 &&
@@ -344,7 +338,7 @@ check_suitable_port(uint16_t port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
enum kauth_network_req req;
/* We have a free port. Check with the secmodel. */
- if (in6p->in6p_flags & IN6P_LOWPORT) {
+ if (inp->inp_flags & IN6P_LOWPORT) {
#ifndef IPNOPRIVPORTS
req = KAUTH_REQ_NETWORK_BIND_PRIVPORT;
#else
@@ -377,7 +371,7 @@ check_suitable_port(uint16_t port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
/* This is the default BSD algorithm, as described in RFC 6056 */
static int
-algo_bsd(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
+algo_bsd(int algo, uint16_t *port, struct inpcb *inp, kauth_cred_t cred)
{
uint16_t count;
uint16_t mymin, mymax, lastport;
@@ -385,7 +379,7 @@ algo_bsd(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
int error;
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
@@ -396,7 +390,7 @@ algo_bsd(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
if (myport < mymin || mymax < myport)
myport = mymax;
*next_ephemeral = myport - 1;
- if (check_suitable_port(myport, inp_hdr, cred)) {
+ if (check_suitable_port(myport, inp, cred)) {
*port = myport;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -413,7 +407,7 @@ algo_bsd(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
* by a random amount.
*/
static int
-algo_random_start(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
+algo_random_start(int algo, uint16_t *port, struct inpcb *inp,
kauth_cred_t cred)
{
uint16_t count, num_ephemeral;
@@ -423,7 +417,7 @@ algo_random_start(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
@@ -439,7 +433,7 @@ algo_random_start(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
count = num_ephemeral;
do {
- if (check_suitable_port(*next_ephemeral, inp_hdr, cred)) {
+ if (check_suitable_port(*next_ephemeral, inp, cred)) {
*port = *next_ephemeral;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -467,7 +461,7 @@ algo_random_start(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
* give up before exhausting the free ports.
*/
static int
-algo_random_pick(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
+algo_random_pick(int algo, uint16_t *port, struct inpcb *inp,
kauth_cred_t cred)
{
uint16_t count, num_ephemeral;
@@ -477,7 +471,7 @@ algo_random_pick(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
@@ -492,7 +486,7 @@ algo_random_pick(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
count = num_ephemeral;
do {
- if (check_suitable_port(*next_ephemeral, inp_hdr, cred)) {
+ if (check_suitable_port(*next_ephemeral, inp, cred)) {
*port = *next_ephemeral;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -513,7 +507,7 @@ algo_random_pick(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
/* This is the implementation from FreeBSD, with tweaks */
static uint16_t
-Fhash(const struct inpcb_hdr *inp_hdr)
+Fhash(const struct inpcb *inp)
{
MD5_CTX f_ctx;
uint32_t Ff[4];
@@ -524,11 +518,9 @@ Fhash(const struct inpcb_hdr *inp_hdr)
cprng_fast(secret_f, sizeof(secret_f));
MD5Init(&f_ctx);
- switch (inp_hdr->inph_af) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET: {
- const struct inpcb *inp =
- (const struct inpcb *)(const void *)inp_hdr;
MD5Update(&f_ctx, (const u_char *)&inp->inp_laddr,
sizeof(inp->inp_laddr));
MD5Update(&f_ctx, (const u_char *)&inp->inp_faddr,
@@ -540,14 +532,12 @@ Fhash(const struct inpcb_hdr *inp_hdr)
#endif
#ifdef INET6
case AF_INET6: {
- const struct in6pcb *in6p =
- (const struct in6pcb *)(const void *)inp_hdr;
- MD5Update(&f_ctx, (const u_char *)&in6p->in6p_laddr,
- sizeof(in6p->in6p_laddr));
- MD5Update(&f_ctx, (const u_char *)&in6p->in6p_faddr,
- sizeof(in6p->in6p_faddr));
- MD5Update(&f_ctx, (const u_char *)&in6p->in6p_fport,
- sizeof(in6p->in6p_fport));
+ MD5Update(&f_ctx, (const u_char *)&inp->inp_laddr6,
+ sizeof(inp->inp_laddr6));
+ MD5Update(&f_ctx, (const u_char *)&inp->inp_faddr6,
+ sizeof(inp->inp_faddr6));
+ MD5Update(&f_ctx, (const u_char *)&inp->inp_fport,
+ sizeof(inp->inp_fport));
break;
}
#endif
@@ -569,16 +559,12 @@ Fhash(const struct inpcb_hdr *inp_hdr)
* late binding.
*/
static bool
-iscompletetuple(struct inpcb_hdr *inp_hdr)
+iscompletetuple(struct inpcb *inp)
{
-#ifdef INET6
- struct in6pcb *in6p;
-#endif
- switch (inp_hdr->inph_af) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET: {
- struct inpcb *inp = (struct inpcb *)(void *)inp_hdr;
if (inp->inp_fport == 0 || in_nullhost(inp->inp_faddr)) {
DPRINTF("%s fport or faddr missing, delaying port "
"to connect/send\n", __func__);
@@ -592,15 +578,14 @@ iscompletetuple(struct inpcb_hdr *inp_hdr)
#endif
#ifdef INET6
case AF_INET6: {
- in6p = (struct in6pcb *)(void *)inp_hdr;
- if (in6p->in6p_fport == 0 || memcmp(&in6p->in6p_faddr,
- &in6addr_any, sizeof(in6p->in6p_faddr)) == 0) {
+ if (inp->inp_fport == 0 || memcmp(&inp->inp_faddr6,
+ &in6addr_any, sizeof(inp->inp_faddr6)) == 0) {
DPRINTF("%s fport or faddr missing, delaying port "
"to connect/send\n", __func__);
- in6p->in6p_bindportonsend = true;
+ inp->inp_bindportonsend = true;
return false;
} else {
- in6p->in6p_bindportonsend = false;
+ inp->inp_bindportonsend = false;
}
break;
}
@@ -614,7 +599,7 @@ iscompletetuple(struct inpcb_hdr *inp_hdr)
}
static int
-algo_hash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
+algo_hash(int algo, uint16_t *port, struct inpcb *inp,
kauth_cred_t cred)
{
uint16_t count, num_ephemeral;
@@ -625,12 +610,12 @@ algo_hash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
- if (!iscompletetuple(inp_hdr)) {
+ if (!iscompletetuple(inp)) {
*port = 0;
return 0;
}
@@ -640,7 +625,7 @@ algo_hash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("num_ephemeral: %d\n", num_ephemeral);
- offset = Fhash(inp_hdr);
+ offset = Fhash(inp);
count = num_ephemeral;
do {
@@ -649,7 +634,7 @@ algo_hash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
(*next_ephemeral)++;
- if (check_suitable_port(myport, inp_hdr, cred)) {
+ if (check_suitable_port(myport, inp, cred)) {
*port = myport;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -663,7 +648,7 @@ algo_hash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
}
static int
-algo_doublehash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
+algo_doublehash(int algo, uint16_t *port, struct inpcb *inp,
kauth_cred_t cred)
{
uint16_t count, num_ephemeral;
@@ -676,12 +661,12 @@ algo_doublehash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
- if (!iscompletetuple(inp_hdr)) {
+ if (!iscompletetuple(inp)) {
*port = 0;
return 0;
}
@@ -692,8 +677,8 @@ algo_doublehash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
/* Ephemeral port selection function */
num_ephemeral = mymax - mymin + 1;
- offset = Fhash(inp_hdr);
- idx = Fhash(inp_hdr) % __arraycount(dhtable); /* G */
+ offset = Fhash(inp);
+ idx = Fhash(inp) % __arraycount(dhtable); /* G */
count = num_ephemeral;
do {
@@ -701,7 +686,7 @@ algo_doublehash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
% num_ephemeral;
dhtable[idx]++;
- if (check_suitable_port(myport, inp_hdr, cred)) {
+ if (check_suitable_port(myport, inp, cred)) {
*port = myport;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -716,7 +701,7 @@ algo_doublehash(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
}
static int
-algo_randinc(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
+algo_randinc(int algo, uint16_t *port, struct inpcb *inp,
kauth_cred_t cred)
{
static const uint16_t N = 500; /* Determines the trade-off */
@@ -728,7 +713,7 @@ algo_randinc(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
DPRINTF("%s called\n", __func__);
- error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax,
+ error = pcb_getports(inp, &lastport, &mymin, &mymax,
&next_ephemeral, algo);
if (error)
return error;
@@ -746,7 +731,7 @@ algo_randinc(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
myport = mymin +
(*next_ephemeral % num_ephemeral);
- if (check_suitable_port(myport, inp_hdr, cred)) {
+ if (check_suitable_port(myport, inp, cred)) {
*port = myport;
DPRINTF("%s returning port %d\n", __func__, *port);
return 0;
@@ -759,7 +744,7 @@ algo_randinc(int algo, uint16_t *port, struct inpcb_hdr *inp_hdr,
/* The generic function called in order to pick a port. */
int
-portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
+portalgo_randport(uint16_t *port, struct inpcb *inp, kauth_cred_t cred)
{
int algo, error;
uint16_t lport;
@@ -767,8 +752,8 @@ portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
DPRINTF("%s called\n", __func__);
- if (inp_hdr->inph_portalgo == PORTALGO_DEFAULT) {
- switch (inp_hdr->inph_af) {
+ if (inp->inp_portalgo == PORTALGO_DEFAULT) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET:
default_algo = inet4_portalgo;
@@ -789,16 +774,15 @@ portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
algo = default_algo;
}
else /* socket specifies the algorithm */
- algo = inp_hdr->inph_portalgo;
+ algo = inp->inp_portalgo;
KASSERT(algo >= 0);
KASSERT(algo < NALGOS);
- switch (inp_hdr->inph_af) {
+ switch (inp->inp_af) {
#ifdef INET
case AF_INET: {
char buf[INET_ADDRSTRLEN];
- struct inpcb *inp = (struct inpcb *)(void *)inp_hdr;
DPRINTF("local addr: %s\n", IN_PRINT(buf, &inp->inp_laddr));
DPRINTF("local port: %d\n", inp->inp_lport);
DPRINTF("foreign addr: %s\n", IN_PRINT(buf, &inp->inp_faddr));
@@ -809,13 +793,11 @@ portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
#ifdef INET6
case AF_INET6: {
char buf[INET6_ADDRSTRLEN];
- struct in6pcb *in6p = (struct in6pcb *)(void *)inp_hdr;
-
- DPRINTF("local addr: %s\n", IN6_PRINT(buf, &in6p->in6p_laddr));
- DPRINTF("local port: %d\n", in6p->in6p_lport);
+ DPRINTF("local addr: %s\n", IN6_PRINT(buf, &inp->inp_laddr6));
+ DPRINTF("local port: %d\n", inp->inp_lport);
DPRINTF("foreign addr: %s\n", IN6_PRINT(buf,
- &in6p->in6p_laddr));
- DPRINTF("foreign port: %d\n", in6p->in6p_fport);
+ &inp->inp_laddr6));
+ DPRINTF("foreign port: %d\n", inp->inp_fport);
break;
}
#endif
@@ -825,13 +807,13 @@ portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred)
DPRINTF("%s portalgo = %d\n", __func__, algo);
- error = (*algos[algo].func)(algo, &lport, inp_hdr, cred);
+ error = (*algos[algo].func)(algo, &lport, inp, cred);
if (error == 0) {
*port = lport;
} else if (error != EAGAIN) {
uint16_t lastport, mymin, mymax, *pnext_ephemeral;
- error = pcb_getports(inp_hdr, &lastport, &mymin,
+ error = pcb_getports(inp, &lastport, &mymin,
&mymax, &pnext_ephemeral, algo);
if (error)
return error;
@@ -859,7 +841,7 @@ portalgo_algo_name_select(const char *name, int *algo)
/* Sets the algorithm to be used by the pcb inp. */
int
-portalgo_algo_index_select(struct inpcb_hdr *inp, int algo)
+portalgo_algo_index_select(struct inpcb *inp, int algo)
{
DPRINTF("%s called with algo %d for pcb %p\n", __func__, algo, inp );
@@ -868,7 +850,7 @@ portalgo_algo_index_select(struct inpcb_hdr *inp, int algo)
(algo != PORTALGO_DEFAULT))
return EINVAL;
- inp->inph_portalgo = algo;
+ inp->inp_portalgo = algo;
return 0;
}
diff --git a/sys/netinet/portalgo.h b/sys/netinet/portalgo.h
index 634ca72e727..bf77b61e9a7 100644
--- a/sys/netinet/portalgo.h
+++ b/sys/netinet/portalgo.h
@@ -1,4 +1,4 @@
-/* $NetBSD: portalgo.h,v 1.2 2012/11/29 02:07:20 christos Exp $ */
+/* $NetBSD: portalgo.h,v 1.3 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright 2011 Vlad Balan
@@ -33,14 +33,14 @@
#ifdef _KERNEL
#include <sys/sysctl.h>
-struct inpcb_hdr;
-int portalgo_randport(uint16_t *, struct inpcb_hdr *, kauth_cred_t);
+struct inpcb;
+int portalgo_randport(uint16_t *, struct inpcb *, kauth_cred_t);
int sysctl_portalgo_selected4(SYSCTLFN_ARGS);
int sysctl_portalgo_selected6(SYSCTLFN_ARGS);
int sysctl_portalgo_reserve4(SYSCTLFN_ARGS);
int sysctl_portalgo_reserve6(SYSCTLFN_ARGS);
int sysctl_portalgo_available(SYSCTLFN_ARGS);
-int portalgo_algo_index_select(struct inpcb_hdr *, int);
+int portalgo_algo_index_select(struct inpcb *, int);
#define PORTALGO_MAXLEN 16
#endif /* _KERNEL */
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index 9869a2958e9..cd8b1dc92d4 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_ip.c,v 1.181 2022/06/13 09:23:23 knakahara Exp $ */
+/* $NetBSD: raw_ip.c,v 1.182 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.181 2022/06/13 09:23:23 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.182 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -165,7 +165,6 @@ void
rip_input(struct mbuf *m, int off, int proto)
{
struct ip *ip = mtod(m, struct ip *);
- struct inpcb_hdr *inph;
struct inpcb *inp;
struct inpcb *last = NULL;
struct mbuf *n;
@@ -183,8 +182,7 @@ rip_input(struct mbuf *m, int off, int proto)
ip->ip_len = ntohs(ip->ip_len) - hlen;
NTOHS(ip->ip_off);
- TAILQ_FOREACH(inph, &rawcbtable.inpt_queue, inph_queue) {
- inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) {
if (inp->inp_af != AF_INET)
continue;
if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto)
@@ -241,12 +239,11 @@ rip_pcbnotify(struct inpcbtable *table,
struct in_addr faddr, struct in_addr laddr, int proto, int errno,
void (*notify)(struct inpcb *, int))
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
int nmatch;
nmatch = 0;
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct inpcb *inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
if (inp->inp_af != AF_INET)
continue;
if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto)
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 66a14980aaf..7c514396ee7 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_input.c,v 1.434 2022/09/20 07:19:14 ozaki-r Exp $ */
+/* $NetBSD: tcp_input.c,v 1.435 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -138,7 +138,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.434 2022/09/20 07:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.435 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -254,21 +254,7 @@ nd_hint(struct tcpcb *tp)
if (tp == NULL)
return;
- switch (tp->t_family) {
-#if NARP > 0
- case AF_INET:
- if (tp->t_inpcb != NULL)
- ro = &tp->t_inpcb->inp_route;
- break;
-#endif
-#ifdef INET6
- case AF_INET6:
- if (tp->t_in6pcb != NULL)
- ro = &tp->t_in6pcb->in6p_route;
- break;
-#endif
- }
-
+ ro = &tp->t_inpcb->inp_route;
if (ro == NULL)
return;
@@ -478,12 +464,7 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
#endif
uint64_t *tcps;
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- else if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
+ so = tp->t_inpcb->inp_socket;
TCP_REASS_LOCK_CHECK(tp);
@@ -1198,7 +1179,6 @@ tcp_input(struct mbuf *m, int off, int proto)
struct inpcb *inp;
#ifdef INET6
struct ip6_hdr *ip6;
- struct in6pcb *in6p;
#endif
u_int8_t *optp = NULL;
int optlen = 0;
@@ -1385,9 +1365,6 @@ tcp_input(struct mbuf *m, int off, int proto)
*/
findpcb:
inp = NULL;
-#ifdef INET6
- in6p = NULL;
-#endif
switch (af) {
case AF_INET:
inp = in_pcblookup_connect(&tcbtable, ip->ip_src, th->th_sport,
@@ -1404,21 +1381,16 @@ findpcb:
/* mapped addr case */
in6_in_2_v4mapin6(&ip->ip_src, &s);
in6_in_2_v4mapin6(&ip->ip_dst, &d);
- in6p = in6_pcblookup_connect(&tcbtable, &s,
+ inp = in6_pcblookup_connect(&tcbtable, &s,
th->th_sport, &d, th->th_dport, 0, &vestige);
- if (in6p == 0 && !vestige.valid) {
+ if (inp == NULL && !vestige.valid) {
TCP_STATINC(TCP_STAT_PCBHASHMISS);
- in6p = in6_pcblookup_bind(&tcbtable, &d,
+ inp = in6_pcblookup_bind(&tcbtable, &d,
th->th_dport, 0);
}
}
#endif
-#ifndef INET6
- if (inp == NULL && !vestige.valid)
-#else
- if (inp == NULL && in6p == NULL && !vestige.valid)
-#endif
- {
+ if (inp == NULL && !vestige.valid) {
TCP_STATINC(TCP_STAT_NOPORT);
if (tcp_log_refused &&
(tiflags & (TH_RST|TH_ACK|TH_SYN)) == TH_SYN) {
@@ -1429,14 +1401,8 @@ findpcb:
}
#if defined(IPSEC)
if (ipsec_used) {
- if (inp && ipsec_in_reject(m, inp)) {
+ if (inp && ipsec_in_reject(m, inp))
goto drop;
- }
-#ifdef INET6
- else if (in6p && ipsec_in_reject(m, in6p)) {
- goto drop;
- }
-#endif
}
#endif /*IPSEC*/
break;
@@ -1450,14 +1416,14 @@ findpcb:
#else
faith = 0;
#endif
- in6p = in6_pcblookup_connect(&tcbtable, &ip6->ip6_src,
+ inp = in6_pcblookup_connect(&tcbtable, &ip6->ip6_src,
th->th_sport, &ip6->ip6_dst, th->th_dport, faith, &vestige);
- if (!in6p && !vestige.valid) {
+ if (inp == NULL && !vestige.valid) {
TCP_STATINC(TCP_STAT_PCBHASHMISS);
- in6p = in6_pcblookup_bind(&tcbtable, &ip6->ip6_dst,
+ inp = in6_pcblookup_bind(&tcbtable, &ip6->ip6_dst,
th->th_dport, faith);
}
- if (!in6p && !vestige.valid) {
+ if (inp == NULL && !vestige.valid) {
TCP_STATINC(TCP_STAT_NOPORT);
if (tcp_log_refused &&
(tiflags & (TH_RST|TH_ACK|TH_SYN)) == TH_SYN) {
@@ -1467,9 +1433,8 @@ findpcb:
goto dropwithreset_ratelim;
}
#if defined(IPSEC)
- if (ipsec_used && in6p && ipsec_in_reject(m, in6p)) {
+ if (ipsec_used && inp && ipsec_in_reject(m, inp))
goto drop;
- }
#endif
break;
}
@@ -1488,19 +1453,12 @@ findpcb:
so = NULL;
if (inp) {
/* Check the minimum TTL for socket. */
- if (ip->ip_ttl < inp->inp_ip_minttl)
+ if (inp->inp_af == AF_INET && ip->ip_ttl < inp->inp_ip_minttl)
goto drop;
tp = intotcpcb(inp);
so = inp->inp_socket;
- }
-#ifdef INET6
- else if (in6p) {
- tp = in6totcpcb(in6p);
- so = in6p->in6p_socket;
- }
-#endif
- else if (vestige.valid) {
+ } else if (vestige.valid) {
/* We do not support the resurrection of vtw tcpcps. */
tcp_vtw_input(th, &vestige, m, tlen);
m = NULL;
@@ -1523,12 +1481,12 @@ findpcb:
#ifdef INET6
/* save packet options if user wanted */
- if (in6p && (in6p->in6p_flags & IN6P_CONTROLOPTS)) {
- if (in6p->in6p_options) {
- m_freem(in6p->in6p_options);
- in6p->in6p_options = NULL;
+ if (inp && (inp->inp_flags & IN6P_CONTROLOPTS)) {
+ if (inp->inp_options) {
+ m_freem(inp->inp_options);
+ inp->inp_options = NULL;
}
- ip6_savecontrol(in6p, &in6p->in6p_options, ip6, m);
+ ip6_savecontrol(inp, &inp->inp_options, ip6, m);
}
#endif
@@ -1634,23 +1592,8 @@ nosave:;
* We have created a full-blown
* connection.
*/
- tp = NULL;
- inp = NULL;
-#ifdef INET6
- in6p = NULL;
-#endif
- switch (so->so_proto->pr_domain->dom_family) {
- case AF_INET:
- inp = sotoinpcb(so);
- tp = intotcpcb(inp);
- break;
-#ifdef INET6
- case AF_INET6:
- in6p = sotoin6pcb(so);
- tp = in6totcpcb(in6p);
- break;
-#endif
- }
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
if (tp == NULL)
goto badsyn; /*XXX*/
tiwin <<= tp->snd_scale;
@@ -2145,10 +2088,10 @@ after_listen:
tp->snd_cwnd = tp->t_peermss;
else {
int ss = tcp_init_win;
- if (inp != NULL && in_localaddr(inp->inp_faddr))
+ if (inp->inp_af == AF_INET && in_localaddr(inp->inp_faddr))
ss = tcp_init_win_local;
#ifdef INET6
- if (in6p != NULL && in6_localaddr(&in6p->in6p_faddr))
+ else if (inp->inp_af == AF_INET6 && in6_localaddr(&inp->inp_faddr6))
ss = tcp_init_win_local;
#endif
tp->snd_cwnd = TCP_INITIAL_WINDOW(ss, tp->t_peermss);
@@ -2912,8 +2855,7 @@ dodata:
if (tp->t_state == TCPS_TIME_WAIT
&& (so->so_state & SS_NOFDREF)
- && (tp->t_inpcb || af != AF_INET)
- && (tp->t_in6pcb || af != AF_INET6)
+ && (tp->t_inpcb || af != AF_INET || af != AF_INET6)
&& ((af == AF_INET ? tcp4_vtw_enable : tcp6_vtw_enable) & 1) != 0
&& TAILQ_EMPTY(&tp->segq)
&& vtw_add(af, tp)) {
@@ -2996,14 +2938,7 @@ drop:
* Drop space held by incoming segment and return.
*/
if (tp) {
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- else if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
- else
- so = NULL;
+ so = tp->t_inpcb->inp_socket;
#ifdef TCP_DEBUG
if (so && (so->so_options & SO_DEBUG) != 0)
tcp_trace(TA_DROP, ostate, tp, tcp_saveti, 0);
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index df8393f19a9..a39ba99ecfd 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_output.c,v 1.214 2021/12/30 23:03:44 andvar Exp $ */
+/* $NetBSD: tcp_output.c,v 1.215 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -135,7 +135,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.214 2021/12/30 23:03:44 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.215 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -227,9 +227,6 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
bool *alwaysfragp)
{
struct inpcb *inp = tp->t_inpcb;
-#ifdef INET6
- struct in6pcb *in6p = tp->t_in6pcb;
-#endif
struct socket *so = NULL;
struct rtentry *rt;
struct ifnet *ifp;
@@ -240,8 +237,6 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
*alwaysfragp = false;
size = tcp_mssdflt;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
-
switch (tp->t_family) {
case AF_INET:
hdrlen = sizeof(struct ip) + sizeof(struct tcphdr);
@@ -256,17 +251,8 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
goto out;
}
- rt = NULL;
- if (inp) {
- rt = in_pcbrtentry(inp);
- so = inp->inp_socket;
- }
-#ifdef INET6
- if (in6p) {
- rt = in6_pcbrtentry(in6p);
- so = in6p->in6p_socket;
- }
-#endif
+ rt = in_pcbrtentry(inp);
+ so = inp->inp_socket;
if (rt == NULL) {
goto out;
}
@@ -275,7 +261,7 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
if (tp->t_mtudisc && rt->rt_rmx.rmx_mtu != 0) {
#ifdef INET6
- if (in6p && rt->rt_rmx.rmx_mtu < IPV6_MMTU) {
+ if (inp->inp_af == AF_INET6 && rt->rt_rmx.rmx_mtu < IPV6_MMTU) {
/*
* RFC2460 section 5, last paragraph: if path MTU is
* smaller than 1280, use 1280 as packet size and
@@ -295,11 +281,11 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
else if (inp && in_localaddr(inp->inp_faddr))
size = ifp->if_mtu - hdrlen;
#ifdef INET6
- else if (in6p) {
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)) {
+ else if (inp->inp_af == AF_INET6) {
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6)) {
/* mapped addr case */
struct in_addr d;
- memcpy(&d, &in6p->in6p_faddr.s6_addr32[3], sizeof(d));
+ memcpy(&d, &inp->inp_faddr6.s6_addr32[3], sizeof(d));
if (tp->t_mtudisc || in_localaddr(d))
size = ifp->if_mtu - hdrlen;
} else {
@@ -312,12 +298,7 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
}
}
#endif
- if (inp)
- in_pcbrtentry_unref(rt, inp);
-#ifdef INET6
- if (in6p)
- in6_pcbrtentry_unref(rt, in6p);
-#endif
+ in_pcbrtentry_unref(rt, inp);
out:
/*
* Now we must make room for whatever extra TCP/IP options are in
@@ -330,7 +311,7 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
* fragmentation will occur... need more investigation
*/
- if (inp) {
+ if (inp->inp_af == AF_INET) {
#if defined(IPSEC)
if (ipsec_used &&
!ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND))
@@ -340,20 +321,20 @@ tcp_segsize(struct tcpcb *tp, int *txsegsizep, int *rxsegsizep,
}
#ifdef INET6
- if (in6p && tp->t_family == AF_INET) {
+ if (inp->inp_af == AF_INET6 && tp->t_family == AF_INET) {
#if defined(IPSEC)
if (ipsec_used &&
- !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
+ !ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND))
optlen += ipsec4_hdrsiz_tcp(tp);
#endif
/* XXX size -= ip_optlen(in6p); */
- } else if (in6p && tp->t_family == AF_INET6) {
+ } else if (inp->inp_af == AF_INET6) {
#if defined(IPSEC)
if (ipsec_used &&
- !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND))
+ !ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND))
optlen += ipsec6_hdrsiz_tcp(tp);
#endif
- optlen += ip6_optlen(in6p);
+ optlen += ip6_optlen(inp);
}
#endif
size -= optlen;
@@ -555,37 +536,15 @@ tcp_output(struct tcpcb *tp)
#endif
uint64_t *tcps;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
-
- so = NULL;
- ro = NULL;
- if (tp->t_inpcb) {
- so = tp->t_inpcb->inp_socket;
- ro = &tp->t_inpcb->inp_route;
- }
-#ifdef INET6
- else if (tp->t_in6pcb) {
- so = tp->t_in6pcb->in6p_socket;
- ro = &tp->t_in6pcb->in6p_route;
- }
-#endif
+ so = tp->t_inpcb->inp_socket;
+ ro = &tp->t_inpcb->inp_route;
switch (af = tp->t_family) {
case AF_INET:
- if (tp->t_inpcb)
- break;
-#ifdef INET6
- /* mapped addr case */
- if (tp->t_in6pcb)
- break;
-#endif
- return EINVAL;
-#ifdef INET6
case AF_INET6:
- if (tp->t_in6pcb)
+ if (tp->t_inpcb)
break;
return EINVAL;
-#endif
default:
return EAFNOSUPPORT;
}
@@ -603,7 +562,7 @@ tcp_output(struct tcpcb *tp)
*/
has_tso4 = has_tso6 = false;
- has_tso4 = tp->t_inpcb != NULL &&
+ has_tso4 = tp->t_inpcb->inp_af == AF_INET &&
#if defined(IPSEC)
(!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_inpcb->inp_sp,
IPSEC_DIR_OUTBOUND)) &&
@@ -616,15 +575,15 @@ tcp_output(struct tcpcb *tp)
}
#if defined(INET6)
- has_tso6 = tp->t_in6pcb != NULL &&
+ has_tso6 = tp->t_inpcb->inp_af == AF_INET6 &&
#if defined(IPSEC)
- (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_in6pcb->in6p_sp,
+ (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_inpcb->inp_sp,
IPSEC_DIR_OUTBOUND)) &&
#endif
- (rt = rtcache_validate(&tp->t_in6pcb->in6p_route)) != NULL &&
+ (rt = rtcache_validate(&tp->t_inpcb->inp_route)) != NULL &&
(rt->rt_ifp->if_capenable & IFCAP_TSOv6) != 0;
if (rt != NULL)
- rtcache_unref(rt, &tp->t_in6pcb->in6p_route);
+ rtcache_unref(rt, &tp->t_inpcb->inp_route);
#endif /* defined(INET6) */
has_tso = (has_tso4 || has_tso6) && !alwaysfrag;
@@ -659,12 +618,12 @@ tcp_output(struct tcpcb *tp)
* slow start to get ack "clock" running again.
*/
int ss = tcp_init_win;
- if (tp->t_inpcb &&
+ if (tp->t_inpcb->inp_af == AF_INET &&
in_localaddr(tp->t_inpcb->inp_faddr))
ss = tcp_init_win_local;
#ifdef INET6
- if (tp->t_in6pcb &&
- in6_localaddr(&tp->t_in6pcb->in6p_faddr))
+ else if (tp->t_inpcb->inp_af == AF_INET6 &&
+ in6_localaddr(&tp->t_inpcb->inp_faddr6))
ss = tcp_init_win_local;
#endif
tp->snd_cwnd = uimin(tp->snd_cwnd,
@@ -1107,23 +1066,11 @@ send:
if (flags & TH_SYN) {
struct rtentry *synrt;
- synrt = NULL;
- if (tp->t_inpcb)
- synrt = in_pcbrtentry(tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- synrt = in6_pcbrtentry(tp->t_in6pcb);
-#endif
-
+ synrt = in_pcbrtentry(tp->t_inpcb);
tp->snd_nxt = tp->iss;
tp->t_ourmss = tcp_mss_to_advertise(synrt != NULL ?
synrt->rt_ifp : NULL, af);
- if (tp->t_inpcb)
- in_pcbrtentry_unref(synrt, tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- in6_pcbrtentry_unref(synrt, tp->t_in6pcb);
-#endif
+ in_pcbrtentry_unref(synrt, tp->t_inpcb);
if ((tp->t_flags & TF_NOOPT) == 0 && OPT_FITS(TCPOLEN_MAXSEG)) {
*optp++ = TCPOPT_MAXSEG;
*optp++ = TCPOLEN_MAXSEG;
@@ -1593,13 +1540,13 @@ timer:
case AF_INET:
ip->ip_len = htons(m->m_pkthdr.len);
packetlen = m->m_pkthdr.len;
- if (tp->t_inpcb) {
+ if (tp->t_inpcb->inp_af == AF_INET) {
ip->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl;
ip->ip_tos = tp->t_inpcb->inp_ip.ip_tos | ecn_tos;
}
#ifdef INET6
- else if (tp->t_in6pcb) {
- ip->ip_ttl = in6_selecthlim(tp->t_in6pcb, NULL); /*XXX*/
+ else if (tp->t_inpcb->inp_af == AF_INET6) {
+ ip->ip_ttl = in6_selecthlim(tp->t_inpcb, NULL); /*XXX*/
ip->ip_tos = ecn_tos; /*XXX*/
}
#endif
@@ -1608,14 +1555,14 @@ timer:
case AF_INET6:
packetlen = m->m_pkthdr.len;
ip6->ip6_nxt = IPPROTO_TCP;
- if (tp->t_in6pcb) {
+ if (tp->t_family == AF_INET6) {
/*
* we separately set hoplimit for every segment, since
* the user might want to change the value via
* setsockopt. Also, desired default hop limit might
* be changed via Neighbor Discovery.
*/
- ip6->ip6_hlim = in6_selecthlim_rt(tp->t_in6pcb);
+ ip6->ip6_hlim = in6_selecthlim_rt(tp->t_inpcb);
}
ip6->ip6_flow |= htonl(ecn_tos << 20);
/* ip6->ip6_flow = ??? (from template) */
@@ -1632,7 +1579,7 @@ timer:
{
struct mbuf *opts;
- if (tp->t_inpcb)
+ if (tp->t_inpcb && tp->t_family == AF_INET)
opts = tp->t_inpcb->inp_options;
else
opts = NULL;
@@ -1646,12 +1593,12 @@ timer:
{
struct ip6_pktopts *opts;
- if (tp->t_in6pcb)
- opts = tp->t_in6pcb->in6p_outputopts;
+ if (tp->t_inpcb && tp->t_family == AF_INET6)
+ opts = tp->t_inpcb->inp_outputopts6;
else
opts = NULL;
error = ip6_output(m, opts, ro, so->so_options & SO_DONTROUTE,
- NULL, tp->t_in6pcb, NULL);
+ NULL, tp->t_inpcb, NULL);
break;
}
#endif
@@ -1663,12 +1610,7 @@ timer:
out:
if (error == ENOBUFS) {
TCP_STATINC(TCP_STAT_SELFQUENCH);
- if (tp->t_inpcb)
- tcp_quench(tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- tcp6_quench(tp->t_in6pcb);
-#endif
+ tcp_quench(tp->t_inpcb);
error = 0;
} else if ((error == EHOSTUNREACH || error == ENETDOWN) &&
TCPS_HAVERCVDSYN(tp->t_state)) {
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 442c4710d87..4a92f4798d4 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_subr.c,v 1.291 2022/09/20 07:19:14 ozaki-r Exp $ */
+/* $NetBSD: tcp_subr.c,v 1.292 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.291 2022/09/20 07:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.292 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -229,7 +229,7 @@ static int tcp_iss_secret_init(void);
static void tcp_mtudisc_callback(struct in_addr);
#ifdef INET6
-static void tcp6_mtudisc(struct in6pcb *, int);
+static void tcp6_mtudisc(struct inpcb *, int);
#endif
static struct pool tcpcb_pool;
@@ -448,9 +448,6 @@ struct mbuf *
tcp_template(struct tcpcb *tp)
{
struct inpcb *inp = tp->t_inpcb;
-#ifdef INET6
- struct in6pcb *in6p = tp->t_in6pcb;
-#endif
struct tcphdr *n;
struct mbuf *m;
int hlen;
@@ -458,13 +455,13 @@ tcp_template(struct tcpcb *tp)
switch (tp->t_family) {
case AF_INET:
hlen = sizeof(struct ip);
- if (inp)
+ if (inp->inp_af == AF_INET)
break;
#ifdef INET6
- if (in6p) {
+ if (inp->inp_af == AF_INET6) {
/* mapped addr case */
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr)
- && IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6)
+ && IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6))
break;
}
#endif
@@ -472,7 +469,7 @@ tcp_template(struct tcpcb *tp)
#ifdef INET6
case AF_INET6:
hlen = sizeof(struct ip6_hdr);
- if (in6p) {
+ if (inp != NULL) {
/* more sainty check? */
break;
}
@@ -518,16 +515,16 @@ tcp_template(struct tcpcb *tp)
ipov = mtod(m, struct ipovly *);
ipov->ih_pr = IPPROTO_TCP;
ipov->ih_len = htons(sizeof(struct tcphdr));
- if (inp) {
+ if (inp->inp_af == AF_INET) {
ipov->ih_src = inp->inp_laddr;
ipov->ih_dst = inp->inp_faddr;
}
#ifdef INET6
- else if (in6p) {
+ else if (inp->inp_af == AF_INET6) {
/* mapped addr case */
- bcopy(&in6p->in6p_laddr.s6_addr32[3], &ipov->ih_src,
+ bcopy(&inp->inp_laddr6.s6_addr32[3], &ipov->ih_src,
sizeof(ipov->ih_src));
- bcopy(&in6p->in6p_faddr.s6_addr32[3], &ipov->ih_dst,
+ bcopy(&inp->inp_faddr6.s6_addr32[3], &ipov->ih_dst,
sizeof(ipov->ih_dst));
}
#endif
@@ -552,9 +549,9 @@ tcp_template(struct tcpcb *tp)
ip6 = mtod(m, struct ip6_hdr *);
ip6->ip6_nxt = IPPROTO_TCP;
ip6->ip6_plen = htons(sizeof(struct tcphdr));
- ip6->ip6_src = in6p->in6p_laddr;
- ip6->ip6_dst = in6p->in6p_faddr;
- ip6->ip6_flow = in6p->in6p_flowinfo & IPV6_FLOWINFO_MASK;
+ ip6->ip6_src = inp->inp_laddr6;
+ ip6->ip6_dst = inp->inp_faddr6;
+ ip6->ip6_flow = inp->inp_flowinfo & IPV6_FLOWINFO_MASK;
if (ip6_auto_flowlabel) {
ip6->ip6_flow &= ~IPV6_FLOWLABEL_MASK;
ip6->ip6_flow |=
@@ -570,24 +567,16 @@ tcp_template(struct tcpcb *tp)
* checksum right before the packet is sent off onto
* the wire.
*/
- n->th_sum = in6_cksum_phdr(&in6p->in6p_laddr,
- &in6p->in6p_faddr, htonl(sizeof(struct tcphdr)),
+ n->th_sum = in6_cksum_phdr(&inp->inp_laddr6,
+ &inp->inp_faddr6, htonl(sizeof(struct tcphdr)),
htonl(IPPROTO_TCP));
break;
}
#endif
}
- if (inp) {
- n->th_sport = inp->inp_lport;
- n->th_dport = inp->inp_fport;
- }
-#ifdef INET6
- else if (in6p) {
- n->th_sport = in6p->in6p_lport;
- n->th_dport = in6p->in6p_fport;
- }
-#endif
+ n->th_sport = inp->inp_lport;
+ n->th_dport = inp->inp_fport;
n->th_seq = 0;
n->th_ack = 0;
@@ -623,18 +612,13 @@ tcp_respond(struct tcpcb *tp, struct mbuf *mtemplate, struct mbuf *m,
#ifdef INET6
struct ip6_hdr *ip6;
#endif
- int family; /* family on packet, not inpcb/in6pcb! */
+ int family; /* family on packet, not inpcb! */
struct tcphdr *th;
if (tp != NULL && (flags & TH_RST) == 0) {
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
+ KASSERT(tp->t_inpcb != NULL);
- if (tp->t_inpcb)
- win = sbspace(&tp->t_inpcb->inp_socket->so_rcv);
-#ifdef INET6
- if (tp->t_in6pcb)
- win = sbspace(&tp->t_in6pcb->in6p_socket->so_rcv);
-#endif
+ win = sbspace(&tp->t_inpcb->inp_socket->so_rcv);
}
th = NULL; /* Quell uninitialized warning */
@@ -822,8 +806,8 @@ tcp_respond(struct tcpcb *tp, struct mbuf *mtemplate, struct mbuf *m,
th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr),
tlen);
ip6->ip6_plen = htons(tlen);
- if (tp && tp->t_in6pcb)
- ip6->ip6_hlim = in6_selecthlim_rt(tp->t_in6pcb);
+ if (tp && tp->t_inpcb->inp_af == AF_INET6)
+ ip6->ip6_hlim = in6_selecthlim_rt(tp->t_inpcb);
else
ip6->ip6_hlim = ip6_defhlim;
ip6->ip6_flow &= ~IPV6_FLOWINFO_MASK;
@@ -836,27 +820,27 @@ tcp_respond(struct tcpcb *tp, struct mbuf *mtemplate, struct mbuf *m,
#endif
}
- if (tp != NULL && tp->t_inpcb != NULL) {
+ if (tp != NULL && tp->t_inpcb->inp_af == AF_INET) {
ro = &tp->t_inpcb->inp_route;
KASSERT(family == AF_INET);
KASSERT(in_hosteq(ip->ip_dst, tp->t_inpcb->inp_faddr));
}
#ifdef INET6
- else if (tp != NULL && tp->t_in6pcb != NULL) {
- ro = (struct route *)&tp->t_in6pcb->in6p_route;
+ else if (tp != NULL && tp->t_inpcb->inp_af == AF_INET6) {
+ ro = (struct route *)&tp->t_inpcb->inp_route;
#ifdef DIAGNOSTIC
if (family == AF_INET) {
- if (!IN6_IS_ADDR_V4MAPPED(&tp->t_in6pcb->in6p_faddr))
+ if (!IN6_IS_ADDR_V4MAPPED(&tp->t_inpcb->inp_faddr6))
panic("tcp_respond: not mapped addr");
if (memcmp(&ip->ip_dst,
- &tp->t_in6pcb->in6p_faddr.s6_addr32[3],
+ &tp->t_inpcb->inp_faddr6.s6_addr32[3],
sizeof(ip->ip_dst)) != 0) {
panic("tcp_respond: ip_dst != in6p_faddr");
}
} else if (family == AF_INET6) {
if (!IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst,
- &tp->t_in6pcb->in6p_faddr))
+ &tp->t_inpcb->inp_faddr6))
panic("tcp_respond: ip6_dst != in6p_faddr");
} else
panic("tcp_respond: address family mismatch");
@@ -875,7 +859,7 @@ tcp_respond(struct tcpcb *tp, struct mbuf *mtemplate, struct mbuf *m,
#ifdef INET6
case AF_INET6:
error = ip6_output(m, NULL, ro, 0, NULL,
- tp ? tp->t_in6pcb : NULL, NULL);
+ tp ? tp->t_inpcb : NULL, NULL);
break;
#endif
default:
@@ -957,9 +941,8 @@ tcp_tcpcb_template(void)
* empty reassembly queue and hooking it to the argument
* protocol control block.
*/
-/* family selects inpcb, or in6pcb */
struct tcpcb *
-tcp_newtcpcb(int family, void *aux)
+tcp_newtcpcb(int family, struct inpcb *inp)
{
struct tcpcb *tp;
int i;
@@ -984,29 +967,21 @@ tcp_newtcpcb(int family, void *aux)
switch (family) {
case AF_INET:
- {
- struct inpcb *inp = (struct inpcb *)aux;
-
inp->inp_ip.ip_ttl = ip_defttl;
inp->inp_ppcb = (void *)tp;
tp->t_inpcb = inp;
tp->t_mtudisc = ip_mtudisc;
break;
- }
#ifdef INET6
case AF_INET6:
- {
- struct in6pcb *in6p = (struct in6pcb *)aux;
-
- in6p->in6p_ip6.ip6_hlim = in6_selecthlim_rt(in6p);
- in6p->in6p_ppcb = (void *)tp;
+ inp->inp_ip6.ip6_hlim = in6_selecthlim_rt(inp);
+ inp->inp_ppcb = (void *)tp;
- tp->t_in6pcb = in6p;
+ tp->t_inpcb = inp;
/* for IPv6, always try to run path MTU discovery */
tp->t_mtudisc = 1;
break;
- }
#endif /* INET6 */
default:
for (i = 0; i < TCPT_NTIMERS; i++)
@@ -1042,17 +1017,12 @@ tcp_newtcpcb(int family, void *aux)
struct tcpcb *
tcp_drop(struct tcpcb *tp, int errno)
{
- struct socket *so = NULL;
+ struct socket *so;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
+ KASSERT(tp->t_inpcb != NULL);
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
- if (!so)
+ so = tp->t_inpcb->inp_socket;
+ if (so != NULL)
return NULL;
if (TCPS_HAVERCVDSYN(tp->t_state)) {
@@ -1077,9 +1047,6 @@ struct tcpcb *
tcp_close(struct tcpcb *tp)
{
struct inpcb *inp;
-#ifdef INET6
- struct in6pcb *in6p;
-#endif
struct socket *so;
#ifdef RTV_RTT
struct rtentry *rt = NULL;
@@ -1088,21 +1055,8 @@ tcp_close(struct tcpcb *tp)
int j;
inp = tp->t_inpcb;
-#ifdef INET6
- in6p = tp->t_in6pcb;
-#endif
- so = NULL;
- ro = NULL;
- if (inp) {
- so = inp->inp_socket;
- ro = &inp->inp_route;
- }
-#ifdef INET6
- else if (in6p) {
- so = in6p->in6p_socket;
- ro = (struct route *)&in6p->in6p_route;
- }
-#endif
+ so = inp->inp_socket;
+ ro = &inp->inp_route;
#ifdef RTV_RTT
/*
@@ -1195,18 +1149,9 @@ tcp_close(struct tcpcb *tp)
* (prevents access by timers) and only then detach it.
*/
tp->t_flags |= TF_DEAD;
- if (inp) {
- inp->inp_ppcb = 0;
- soisdisconnected(so);
- in_pcbdetach(inp);
- }
-#ifdef INET6
- else if (in6p) {
- in6p->in6p_ppcb = 0;
- soisdisconnected(so);
- in6_pcbdetach(in6p);
- }
-#endif
+ inp->inp_ppcb = NULL;
+ soisdisconnected(so);
+ in_pcbdetach(inp);
/*
* pcb is no longer visble elsewhere, so we can safely release
* the lock in callout_halt() if needed.
@@ -1265,7 +1210,7 @@ tcp_drainstub(void)
void
tcp_drain(void)
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
struct tcpcb *tp;
mutex_enter(softnet_lock);
@@ -1274,20 +1219,8 @@ tcp_drain(void)
/*
* Free the sequence queue of all TCP connections.
*/
- TAILQ_FOREACH(inph, &tcbtable.inpt_queue, inph_queue) {
- switch (inph->inph_af) {
- case AF_INET:
- tp = intotcpcb((struct inpcb *)inph);
- break;
-#ifdef INET6
- case AF_INET6:
- tp = in6totcpcb((struct in6pcb *)inph);
- break;
-#endif
- default:
- tp = NULL;
- break;
- }
+ TAILQ_FOREACH(inp, &tcbtable.inpt_queue, inp_queue) {
+ tp = intotcpcb(inp);
if (tp != NULL) {
/*
* If the tcpcb is already busy,
@@ -1338,40 +1271,11 @@ tcp_notify(struct inpcb *inp, int error)
}
#ifdef INET6
-void
-tcp6_notify(struct in6pcb *in6p, int error)
-{
- struct tcpcb *tp = (struct tcpcb *)in6p->in6p_ppcb;
- struct socket *so = in6p->in6p_socket;
-
- /*
- * Ignore some errors if we are hooked up.
- * If connection hasn't completed, has retransmitted several times,
- * and receives a second error, give up now. This is better
- * than waiting a long time to establish a connection that
- * can never complete.
- */
- if (tp->t_state == TCPS_ESTABLISHED &&
- (error == EHOSTUNREACH || error == ENETUNREACH ||
- error == EHOSTDOWN)) {
- return;
- } else if (TCPS_HAVEESTABLISHED(tp->t_state) == 0 &&
- tp->t_rxtshift > 3 && tp->t_softerror)
- so->so_error = error;
- else
- tp->t_softerror = error;
- cv_broadcast(&so->so_cv);
- sorwakeup(so);
- sowwakeup(so);
-}
-#endif
-
-#ifdef INET6
void *
tcp6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
{
struct tcphdr th;
- void (*notify)(struct in6pcb *, int) = tcp6_notify;
+ void (*notify)(struct inpcb *, int) = tcp_notify;
int nmatch;
struct ip6_hdr *ip6;
const struct sockaddr_in6 *sa6_src = NULL;
@@ -1487,7 +1391,6 @@ tcp_ctlinput(int cmd, const struct sockaddr *sa, void *v)
tcp_seq seq;
struct inpcb *inp;
#ifdef INET6
- struct in6pcb *in6p;
struct in6_addr src6, dst6;
#endif
@@ -1520,13 +1423,9 @@ tcp_ctlinput(int cmd, const struct sockaddr *sa, void *v)
#endif
if ((inp = in_pcblookup_connect(&tcbtable, ip->ip_dst,
th->th_dport, ip->ip_src, th->th_sport, 0)) != NULL)
-#ifdef INET6
- in6p = NULL;
-#else
;
-#endif
#ifdef INET6
- else if ((in6p = in6_pcblookup_connect(&tcbtable, &dst6,
+ else if ((inp = in6_pcblookup_connect(&tcbtable, &dst6,
th->th_dport, &src6, th->th_sport, 0, 0)) != NULL)
;
#endif
@@ -1541,17 +1440,8 @@ tcp_ctlinput(int cmd, const struct sockaddr *sa, void *v)
*/
icp = (struct icmp *)((char *)ip -
offsetof(struct icmp, icmp_ip));
- if (inp) {
- if ((tp = intotcpcb(inp)) == NULL)
- return NULL;
- }
-#ifdef INET6
- else if (in6p) {
- if ((tp = in6totcpcb(in6p)) == NULL)
- return NULL;
- }
-#endif
- else
+ tp = intotcpcb(inp);
+ if (tp == NULL)
return NULL;
seq = ntohl(th->th_seq);
if (SEQ_LT(seq, tp->snd_una) || SEQ_GT(seq, tp->snd_max))
@@ -1634,19 +1524,6 @@ tcp_quench(struct inpcb *inp)
}
}
-#ifdef INET6
-void
-tcp6_quench(struct in6pcb *in6p)
-{
- struct tcpcb *tp = in6totcpcb(in6p);
-
- if (tp) {
- tp->snd_cwnd = tp->t_segsz;
- tp->t_bytes_acked = 0;
- }
-}
-#endif
-
/*
* Path MTU Discovery handlers.
*/
@@ -1730,23 +1607,23 @@ tcp6_mtudisc_callback(struct in6_addr *faddr)
}
void
-tcp6_mtudisc(struct in6pcb *in6p, int errno)
+tcp6_mtudisc(struct inpcb *inp, int errno)
{
- struct tcpcb *tp = in6totcpcb(in6p);
+ struct tcpcb *tp = intotcpcb(inp);
struct rtentry *rt;
if (tp == NULL)
return;
- rt = in6_pcbrtentry(in6p);
+ rt = in6_pcbrtentry(inp);
if (rt != NULL) {
/*
* If this was not a host route, remove and realloc.
*/
if ((rt->rt_flags & RTF_HOST) == 0) {
- in6_pcbrtentry_unref(rt, in6p);
- in6_rtchange(in6p, errno);
- rt = in6_pcbrtentry(in6p);
+ in6_pcbrtentry_unref(rt, inp);
+ in6_rtchange(inp, errno);
+ rt = in6_pcbrtentry(inp);
if (rt == NULL)
return;
}
@@ -1763,7 +1640,7 @@ tcp6_mtudisc(struct in6pcb *in6p, int errno)
tp->snd_cwnd = TCP_INITIAL_WINDOW(tcp_init_win,
rt->rt_rmx.rmx_mtu);
}
- in6_pcbrtentry_unref(rt, in6p);
+ in6_pcbrtentry_unref(rt, inp);
}
/*
@@ -1870,25 +1747,14 @@ tcp_mss_from_peer(struct tcpcb *tp, int offer)
u_long bufsize;
int mss;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
+ KASSERT(tp->t_inpcb != NULL);
so = NULL;
rt = NULL;
- if (tp->t_inpcb) {
- so = tp->t_inpcb->inp_socket;
-#if defined(RTV_SPIPE) || defined(RTV_SSTHRESH)
- rt = in_pcbrtentry(tp->t_inpcb);
-#endif
- }
-
-#ifdef INET6
- if (tp->t_in6pcb) {
- so = tp->t_in6pcb->in6p_socket;
+ so = tp->t_inpcb->inp_socket;
#if defined(RTV_SPIPE) || defined(RTV_SSTHRESH)
- rt = in6_pcbrtentry(tp->t_in6pcb);
-#endif
- }
+ rt = in_pcbrtentry(tp->t_inpcb);
#endif
/*
@@ -1901,11 +1767,11 @@ tcp_mss_from_peer(struct tcpcb *tp, int offer)
mss = uimax(mss, 256); /* sanity */
tp->t_peermss = mss;
mss -= tcp_optlen(tp);
- if (tp->t_inpcb)
+ if (tp->t_inpcb->inp_af == AF_INET)
mss -= ip_optlen(tp->t_inpcb);
#ifdef INET6
- if (tp->t_in6pcb)
- mss -= ip6_optlen(tp->t_in6pcb);
+ if (tp->t_inpcb->inp_af == AF_INET6)
+ mss -= ip6_optlen(tp->t_inpcb);
#endif
/*
* XXX XXX What if mss goes negative or zero? This can happen if a
@@ -1949,12 +1815,7 @@ tcp_mss_from_peer(struct tcpcb *tp, int offer)
}
#endif
#if defined(RTV_SPIPE) || defined(RTV_SSTHRESH)
- if (tp->t_inpcb)
- in_pcbrtentry_unref(rt, tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- in6_pcbrtentry_unref(rt, tp->t_in6pcb);
-#endif
+ in_pcbrtentry_unref(rt, tp->t_inpcb);
#endif
}
@@ -1970,13 +1831,13 @@ tcp_established(struct tcpcb *tp)
#endif
u_long bufsize;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
+ KASSERT(tp->t_inpcb != NULL);
so = NULL;
rt = NULL;
/* This is a while() to reduce the dreadful stairstepping below */
- while (tp->t_inpcb) {
+ while (tp->t_inpcb->inp_af == AF_INET) {
so = tp->t_inpcb->inp_socket;
#if defined(RTV_RPIPE)
rt = in_pcbrtentry(tp->t_inpcb);
@@ -2005,16 +1866,15 @@ tcp_established(struct tcpcb *tp)
tp->t_msl = MIN(tp->t_msl, TCP_MAXMSL);
#ifdef INET6
- /* The !tp->t_inpcb lets the compiler know it can't be v4 *and* v6 */
- while (!tp->t_inpcb && tp->t_in6pcb) {
- so = tp->t_in6pcb->in6p_socket;
+ while (tp->t_inpcb->inp_af == AF_INET6) {
+ so = tp->t_inpcb->inp_socket;
#if defined(RTV_RPIPE)
- rt = in6_pcbrtentry(tp->t_in6pcb);
+ rt = in6_pcbrtentry(tp->t_inpcb);
#endif
if (__predict_true(tcp_msl_enable)) {
extern const struct in6_addr in6addr_loopback;
- if (IN6_ARE_ADDR_EQUAL(&tp->t_in6pcb->in6p_laddr,
+ if (IN6_ARE_ADDR_EQUAL(&tp->t_inpcb->inp_laddr6,
&in6addr_loopback)) {
tp->t_msl = tcp_msl_loop ? tcp_msl_loop : (TCPTV_MSL >> 2);
break;
@@ -2025,7 +1885,7 @@ tcp_established(struct tcpcb *tp)
tp->t_msl = tcp_msl_local ? tcp_msl_local : (TCPTV_MSL >> 1);
break;
}
- if (in6_localaddr(&tp->t_in6pcb->in6p_faddr)) {
+ if (in6_localaddr(&tp->t_inpcb->inp_faddr6)) {
tp->t_msl = tcp_msl_local ? tcp_msl_local : (TCPTV_MSL >> 1);
break;
}
@@ -2057,12 +1917,7 @@ tcp_established(struct tcpcb *tp)
(void) sbreserve(&so->so_rcv, bufsize, so);
}
#ifdef RTV_RPIPE
- if (tp->t_inpcb)
- in_pcbrtentry_unref(rt, tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- in6_pcbrtentry_unref(rt, tp->t_in6pcb);
-#endif
+ in_pcbrtentry_unref(rt, tp->t_inpcb);
#endif
}
@@ -2078,14 +1933,9 @@ tcp_rmx_rtt(struct tcpcb *tp)
struct rtentry *rt = NULL;
int rtt;
- KASSERT(!(tp->t_inpcb && tp->t_in6pcb));
+ KASSERT(tp->t_inpcb != NULL);
- if (tp->t_inpcb)
- rt = in_pcbrtentry(tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- rt = in6_pcbrtentry(tp->t_in6pcb);
-#endif
+ rt = in_pcbrtentry(tp->t_inpcb);
if (rt == NULL)
return;
@@ -2113,12 +1963,7 @@ tcp_rmx_rtt(struct tcpcb *tp)
((tp->t_srtt >> 2) + tp->t_rttvar) >> (1 + 2),
tp->t_rttmin, TCPTV_REXMTMAX);
}
- if (tp->t_inpcb)
- in_pcbrtentry_unref(rt, tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- in6_pcbrtentry_unref(rt, tp->t_in6pcb);
-#endif
+ in_pcbrtentry_unref(rt, tp->t_inpcb);
#endif
}
@@ -2131,16 +1976,16 @@ tcp_seq
tcp_new_iss(struct tcpcb *tp)
{
- if (tp->t_inpcb != NULL) {
+ if (tp->t_inpcb->inp_af == AF_INET) {
return tcp_new_iss1(&tp->t_inpcb->inp_laddr,
&tp->t_inpcb->inp_faddr, tp->t_inpcb->inp_lport,
tp->t_inpcb->inp_fport, sizeof(tp->t_inpcb->inp_laddr));
}
#ifdef INET6
- if (tp->t_in6pcb != NULL) {
- return tcp_new_iss1(&tp->t_in6pcb->in6p_laddr,
- &tp->t_in6pcb->in6p_faddr, tp->t_in6pcb->in6p_lport,
- tp->t_in6pcb->in6p_fport, sizeof(tp->t_in6pcb->in6p_laddr));
+ if (tp->t_inpcb->inp_af == AF_INET6) {
+ return tcp_new_iss1(&tp->t_inpcb->inp_laddr6,
+ &tp->t_inpcb->inp_faddr6, tp->t_inpcb->inp_lport,
+ tp->t_inpcb->inp_fport, sizeof(tp->t_inpcb->inp_laddr6));
}
#endif
@@ -2230,7 +2075,7 @@ ipsec4_hdrsiz_tcp(struct tcpcb *tp)
struct inpcb *inp;
size_t hdrsiz;
- /* XXX mapped addr case (tp->t_in6pcb) */
+ /* XXX mapped addr case (tp->t_inpcb) */
if (!tp || !tp->t_template || !(inp = tp->t_inpcb))
return 0;
switch (tp->t_family) {
@@ -2250,15 +2095,15 @@ ipsec4_hdrsiz_tcp(struct tcpcb *tp)
size_t
ipsec6_hdrsiz_tcp(struct tcpcb *tp)
{
- struct in6pcb *in6p;
+ struct inpcb *inp;
size_t hdrsiz;
- if (!tp || !tp->t_template || !(in6p = tp->t_in6pcb))
+ if (!tp || !tp->t_template || !(inp = tp->t_inpcb))
return 0;
switch (tp->t_family) {
case AF_INET6:
/* XXX: should use correct direction. */
- hdrsiz = ipsec_hdrsiz(tp->t_template, IPSEC_DIR_OUTBOUND, in6p);
+ hdrsiz = ipsec_hdrsiz(tp->t_template, IPSEC_DIR_OUTBOUND, inp);
break;
case AF_INET:
/* mapped address case - tricky */
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index 6a9dc8f87fd..41192af30e5 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_syncache.c,v 1.2 2022/09/20 10:12:18 ozaki-r Exp $ */
+/* $NetBSD: tcp_syncache.c,v 1.3 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_syncache.c,v 1.2 2022/09/20 10:12:18 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_syncache.c,v 1.3 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -558,9 +558,6 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
struct syn_cache *sc;
struct syn_cache_head *scp;
struct inpcb *inp = NULL;
-#ifdef INET6
- struct in6pcb *in6p = NULL;
-#endif
struct tcpcb *tp;
int s;
struct socket *oso;
@@ -608,20 +605,11 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
if (so == NULL)
goto resetandabort;
- switch (so->so_proto->pr_domain->dom_family) {
- case AF_INET:
- inp = sotoinpcb(so);
- break;
-#ifdef INET6
- case AF_INET6:
- in6p = sotoin6pcb(so);
- break;
-#endif
- }
+ inp = sotoinpcb(so);
switch (src->sa_family) {
case AF_INET:
- if (inp) {
+ if (inp->inp_af == AF_INET) {
inp->inp_laddr = ((struct sockaddr_in *)dst)->sin_addr;
inp->inp_lport = ((struct sockaddr_in *)dst)->sin_port;
inp->inp_options = ip_srcroute(m);
@@ -632,44 +620,44 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
}
}
#ifdef INET6
- else if (in6p) {
+ else if (inp->inp_af == AF_INET6) {
/* IPv4 packet to AF_INET6 socket */
- memset(&in6p->in6p_laddr, 0, sizeof(in6p->in6p_laddr));
- in6p->in6p_laddr.s6_addr16[5] = htons(0xffff);
+ memset(&inp->inp_laddr6, 0, sizeof(inp->inp_laddr6));
+ inp->inp_laddr6.s6_addr16[5] = htons(0xffff);
bcopy(&((struct sockaddr_in *)dst)->sin_addr,
- &in6p->in6p_laddr.s6_addr32[3],
+ &inp->inp_laddr6.s6_addr32[3],
sizeof(((struct sockaddr_in *)dst)->sin_addr));
- in6p->in6p_lport = ((struct sockaddr_in *)dst)->sin_port;
- in6totcpcb(in6p)->t_family = AF_INET;
- if (sotoin6pcb(oso)->in6p_flags & IN6P_IPV6_V6ONLY)
- in6p->in6p_flags |= IN6P_IPV6_V6ONLY;
+ inp->inp_lport = ((struct sockaddr_in *)dst)->sin_port;
+ intotcpcb(inp)->t_family = AF_INET;
+ if (sotoinpcb(oso)->inp_flags & IN6P_IPV6_V6ONLY)
+ inp->inp_flags |= IN6P_IPV6_V6ONLY;
else
- in6p->in6p_flags &= ~IN6P_IPV6_V6ONLY;
- in6_pcbstate(in6p, IN6P_BOUND);
+ inp->inp_flags &= ~IN6P_IPV6_V6ONLY;
+ in_pcbstate(inp, INP_BOUND);
}
#endif
break;
#ifdef INET6
case AF_INET6:
- if (in6p) {
- in6p->in6p_laddr = ((struct sockaddr_in6 *)dst)->sin6_addr;
- in6p->in6p_lport = ((struct sockaddr_in6 *)dst)->sin6_port;
- in6_pcbstate(in6p, IN6P_BOUND);
+ if (inp->inp_af == AF_INET6) {
+ inp->inp_laddr6 = ((struct sockaddr_in6 *)dst)->sin6_addr;
+ inp->inp_lport = ((struct sockaddr_in6 *)dst)->sin6_port;
+ in_pcbstate(inp, INP_BOUND);
}
break;
#endif
}
#ifdef INET6
- if (in6p && in6totcpcb(in6p)->t_family == AF_INET6 && sotoinpcb(oso)) {
- struct in6pcb *oin6p = sotoin6pcb(oso);
+ if (inp && intotcpcb(inp)->t_family == AF_INET6 && sotoinpcb(oso)) {
+ struct inpcb *oinp = sotoinpcb(oso);
/* inherit socket options from the listening socket */
- in6p->in6p_flags |= (oin6p->in6p_flags & IN6P_CONTROLOPTS);
- if (in6p->in6p_flags & IN6P_CONTROLOPTS) {
- m_freem(in6p->in6p_options);
- in6p->in6p_options = NULL;
+ inp->inp_flags |= (oinp->inp_flags & IN6P_CONTROLOPTS);
+ if (inp->inp_flags & IN6P_CONTROLOPTS) {
+ m_freem(inp->inp_options);
+ inp->inp_options = NULL;
}
- ip6_savecontrol(in6p, &in6p->in6p_options,
+ ip6_savecontrol(inp, &inp->inp_options,
mtod(m, struct ip6_hdr *), m);
}
#endif
@@ -677,18 +665,10 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
/*
* Give the new socket our cached route reference.
*/
- if (inp) {
- rtcache_copy(&inp->inp_route, &sc->sc_route);
- rtcache_free(&sc->sc_route);
- }
-#ifdef INET6
- else {
- rtcache_copy(&in6p->in6p_route, &sc->sc_route);
- rtcache_free(&sc->sc_route);
- }
-#endif
+ rtcache_copy(&inp->inp_route, &sc->sc_route);
+ rtcache_free(&sc->sc_route);
- if (inp) {
+ if (inp->inp_af == AF_INET) {
struct sockaddr_in sin;
memcpy(&sin, src, src->sa_len);
if (in_pcbconnect(inp, &sin, &lwp0)) {
@@ -696,14 +676,14 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
}
}
#ifdef INET6
- else if (in6p) {
+ else if (inp->inp_af == AF_INET6) {
struct sockaddr_in6 sin6;
memcpy(&sin6, src, src->sa_len);
if (src->sa_family == AF_INET) {
/* IPv4 packet to AF_INET6 socket */
in6_sin_2_v4mapsin6((struct sockaddr_in *)src, &sin6);
}
- if (in6_pcbconnect(in6p, &sin6, NULL)) {
+ if (in6_pcbconnect(inp, &sin6, NULL)) {
goto resetandabort;
}
}
@@ -712,14 +692,7 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
goto resetandabort;
}
- if (inp)
- tp = intotcpcb(inp);
-#ifdef INET6
- else if (in6p)
- tp = in6totcpcb(in6p);
-#endif
- else
- tp = NULL;
+ tp = intotcpcb(inp);
tp->t_flags = sototcpcb(oso)->t_flags & TF_NODELAY;
if (sc->sc_request_r_scale != 15) {
@@ -773,10 +746,10 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst,
tp->snd_cwnd = tp->t_peermss;
else {
int ss = tcp_init_win;
- if (inp != NULL && in_localaddr(inp->inp_faddr))
+ if (inp->inp_af == AF_INET && in_localaddr(inp->inp_faddr))
ss = tcp_init_win_local;
#ifdef INET6
- if (in6p != NULL && in6_localaddr(&in6p->in6p_faddr))
+ else if (inp->inp_af == AF_INET6 && in6_localaddr(&inp->inp_faddr6))
ss = tcp_init_win_local;
#endif
tp->snd_cwnd = TCP_INITIAL_WINDOW(ss, tp->t_peermss);
@@ -1373,7 +1346,7 @@ syn_cache_respond(struct syn_cache *sc)
rtcache_unref(rt, ro);
error = ip6_output(m, NULL /*XXX*/, ro, 0, NULL,
- tp ? tp->t_in6pcb : NULL, NULL);
+ tp ? tp->t_inpcb : NULL, NULL);
break;
#endif
default:
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 69c574aa066..f933129cd6c 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_timer.c,v 1.96 2021/03/08 17:54:43 christos Exp $ */
+/* $NetBSD: tcp_timer.c,v 1.97 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_timer.c,v 1.96 2021/03/08 17:54:43 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_timer.c,v 1.97 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -344,12 +344,7 @@ tcp_timer_rexmt(void *arg)
return;
}
#ifdef TCP_DEBUG
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
+ so = tp->t_inpcb->inp_socket;
ostate = tp->t_state;
#endif /* TCP_DEBUG */
@@ -391,14 +386,8 @@ tcp_timer_rexmt(void *arg)
if (tp->t_mtudisc && tp->t_rxtshift > TCP_MAXRXTSHIFT / 6) {
TCP_STATINC(TCP_STAT_PMTUBLACKHOLE);
- /* try turning PMTUD off */
- if (tp->t_inpcb)
- tp->t_mtudisc = 0;
-#ifdef INET6
- /* try using IPv6 minimum MTU */
- if (tp->t_in6pcb)
- tp->t_mtudisc = 0;
-#endif
+ /* try turning PMTUD off or try using IPv6 minimum MTU */
+ tp->t_mtudisc = 0;
/* XXX: more sophisticated Black hole recovery code? */
}
@@ -412,12 +401,7 @@ tcp_timer_rexmt(void *arg)
* retransmit times until then.
*/
if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) {
- if (tp->t_inpcb)
- in_losing(tp->t_inpcb);
-#ifdef INET6
- if (tp->t_in6pcb)
- in6_losing(tp->t_in6pcb);
-#endif
+ in_losing(tp->t_inpcb);
/*
* This operation is not described in RFC2988. The
* point is to keep srtt+4*rttvar constant, so we
@@ -482,13 +466,7 @@ tcp_timer_persist(void *arg)
KERNEL_LOCK(1, NULL);
#ifdef TCP_DEBUG
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
-
+ so = tp->t_inpcb->inp_socket;
ostate = tp->t_state;
#endif /* TCP_DEBUG */
@@ -563,12 +541,7 @@ tcp_timer_keep(void *arg)
TCP_STATINC(TCP_STAT_KEEPTIMEO);
if (TCPS_HAVEESTABLISHED(tp->t_state) == 0)
goto dropit;
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
+ so = tp->t_inpcb->inp_socket;
KASSERT(so != NULL);
if (so->so_options & SO_KEEPALIVE &&
tp->t_state <= TCPS_CLOSE_WAIT) {
@@ -642,13 +615,7 @@ tcp_timer_2msl(void *arg)
tp->snd_fack = tp->snd_una;
#ifdef TCP_DEBUG
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
-
+ so = tp->t_inpcb->inp_socket;
ostate = tp->t_state;
#endif /* TCP_DEBUG */
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 51b90e3143e..3abb7260c54 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_usrreq.c,v 1.232 2022/09/20 07:19:14 ozaki-r Exp $ */
+/* $NetBSD: tcp_usrreq.c,v 1.233 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.232 2022/09/20 07:19:14 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.233 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -171,42 +171,6 @@ tcp_debug_trace(struct socket *so, struct tcpcb *tp, int ostate, int req)
#endif
}
-static int
-tcp_getpcb(struct socket *so, struct inpcb **inp,
- struct in6pcb **in6p, struct tcpcb **tp)
-{
-
- KASSERT(solocked(so));
-
- /*
- * When a TCP is attached to a socket, then there will be
- * a (struct inpcb) pointed at by the socket, and this
- * structure will point at a subsidary (struct tcpcb).
- */
- switch (so->so_proto->pr_domain->dom_family) {
- case PF_INET:
- *inp = sotoinpcb(so);
- if (*inp == NULL)
- return EINVAL;
- *tp = intotcpcb(*inp);
- break;
-#ifdef INET6
- case PF_INET6:
- *in6p = sotoin6pcb(so);
- if (*in6p == NULL)
- return EINVAL;
- *tp = in6totcpcb(*in6p);
- break;
-#endif
- default:
- return EAFNOSUPPORT;
- }
-
- KASSERT(tp != NULL);
-
- return 0;
-}
-
static void
change_keepalive(struct socket *so, struct tcpcb *tp)
{
@@ -295,9 +259,6 @@ tcp_ctloutput(int op, struct socket *so, struct sockopt *sopt)
{
int error = 0, s;
struct inpcb *inp;
-#ifdef INET6
- struct in6pcb *in6p;
-#endif
struct tcpcb *tp;
struct tcp_info ti;
u_int ui;
@@ -310,32 +271,7 @@ tcp_ctloutput(int op, struct socket *so, struct sockopt *sopt)
family = so->so_proto->pr_domain->dom_family;
s = splsoftnet();
- switch (family) {
- case PF_INET:
- inp = sotoinpcb(so);
-#ifdef INET6
- in6p = NULL;
-#endif
- break;
-#ifdef INET6
- case PF_INET6:
- inp = NULL;
- in6p = sotoin6pcb(so);
- break;
-#endif
- default:
- splx(s);
- panic("%s: af %d", __func__, family);
- }
-#ifndef INET6
- if (inp == NULL)
-#else
- if (inp == NULL && in6p == NULL)
-#endif
- {
- splx(s);
- return ECONNRESET;
- }
+ inp = sotoinpcb(so);
if (level != IPPROTO_TCP) {
switch (family) {
case PF_INET:
@@ -350,14 +286,7 @@ tcp_ctloutput(int op, struct socket *so, struct sockopt *sopt)
splx(s);
return error;
}
- if (inp)
- tp = intotcpcb(inp);
-#ifdef INET6
- else if (in6p)
- tp = in6totcpcb(in6p);
-#endif
- else
- tp = NULL;
+ tp = intotcpcb(inp);
switch (op) {
case PRCO_SETOPT:
@@ -513,39 +442,18 @@ tcp_attach(struct socket *so, int proto)
{
struct tcpcb *tp;
struct inpcb *inp;
-#ifdef INET6
- struct in6pcb *in6p;
-#endif
int s, error, family;
/* Assign the lock (must happen even if we will error out). */
s = splsoftnet();
sosetlock(so);
KASSERT(solocked(so));
+ KASSERT(sotoinpcb(so) == NULL);
- family = so->so_proto->pr_domain->dom_family;
- switch (family) {
- case PF_INET:
- inp = sotoinpcb(so);
-#ifdef INET6
- in6p = NULL;
-#endif
- break;
-#ifdef INET6
- case PF_INET6:
- inp = NULL;
- in6p = sotoin6pcb(so);
- break;
-#endif
- default:
- error = EAFNOSUPPORT;
- goto out;
- }
-
+ inp = sotoinpcb(so);
KASSERT(inp == NULL);
-#ifdef INET6
- KASSERT(in6p == NULL);
-#endif
+
+ family = soaf(so);
#ifdef MBUFTRACE
so->so_mowner = &tcp_sock_mowner;
@@ -561,48 +469,17 @@ tcp_attach(struct socket *so, int proto)
so->so_rcv.sb_flags |= SB_AUTOSIZE;
so->so_snd.sb_flags |= SB_AUTOSIZE;
- switch (family) {
- case PF_INET:
- error = in_pcballoc(so, &tcbtable);
- if (error)
- goto out;
- inp = sotoinpcb(so);
-#ifdef INET6
- in6p = NULL;
-#endif
- break;
-#ifdef INET6
- case PF_INET6:
- error = in6_pcballoc(so, &tcbtable);
- if (error)
- goto out;
- inp = NULL;
- in6p = sotoin6pcb(so);
- break;
-#endif
- default:
- error = EAFNOSUPPORT;
+ error = in_pcballoc(so, &tcbtable);
+ if (error)
goto out;
- }
- if (inp)
- tp = tcp_newtcpcb(family, (void *)inp);
-#ifdef INET6
- else if (in6p)
- tp = tcp_newtcpcb(family, (void *)in6p);
-#endif
- else
- tp = NULL;
+ inp = sotoinpcb(so);
+ tp = tcp_newtcpcb(family, inp);
if (tp == NULL) {
int nofd = so->so_state & SS_NOFDREF; /* XXX */
so->so_state &= ~SS_NOFDREF; /* don't free the socket yet */
- if (inp)
- in_pcbdetach(inp);
-#ifdef INET6
- if (in6p)
- in6_pcbdetach(in6p);
-#endif
+ in_pcbdetach(inp);
so->so_state |= nofd;
error = ENOBUFS;
goto out;
@@ -620,13 +497,12 @@ out:
static void
tcp_detach(struct socket *so)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int s;
- if (tcp_getpcb(so, &inp, &in6p, &tp) != 0)
- return;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
s = splsoftnet();
(void)tcp_disconnect1(tp);
@@ -636,15 +512,13 @@ tcp_detach(struct socket *so)
static int
tcp_accept(struct socket *so, struct sockaddr *nam)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
- int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_ACCEPT);
@@ -654,12 +528,12 @@ tcp_accept(struct socket *so, struct sockaddr *nam)
* of the peer, storing through addr.
*/
s = splsoftnet();
- if (inp) {
+ if (inp->inp_af == AF_INET) {
in_setpeeraddr(inp, (struct sockaddr_in *)nam);
}
#ifdef INET6
- if (in6p) {
- in6_setpeeraddr(in6p, (struct sockaddr_in6 *)nam);
+ else if (inp->inp_af == AF_INET6) {
+ in6_setpeeraddr(inp, (struct sockaddr_in6 *)nam);
}
#endif
tcp_debug_trace(so, tp, ostate, PRU_ACCEPT);
@@ -672,18 +546,17 @@ static int
tcp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
struct sockaddr_in *sin = (struct sockaddr_in *)nam;
#ifdef INET6
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
#endif /* INET6 */
- struct tcpcb *tp = NULL;
+ struct tcpcb *tp;
int s;
int error = 0;
int ostate = 0;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_BIND);
@@ -697,10 +570,10 @@ tcp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
break;
#ifdef INET6
case PF_INET6:
- error = in6_pcbbind(in6p, sin6, l);
+ error = in6_pcbbind(inp, sin6, l);
if (!error) {
/* mapped addr case */
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6))
tp->t_family = AF_INET;
else
tp->t_family = AF_INET6;
@@ -717,15 +590,14 @@ tcp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
static int
tcp_listen(struct socket *so, struct lwp *l)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int error = 0;
int ostate = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_LISTEN);
@@ -733,14 +605,14 @@ tcp_listen(struct socket *so, struct lwp *l)
* Prepare to accept connections.
*/
s = splsoftnet();
- if (inp && inp->inp_lport == 0) {
+ if (inp->inp_af == AF_INET && inp->inp_lport == 0) {
error = in_pcbbind(inp, NULL, l);
if (error)
goto release;
}
#ifdef INET6
- if (in6p && in6p->in6p_lport == 0) {
- error = in6_pcbbind(in6p, NULL, l);
+ if (inp->inp_af == AF_INET6 && inp->inp_lport == 0) {
+ error = in6_pcbbind(inp, NULL, l);
if (error)
goto release;
}
@@ -757,15 +629,14 @@ release:
static int
tcp_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int s;
int error = 0;
int ostate = 0;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_CONNECT);
@@ -778,7 +649,7 @@ tcp_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
*/
s = splsoftnet();
- if (inp) {
+ if (inp->inp_af == AF_INET) {
if (inp->inp_lport == 0) {
error = in_pcbbind(inp, NULL, l);
if (error)
@@ -787,16 +658,16 @@ tcp_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
error = in_pcbconnect(inp, (struct sockaddr_in *)nam, l);
}
#ifdef INET6
- if (in6p) {
- if (in6p->in6p_lport == 0) {
- error = in6_pcbbind(in6p, NULL, l);
+ if (inp->inp_af == AF_INET6) {
+ if (inp->inp_lport == 0) {
+ error = in6_pcbbind(inp, NULL, l);
if (error)
goto release;
}
- error = in6_pcbconnect(in6p, (struct sockaddr_in6 *)nam, l);
+ error = in6_pcbconnect(inp, (struct sockaddr_in6 *)nam, l);
if (!error) {
/* mapped addr case */
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6))
tp->t_family = AF_INET;
else
tp->t_family = AF_INET6;
@@ -807,11 +678,11 @@ tcp_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
goto release;
tp->t_template = tcp_template(tp);
if (tp->t_template == 0) {
- if (inp)
+ if (inp->inp_af == AF_INET)
in_pcbdisconnect(inp);
#ifdef INET6
- if (in6p)
- in6_pcbdisconnect(in6p);
+ else if (inp->inp_af == AF_INET6)
+ in6_pcbdisconnect(inp);
#endif
error = ENOBUFS;
goto release;
@@ -841,16 +712,14 @@ release:
static int
tcp_connect2(struct socket *so, struct socket *so2)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
- int error = 0;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
KASSERT(solocked(so));
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_CONNECT2);
@@ -862,15 +731,14 @@ tcp_connect2(struct socket *so, struct socket *so2)
static int
tcp_disconnect(struct socket *so)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int error = 0;
int ostate = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_DISCONNECT);
@@ -896,15 +764,14 @@ tcp_disconnect(struct socket *so)
static int
tcp_shutdown(struct socket *so)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int error = 0;
int ostate = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_SHUTDOWN);
/*
@@ -924,15 +791,14 @@ tcp_shutdown(struct socket *so)
static int
tcp_abort(struct socket *so)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int error = 0;
int ostate = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_ABORT);
@@ -974,25 +840,23 @@ tcp_stat(struct socket *so, struct stat *ub)
static int
tcp_peeraddr(struct socket *so, struct sockaddr *nam)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
- int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_PEERADDR);
s = splsoftnet();
- if (inp) {
+ if (inp->inp_af == AF_INET) {
in_setpeeraddr(inp, (struct sockaddr_in *)nam);
}
#ifdef INET6
- if (in6p) {
- in6_setpeeraddr(in6p, (struct sockaddr_in6 *)nam);
+ else if (inp->inp_af == AF_INET6) {
+ in6_setpeeraddr(inp, (struct sockaddr_in6 *)nam);
}
#endif
tcp_debug_trace(so, tp, ostate, PRU_PEERADDR);
@@ -1004,25 +868,23 @@ tcp_peeraddr(struct socket *so, struct sockaddr *nam)
static int
tcp_sockaddr(struct socket *so, struct sockaddr *nam)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
- int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_SOCKADDR);
s = splsoftnet();
- if (inp) {
+ if (inp->inp_af == AF_INET) {
in_setsockaddr(inp, (struct sockaddr_in *)nam);
}
#ifdef INET6
- if (in6p) {
- in6_setsockaddr(in6p, (struct sockaddr_in6 *)nam);
+ if (inp->inp_af == AF_INET6) {
+ in6_setsockaddr(inp, (struct sockaddr_in6 *)nam);
}
#endif
tcp_debug_trace(so, tp, ostate, PRU_SOCKADDR);
@@ -1034,15 +896,13 @@ tcp_sockaddr(struct socket *so, struct sockaddr *nam)
static int
tcp_rcvd(struct socket *so, int flags, struct lwp *l)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
- int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_RCVD);
@@ -1068,15 +928,13 @@ tcp_rcvd(struct socket *so, int flags, struct lwp *l)
static int
tcp_recvoob(struct socket *so, struct mbuf *m, int flags)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
- int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_RCVOOB);
@@ -1111,15 +969,14 @@ static int
tcp_send(struct socket *so, struct mbuf *m, struct sockaddr *nam,
struct mbuf *control, struct lwp *l)
{
- struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
- struct tcpcb *tp = NULL;
+ struct inpcb *inp;
+ struct tcpcb *tp;
int ostate = 0;
int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
- return error;
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
ostate = tcp_debug_capture(tp, PRU_SEND);
@@ -1148,17 +1005,13 @@ static int
tcp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
{
struct inpcb *inp = NULL;
- struct in6pcb *in6p = NULL;
struct tcpcb *tp = NULL;
int ostate = 0;
int error = 0;
int s;
- if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) {
- m_freem(m);
- m_freem(control);
- return error;
- }
+ inp = sotoinpcb(so);
+ tp = intotcpcb(inp);
if (tp->t_template == NULL) {
/*
* XXX FreeBSD appears to open the connection
@@ -1256,14 +1109,7 @@ tcp_disconnect1(struct tcpcb *tp)
{
struct socket *so;
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- else if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
- else
- so = NULL;
+ so = tp->t_inpcb->inp_socket;
if (TCPS_HAVEESTABLISHED(tp->t_state) == 0)
tp = tcp_close(tp);
@@ -1312,15 +1158,7 @@ tcp_usrclosed(struct tcpcb *tp)
break;
}
if (tp && tp->t_state >= TCPS_FIN_WAIT_2) {
- struct socket *so;
- if (tp->t_inpcb)
- so = tp->t_inpcb->inp_socket;
-#ifdef INET6
- else if (tp->t_in6pcb)
- so = tp->t_in6pcb->in6p_socket;
-#endif
- else
- so = NULL;
+ struct socket *so = tp->t_inpcb->inp_socket;
if (so)
soisdisconnected(so);
/*
@@ -1333,11 +1171,11 @@ tcp_usrclosed(struct tcpcb *tp)
if ((tp->t_state == TCPS_FIN_WAIT_2) && (tp->t_maxidle > 0))
TCP_TIMER_ARM(tp, TCPT_2MSL, tp->t_maxidle);
else if (tp->t_state == TCPS_TIME_WAIT
- && ((tp->t_inpcb
+ && ((tp->t_inpcb->inp_af == AF_INET
&& (tcp4_vtw_enable & 1)
&& vtw_add(AF_INET, tp))
||
- (tp->t_in6pcb
+ (tp->t_inpcb->inp_af == AF_INET6
&& (tcp6_vtw_enable & 1)
&& vtw_add(AF_INET6, tp)))) {
tp = 0;
@@ -1576,24 +1414,24 @@ inet6_ident_core(struct in6_addr *raddr, u_int rport,
void *oldp, size_t *oldlenp,
struct lwp *l, int dodrop)
{
- struct in6pcb *in6p;
+ struct inpcb *inp;
struct socket *sockp;
- in6p = in6_pcblookup_connect(&tcbtable, raddr, rport, laddr, lport, 0, 0);
+ inp = in6_pcblookup_connect(&tcbtable, raddr, rport, laddr, lport, 0, 0);
- if (in6p == NULL || (sockp = in6p->in6p_socket) == NULL)
+ if (inp == NULL || (sockp = inp->inp_socket) == NULL)
return ESRCH;
if (dodrop) {
struct tcpcb *tp;
int error;
- if (in6p == NULL || (tp = in6totcpcb(in6p)) == NULL ||
- (in6p->in6p_socket->so_options & SO_ACCEPTCONN) != 0)
+ if (inp == NULL || (tp = intotcpcb(inp)) == NULL ||
+ (inp->inp_socket->so_options & SO_ACCEPTCONN) != 0)
return ESRCH;
error = kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET,
- KAUTH_REQ_NETWORK_SOCKET_DROP, in6p->in6p_socket, tp, NULL);
+ KAUTH_REQ_NETWORK_SOCKET_DROP, inp->inp_socket, tp, NULL);
if (error)
return error;
@@ -1739,10 +1577,8 @@ sysctl_inpcblist(SYSCTLFN_ARGS)
const struct inpcb *inp;
#ifdef INET6
struct sockaddr_in6 *in6;
- const struct in6pcb *in6p;
#endif
struct inpcbtable *pcbtbl = __UNCONST(rnode->sysctl_data);
- const struct inpcb_hdr *inph;
struct tcpcb *tp;
struct kinfo_pcb pcb;
char *dp;
@@ -1780,17 +1616,12 @@ sysctl_inpcblist(SYSCTLFN_ARGS)
mutex_enter(softnet_lock);
- TAILQ_FOREACH(inph, &pcbtbl->inpt_queue, inph_queue) {
- inp = (const struct inpcb *)inph;
-#ifdef INET6
- in6p = (const struct in6pcb *)inph;
-#endif
-
- if (inph->inph_af != pf)
+ TAILQ_FOREACH(inp, &pcbtbl->inpt_queue, inp_queue) {
+ if (inp->inp_af != pf)
continue;
if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET,
- KAUTH_REQ_NETWORK_SOCKET_CANSEE, inph->inph_socket, NULL,
+ KAUTH_REQ_NETWORK_SOCKET_CANSEE, inp->inp_socket, NULL,
NULL) != 0)
continue;
@@ -1845,46 +1676,46 @@ sysctl_inpcblist(SYSCTLFN_ARGS)
break;
#ifdef INET6
case PF_INET6:
- pcb.ki_family = in6p->in6p_socket->so_proto->
+ pcb.ki_family = inp->inp_socket->so_proto->
pr_domain->dom_family;
- pcb.ki_type = in6p->in6p_socket->so_proto->pr_type;
- pcb.ki_protocol = in6p->in6p_socket->so_proto->
+ pcb.ki_type = inp->inp_socket->so_proto->pr_type;
+ pcb.ki_protocol = inp->inp_socket->so_proto->
pr_protocol;
- pcb.ki_pflags = in6p->in6p_flags;
+ pcb.ki_pflags = inp->inp_flags;
- pcb.ki_sostate = in6p->in6p_socket->so_state;
- pcb.ki_prstate = in6p->in6p_state;
+ pcb.ki_sostate = inp->inp_socket->so_state;
+ pcb.ki_prstate = inp->inp_state;
if (proto == IPPROTO_TCP) {
- tp = in6totcpcb(in6p);
+ tp = intotcpcb(inp);
pcb.ki_tstate = tp->t_state;
pcb.ki_tflags = tp->t_flags;
}
COND_SET_VALUE(pcb.ki_pcbaddr,
- PTRTOUINT64(in6p), allowaddr);
+ PTRTOUINT64(inp), allowaddr);
COND_SET_VALUE(pcb.ki_ppcbaddr,
- PTRTOUINT64(in6p->in6p_ppcb), allowaddr);
+ PTRTOUINT64(inp->inp_ppcb), allowaddr);
COND_SET_VALUE(pcb.ki_sockaddr,
- PTRTOUINT64(in6p->in6p_socket), allowaddr);
+ PTRTOUINT64(inp->inp_socket), allowaddr);
- pcb.ki_rcvq = in6p->in6p_socket->so_rcv.sb_cc;
- pcb.ki_sndq = in6p->in6p_socket->so_snd.sb_cc;
+ pcb.ki_rcvq = inp->inp_socket->so_rcv.sb_cc;
+ pcb.ki_sndq = inp->inp_socket->so_snd.sb_cc;
in6 = satosin6(&pcb.ki_src);
in6->sin6_len = sizeof(*in6);
in6->sin6_family = pf;
- in6->sin6_port = in6p->in6p_lport;
- in6->sin6_flowinfo = in6p->in6p_flowinfo;
- in6->sin6_addr = in6p->in6p_laddr;
+ in6->sin6_port = inp->inp_lport;
+ in6->sin6_flowinfo = inp->inp_flowinfo;
+ in6->sin6_addr = inp->inp_laddr6;
in6->sin6_scope_id = 0; /* XXX? */
- if (pcb.ki_prstate >= IN6P_CONNECTED) {
+ if (pcb.ki_prstate >= INP_CONNECTED) {
in6 = satosin6(&pcb.ki_dst);
in6->sin6_len = sizeof(*in6);
in6->sin6_family = pf;
- in6->sin6_port = in6p->in6p_fport;
- in6->sin6_flowinfo = in6p->in6p_flowinfo;
- in6->sin6_addr = in6p->in6p_faddr;
+ in6->sin6_port = inp->inp_fport;
+ in6->sin6_flowinfo = inp->inp_flowinfo;
+ in6->sin6_addr = inp->inp_faddr6;
in6->sin6_scope_id = 0; /* XXX? */
}
break;
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 9671cc5ea44..aeb0d4b95c4 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_var.h,v 1.197 2022/09/20 07:19:14 ozaki-r Exp $ */
+/* $NetBSD: tcp_var.h,v 1.198 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -253,7 +253,6 @@ struct tcpcb {
struct mbuf *t_template; /* skeletal packet for transmit */
struct inpcb *t_inpcb; /* back pointer to internet pcb */
- struct in6pcb *t_in6pcb; /* back pointer to internet pcb */
callout_t t_delack_ch; /* delayed ACK callout */
/*
* The following fields are used as in the protocol specification.
@@ -523,16 +522,7 @@ struct tcp_opt_info {
#define TOF_SIGLEN 0x0080 /* sigature length valid (RFC2385) */
#define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb)
-#ifdef INET6
-#define in6totcpcb(ip) ((struct tcpcb *)(ip)->in6p_ppcb)
-#endif
-#ifndef INET6
#define sototcpcb(so) (intotcpcb(sotoinpcb(so)))
-#else
-#define sototcpcb(so) (((so)->so_proto->pr_domain->dom_family == AF_INET) \
- ? intotcpcb(sotoinpcb(so)) \
- : in6totcpcb(sotoin6pcb(so)))
-#endif
/*
* See RFC2988 for a discussion of RTO calculation; comments assume
@@ -830,19 +820,13 @@ u_long tcp_mss_to_advertise(const struct ifnet *, int);
void tcp_mss_from_peer(struct tcpcb *, int);
void tcp_tcpcb_template(void);
struct tcpcb *
- tcp_newtcpcb(int, void *);
+ tcp_newtcpcb(int, struct inpcb *);
void tcp_notify(struct inpcb *, int);
-#ifdef INET6
-void tcp6_notify(struct in6pcb *, int);
-#endif
u_int tcp_optlen(struct tcpcb *);
int tcp_output(struct tcpcb *);
void tcp_pulloutofband(struct socket *,
struct tcphdr *, struct mbuf *, int);
void tcp_quench(struct inpcb *);
-#ifdef INET6
-void tcp6_quench(struct in6pcb *);
-#endif
void tcp_mtudisc(struct inpcb *, int);
#ifdef INET6
void tcp6_mtudisc_callback(struct in6_addr *);
diff --git a/sys/netinet/tcp_vtw.c b/sys/netinet/tcp_vtw.c
index b5490210f5a..a43e9985906 100644
--- a/sys/netinet/tcp_vtw.c
+++ b/sys/netinet/tcp_vtw.c
@@ -121,7 +121,7 @@
#include <netinet/tcp_vtw.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_vtw.c,v 1.21 2021/08/13 20:47:55 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_vtw.c,v 1.22 2022/10/28 05:18:39 ozaki-r Exp $");
#define db_trace(__a, __b) do { } while (/*CONSTCOND*/0)
@@ -1969,21 +1969,21 @@ vtw_add(int af, struct tcpcb *tp)
}
case AF_INET6: {
- struct in6pcb *inp = tp->t_in6pcb;
+ struct inpcb *inp = tp->t_inpcb;
vtw_v6_t *v6 = (void*)vtw;
- v6->faddr = inp->in6p_faddr;
- v6->laddr = inp->in6p_laddr;
- v6->fport = inp->in6p_fport;
- v6->lport = inp->in6p_lport;
+ v6->faddr = inp->inp_faddr6;
+ v6->laddr = inp->inp_laddr6;
+ v6->fport = inp->inp_fport;
+ v6->lport = inp->inp_lport;
- vtw->reuse_port = !!(inp->in6p_socket->so_options
+ vtw->reuse_port = !!(inp->inp_socket->so_options
& SO_REUSEPORT);
- vtw->reuse_addr = !!(inp->in6p_socket->so_options
+ vtw->reuse_addr = !!(inp->inp_socket->so_options
& SO_REUSEADDR);
- vtw->v6only = !!(inp->in6p_flags
+ vtw->v6only = !!(inp->inp_flags
& IN6P_IPV6_V6ONLY);
- vtw->uid = inp->in6p_socket->so_uidinfo->ui_uid;
+ vtw->uid = inp->inp_socket->so_uidinfo->ui_uid;
vtw_inshash_v6(ctl, vtw);
#ifdef VTW_DEBUG
@@ -1992,14 +1992,14 @@ vtw_add(int af, struct tcpcb *tp)
*/
if (enable & 4) {
KASSERT(vtw_lookup_hash_v6(ctl
- , &inp->in6p_faddr, inp->in6p_fport
- , &inp->in6p_laddr, inp->in6p_lport
+ , &inp->inp_faddr6, inp->inp_fport
+ , &inp->inp_laddr6, inp->inp_lport
, 0)
== vtw);
KASSERT(vtw_lookup_hash_v6
(ctl
- , &inp->in6p_faddr, inp->in6p_fport
- , &inp->in6p_laddr, inp->in6p_lport
+ , &inp->inp_faddr6, inp->inp_fport
+ , &inp->inp_laddr6, inp->inp_lport
, 1));
}
/* Immediate port iterator functionality check: not wild
@@ -2009,8 +2009,8 @@ vtw_add(int af, struct tcpcb *tp)
struct vestigial_inpcb res;
int cnt = 0;
- it = tcp_init_ports_v6(&inp->in6p_laddr
- , inp->in6p_lport, 0);
+ it = tcp_init_ports_v6(&inp->inp_laddr6
+ , inp->inp_lport, 0);
while (tcp_next_port_v6(it, &res)) {
++cnt;
@@ -2026,7 +2026,7 @@ vtw_add(int af, struct tcpcb *tp)
int cnt = 0;
it = tcp_init_ports_v6(&any
- , inp->in6p_lport, 1);
+ , inp->inp_lport, 1);
while (tcp_next_port_v6(it, &res)) {
++cnt;
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index d7f265b7bf7..77e26544579 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: udp_usrreq.c,v 1.261 2021/02/19 14:51:59 christos Exp $ */
+/* $NetBSD: udp_usrreq.c,v 1.262 2022/10/28 05:18:39 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.261 2021/02/19 14:51:59 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.262 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -488,7 +488,6 @@ udp4_realinput(struct sockaddr_in *src, struct sockaddr_in *dst,
u_int16_t *sport, *dport;
int rcvcnt;
struct in_addr *src4, *dst4;
- struct inpcb_hdr *inph;
struct inpcb *inp;
struct mbuf *m = *mp;
@@ -528,8 +527,7 @@ udp4_realinput(struct sockaddr_in *src, struct sockaddr_in *dst,
/*
* Locate pcb(s) for datagram.
*/
- TAILQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {
- inp = (struct inpcb *)inph;
+ TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
if (inp->inp_af != AF_INET)
continue;
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index eec4a88aef4..b747ccb2bdc 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1,4 +1,4 @@
-/* $NetBSD: icmp6.c,v 1.252 2022/08/29 09:14:02 knakahara Exp $ */
+/* $NetBSD: icmp6.c,v 1.253 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.252 2022/08/29 09:14:02 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.253 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -90,6 +90,7 @@ __KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.252 2022/08/29 09:14:02 knakahara Exp $"
#include <net/nd.h>
#include <netinet/in.h>
+#include <netinet/in_pcb.h>
#include <netinet/in_var.h>
#include <netinet/ip6.h>
#include <netinet/wqinput.h>
@@ -1939,9 +1940,8 @@ icmp6_rip6_input(struct mbuf **mp, int off)
{
struct mbuf *m = *mp;
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
- struct inpcb_hdr *inph;
- struct in6pcb *in6p;
- struct in6pcb *last = NULL;
+ struct inpcb *inp;
+ struct inpcb *last = NULL;
struct sockaddr_in6 rip6src;
struct icmp6_hdr *icmp6;
struct mbuf *n, *opts = NULL;
@@ -1962,21 +1962,20 @@ icmp6_rip6_input(struct mbuf **mp, int off)
return IPPROTO_DONE;
}
- TAILQ_FOREACH(inph, &raw6cbtable.inpt_queue, inph_queue) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ TAILQ_FOREACH(inp, &raw6cbtable.inpt_queue, inp_queue) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (in6p->in6p_ip6.ip6_nxt != IPPROTO_ICMPV6)
+ if (inp->inp_ip6.ip6_nxt != IPPROTO_ICMPV6)
continue;
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
- !IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &ip6->ip6_dst))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) &&
+ !IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, &ip6->ip6_dst))
continue;
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) &&
- !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6) &&
+ !IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, &ip6->ip6_src))
continue;
- if (in6p->in6p_icmp6filt &&
+ if (inp->inp_icmp6filt &&
ICMP6_FILTER_WILLBLOCK(icmp6->icmp6_type,
- in6p->in6p_icmp6filt))
+ inp->inp_icmp6filt))
continue;
if (last == NULL) {
@@ -1988,23 +1987,23 @@ icmp6_rip6_input(struct mbuf **mp, int off)
}
#endif
else if ((n = m_copypacket(m, M_DONTWAIT)) != NULL) {
- if (last->in6p_flags & IN6P_CONTROLOPTS)
+ if (last->inp_flags & IN6P_CONTROLOPTS)
ip6_savecontrol(last, &opts, ip6, n);
/* strip intermediate headers */
m_adj(n, off);
- if (sbappendaddr(&last->in6p_socket->so_rcv,
+ if (sbappendaddr(&last->inp_socket->so_rcv,
sin6tosa(&rip6src), n, opts) == 0) {
- soroverflow(last->in6p_socket);
+ soroverflow(last->inp_socket);
m_freem(n);
if (opts)
m_freem(opts);
} else {
- sorwakeup(last->in6p_socket);
+ sorwakeup(last->inp_socket);
}
opts = NULL;
}
- last = in6p;
+ last = inp;
}
#ifdef IPSEC
@@ -2015,18 +2014,18 @@ icmp6_rip6_input(struct mbuf **mp, int off)
} else
#endif
if (last) {
- if (last->in6p_flags & IN6P_CONTROLOPTS)
+ if (last->inp_flags & IN6P_CONTROLOPTS)
ip6_savecontrol(last, &opts, ip6, m);
/* strip intermediate headers */
m_adj(m, off);
- if (sbappendaddr(&last->in6p_socket->so_rcv,
+ if (sbappendaddr(&last->inp_socket->so_rcv,
sin6tosa(&rip6src), m, opts) == 0) {
- soroverflow(last->in6p_socket);
+ soroverflow(last->inp_socket);
m_freem(m);
if (opts)
m_freem(opts);
} else {
- sorwakeup(last->in6p_socket);
+ sorwakeup(last->inp_socket);
}
} else {
m_freem(m);
@@ -2741,7 +2740,7 @@ int
icmp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
{
int error = 0;
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
if (sopt->sopt_level != IPPROTO_ICMPV6)
return rip6_ctloutput(op, so, sopt);
@@ -2756,7 +2755,7 @@ icmp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
error = sockopt_get(sopt, &fil, sizeof(fil));
if (error)
break;
- memcpy(in6p->in6p_icmp6filt, &fil,
+ memcpy(inp->inp_icmp6filt, &fil,
sizeof(struct icmp6_filter));
error = 0;
break;
@@ -2772,11 +2771,11 @@ icmp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
switch (sopt->sopt_name) {
case ICMP6_FILTER:
{
- if (in6p->in6p_icmp6filt == NULL) {
+ if (inp->inp_icmp6filt == NULL) {
error = EINVAL;
break;
}
- error = sockopt_set(sopt, in6p->in6p_icmp6filt,
+ error = sockopt_set(sopt, inp->inp_icmp6filt,
sizeof(struct icmp6_filter));
break;
}
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index 53fbd5903d5..4e29badc167 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: in6_pcb.c,v 1.171 2022/10/14 19:39:32 ryo Exp $ */
+/* $NetBSD: in6_pcb.c,v 1.172 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.171 2022/10/14 19:39:32 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.172 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -129,76 +129,19 @@ int ip6_anonportmax = IPV6PORT_ANONMAX;
int ip6_lowportmin = IPV6PORT_RESERVEDMIN;
int ip6_lowportmax = IPV6PORT_RESERVEDMAX;
-static struct pool in6pcb_pool;
-
-static int
-in6pcb_poolinit(void)
-{
-
- pool_init(&in6pcb_pool, sizeof(struct in6pcb), 0, 0, 0, "in6pcbpl",
- NULL, IPL_SOFTNET);
- return 0;
-}
-
void
in6_pcbinit(struct inpcbtable *table, int bindhashsize, int connecthashsize)
{
- static ONCE_DECL(control);
in_pcbinit(table, bindhashsize, connecthashsize);
table->inpt_lastport = (u_int16_t)ip6_anonportmax;
-
- RUN_ONCE(&control, in6pcb_poolinit);
-}
-
-int
-in6_pcballoc(struct socket *so, void *v)
-{
- struct inpcbtable *table = v;
- struct in6pcb *in6p;
- int s;
-
- KASSERT(so->so_proto->pr_domain->dom_family == AF_INET6);
-
- in6p = pool_get(&in6pcb_pool, PR_NOWAIT);
- if (in6p == NULL)
- return (ENOBUFS);
- memset((void *)in6p, 0, sizeof(*in6p));
- in6p->in6p_af = AF_INET6;
- in6p->in6p_table = table;
- in6p->in6p_socket = so;
- in6p->in6p_hops = -1; /* use kernel default */
- in6p->in6p_icmp6filt = NULL;
- in6p->in6p_portalgo = PORTALGO_DEFAULT;
- in6p->in6p_bindportonsend = false;
-#if defined(IPSEC)
- if (ipsec_enabled) {
- int error = ipsec_init_pcbpolicy(so, &in6p->in6p_sp);
- if (error != 0) {
- pool_put(&in6pcb_pool, in6p);
- return error;
- }
- in6p->in6p_sp->sp_inph = (struct inpcb_hdr *)in6p;
- }
-#endif /* IPSEC */
- s = splsoftnet();
- TAILQ_INSERT_HEAD(&table->inpt_queue, (struct inpcb_hdr*)in6p,
- inph_queue);
- LIST_INSERT_HEAD(IN6PCBHASH_PORT(table, in6p->in6p_lport),
- &in6p->in6p_head, inph_lhash);
- in6_pcbstate(in6p, IN6P_ATTACHED);
- splx(s);
- if (ip6_v6only)
- in6p->in6p_flags |= IN6P_IPV6_V6ONLY;
- so->so_pcb = (void *)in6p;
- return (0);
}
/*
- * Bind address from sin6 to in6p.
+ * Bind address from sin6 to inp.
*/
static int
-in6_pcbbind_addr(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
+in6_pcbbind_addr(struct inpcb *inp, struct sockaddr_in6 *sin6, struct lwp *l)
{
int error;
int s;
@@ -220,7 +163,7 @@ in6_pcbbind_addr(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
s = pserialize_read_enter();
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0) {
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0) {
error = EINVAL;
goto out;
}
@@ -236,7 +179,7 @@ in6_pcbbind_addr(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
struct ifaddr *ifa;
ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
if (ifa == NULL &&
- (in6p->in6p_flags & IN6P_BINDANY) == 0) {
+ (inp->inp_flags & IN6P_BINDANY) == 0) {
error = EADDRNOTAVAIL;
goto out;
}
@@ -247,10 +190,10 @@ in6_pcbbind_addr(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
} else if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
struct ifaddr *ifa = NULL;
- if ((in6p->in6p_flags & IN6P_FAITH) == 0) {
+ if ((inp->inp_flags & IN6P_FAITH) == 0) {
ifa = ifa_ifwithaddr(sin6tosa(sin6));
if (ifa == NULL &&
- (in6p->in6p_flags & IN6P_BINDANY) == 0) {
+ (inp->inp_flags & IN6P_BINDANY) == 0) {
error = EADDRNOTAVAIL;
goto out;
}
@@ -276,7 +219,7 @@ in6_pcbbind_addr(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
goto out;
}
}
- in6p->in6p_laddr = sin6->sin6_addr;
+ inp->inp_laddr6 = sin6->sin6_addr;
error = 0;
out:
pserialize_read_exit(s);
@@ -284,13 +227,13 @@ out:
}
/*
- * Bind port from sin6 to in6p.
+ * Bind port from sin6 to inp.
*/
static int
-in6_pcbbind_port(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
+in6_pcbbind_port(struct inpcb *inp, struct sockaddr_in6 *sin6, struct lwp *l)
{
- struct inpcbtable *table = in6p->in6p_table;
- struct socket *so = in6p->in6p_socket;
+ struct inpcbtable *table = inp->inp_table;
+ struct socket *so = inp->inp_socket;
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
int error;
@@ -348,12 +291,12 @@ in6_pcbbind_port(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
}
{
- struct in6pcb *t;
+ struct inpcb *t;
struct vestigial_inpcb vestige;
t = in6_pcblookup_port(table, &sin6->sin6_addr,
sin6->sin6_port, wild, &vestige);
- if (t && (reuseport & t->in6p_socket->so_options) == 0)
+ if (t && (reuseport & t->inp_socket->so_options) == 0)
return (EADDRINUSE);
if (!t
&& vestige.valid
@@ -364,17 +307,17 @@ in6_pcbbind_port(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
if (sin6->sin6_port == 0) {
int e;
- e = in6_pcbsetport(sin6, in6p, l);
+ e = in6_pcbsetport(sin6, inp, l);
if (e != 0)
return (e);
} else {
- in6p->in6p_lport = sin6->sin6_port;
- in6_pcbstate(in6p, IN6P_BOUND);
+ inp->inp_lport = sin6->sin6_port;
+ in_pcbstate(inp, INP_BOUND);
}
- LIST_REMOVE(&in6p->in6p_head, inph_lhash);
- LIST_INSERT_HEAD(IN6PCBHASH_PORT(table, in6p->in6p_lport),
- &in6p->in6p_head, inph_lhash);
+ LIST_REMOVE(inp, inp_lhash);
+ LIST_INSERT_HEAD(IN6PCBHASH_PORT(table, inp->inp_lport),
+ inp, inp_lhash);
return (0);
}
@@ -382,20 +325,20 @@ in6_pcbbind_port(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
int
in6_pcbbind(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
{
- struct in6pcb *in6p = v;
+ struct inpcb *inp = v;
struct sockaddr_in6 lsin6;
int error;
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return (EINVAL);
/*
* If we already have a local port or a local address it means we're
* bounded.
*/
- if (in6p->in6p_lport || !(IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) ||
- (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr) &&
- in6p->in6p_laddr.s6_addr32[3] == 0)))
+ if (inp->inp_lport || !(IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) ||
+ (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6) &&
+ inp->inp_laddr6.s6_addr32[3] == 0)))
return (EINVAL);
if (NULL != sin6) {
@@ -405,30 +348,30 @@ in6_pcbbind(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
} else {
/* We always bind to *something*, even if it's "anything". */
lsin6 = *((const struct sockaddr_in6 *)
- in6p->in6p_socket->so_proto->pr_domain->dom_sa_any);
+ inp->inp_socket->so_proto->pr_domain->dom_sa_any);
sin6 = &lsin6;
}
/* Bind address. */
- error = in6_pcbbind_addr(in6p, sin6, l);
+ error = in6_pcbbind_addr(inp, sin6, l);
if (error)
return (error);
/* Bind port. */
- error = in6_pcbbind_port(in6p, sin6, l);
+ error = in6_pcbbind_port(inp, sin6, l);
if (error) {
/*
* Reset the address here to "any" so we don't "leak" the
- * in6pcb.
+ * inpcb.
*/
- in6p->in6p_laddr = in6addr_any;
+ inp->inp_laddr6 = in6addr_any;
return (error);
}
#if 0
- in6p->in6p_flowinfo = 0; /* XXX */
+ inp->inp_flowinfo = 0; /* XXX */
#endif
return (0);
}
@@ -442,7 +385,7 @@ in6_pcbbind(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
int
in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
{
- struct in6pcb *in6p = v;
+ struct inpcb *inp = v;
struct in6_addr *in6a = NULL;
struct in6_addr ia6;
struct ifnet *ifp = NULL; /* outgoing interface */
@@ -458,7 +401,7 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
(void)&in6a; /* XXX fool gcc */
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return (EINVAL);
if (sin6->sin6_len != sizeof(*sin6))
@@ -469,7 +412,7 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
return (EADDRNOTAVAIL);
if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr) &&
- in6p->in6p_socket->so_type == SOCK_STREAM)
+ inp->inp_socket->so_type == SOCK_STREAM)
return EADDRNOTAVAIL;
if (sin6->sin6_scope_id == 0 && !ip6_use_defzone)
@@ -479,15 +422,15 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
/* sanity check for mapped address case */
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
return EINVAL;
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr))
- in6p->in6p_laddr.s6_addr16[5] = htons(0xffff);
- if (!IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6))
+ inp->inp_laddr6.s6_addr16[5] = htons(0xffff);
+ if (!IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6))
return EINVAL;
} else
{
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6))
return EINVAL;
}
@@ -497,8 +440,8 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
bound = curlwp_bind();
/* Source address selection. */
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr) &&
- in6p->in6p_laddr.s6_addr32[3] == 0) {
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6) &&
+ inp->inp_laddr6.s6_addr32[3] == 0) {
#ifdef INET
struct sockaddr_in sin;
struct in_ifaddr *ia4;
@@ -509,8 +452,8 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
sin.sin_family = AF_INET;
memcpy(&sin.sin_addr, &sin6->sin6_addr.s6_addr32[3],
sizeof(sin.sin_addr));
- ia4 = in_selectsrc(&sin, &in6p->in6p_route,
- in6p->in6p_socket->so_options, NULL, &error, &_psref);
+ ia4 = in_selectsrc(&sin, &inp->inp_route,
+ inp->inp_socket->so_options, NULL, &error, &_psref);
if (ia4 == NULL) {
if (error == 0)
error = EADDRNOTAVAIL;
@@ -533,8 +476,8 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
* with the address specified by setsockopt(IPV6_PKTINFO).
* Is it the intended behavior?
*/
- error = in6_selectsrc(sin6, in6p->in6p_outputopts,
- in6p->in6p_moptions, &in6p->in6p_route, &in6p->in6p_laddr,
+ error = in6_selectsrc(sin6, inp->inp_outputopts6,
+ inp->inp_moptions6, &inp->inp_route, &inp->inp_laddr6,
&ifp, &psref, &ia6);
if (error == 0)
in6a = &ia6;
@@ -555,127 +498,89 @@ in6_pcbconnect(void *v, struct sockaddr_in6 *sin6, struct lwp *l)
}
if (ifp != NULL) {
- in6p->in6p_ip6.ip6_hlim = (u_int8_t)in6_selecthlim(in6p, ifp);
+ inp->inp_ip6.ip6_hlim = (u_int8_t)in6_selecthlim(inp, ifp);
if_put(ifp, &psref);
} else
- in6p->in6p_ip6.ip6_hlim = (u_int8_t)in6_selecthlim_rt(in6p);
+ inp->inp_ip6.ip6_hlim = (u_int8_t)in6_selecthlim_rt(inp);
curlwp_bindx(bound);
- if (in6_pcblookup_connect(in6p->in6p_table, &sin6->sin6_addr,
+ if (in6_pcblookup_connect(inp->inp_table, &sin6->sin6_addr,
sin6->sin6_port,
- IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) ? in6a : &in6p->in6p_laddr,
- in6p->in6p_lport, 0, &vestige)
+ IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) ? in6a : &inp->inp_laddr6,
+ inp->inp_lport, 0, &vestige)
|| vestige.valid)
return (EADDRINUSE);
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) ||
- (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr) &&
- in6p->in6p_laddr.s6_addr32[3] == 0))
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) ||
+ (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6) &&
+ inp->inp_laddr6.s6_addr32[3] == 0))
{
- if (in6p->in6p_lport == 0) {
- error = in6_pcbbind(in6p, NULL, l);
+ if (inp->inp_lport == 0) {
+ error = in6_pcbbind(inp, NULL, l);
if (error != 0)
return error;
}
- in6p->in6p_laddr = *in6a;
+ inp->inp_laddr6 = *in6a;
}
- in6p->in6p_faddr = sin6->sin6_addr;
- in6p->in6p_fport = sin6->sin6_port;
+ inp->inp_faddr6 = sin6->sin6_addr;
+ inp->inp_fport = sin6->sin6_port;
/* Late bind, if needed */
- if (in6p->in6p_bindportonsend) {
+ if (inp->inp_bindportonsend) {
struct sockaddr_in6 lsin = *((const struct sockaddr_in6 *)
- in6p->in6p_socket->so_proto->pr_domain->dom_sa_any);
- lsin.sin6_addr = in6p->in6p_laddr;
+ inp->inp_socket->so_proto->pr_domain->dom_sa_any);
+ lsin.sin6_addr = inp->inp_laddr6;
lsin.sin6_port = 0;
- if ((error = in6_pcbbind_port(in6p, &lsin, l)) != 0)
+ if ((error = in6_pcbbind_port(inp, &lsin, l)) != 0)
return error;
}
- in6_pcbstate(in6p, IN6P_CONNECTED);
- in6p->in6p_flowinfo &= ~IPV6_FLOWLABEL_MASK;
+ in_pcbstate(inp, INP_CONNECTED);
+ inp->inp_flowinfo &= ~IPV6_FLOWLABEL_MASK;
if (ip6_auto_flowlabel)
- in6p->in6p_flowinfo |=
+ inp->inp_flowinfo |=
(htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK);
#if defined(IPSEC)
- if (ipsec_enabled && in6p->in6p_socket->so_type == SOCK_STREAM)
- ipsec_pcbconn(in6p->in6p_sp);
+ if (ipsec_enabled && inp->inp_socket->so_type == SOCK_STREAM)
+ ipsec_pcbconn(inp->inp_sp);
#endif
return (0);
}
void
-in6_pcbdisconnect(struct in6pcb *in6p)
+in6_pcbdisconnect(struct inpcb *inp)
{
- memset((void *)&in6p->in6p_faddr, 0, sizeof(in6p->in6p_faddr));
- in6p->in6p_fport = 0;
- in6_pcbstate(in6p, IN6P_BOUND);
- in6p->in6p_flowinfo &= ~IPV6_FLOWLABEL_MASK;
+ memset((void *)&inp->inp_faddr6, 0, sizeof(inp->inp_faddr6));
+ inp->inp_fport = 0;
+ in_pcbstate(inp, INP_BOUND);
+ inp->inp_flowinfo &= ~IPV6_FLOWLABEL_MASK;
#if defined(IPSEC)
if (ipsec_enabled)
- ipsec_pcbdisconn(in6p->in6p_sp);
+ ipsec_pcbdisconn(inp->inp_sp);
#endif
- if (in6p->in6p_socket->so_state & SS_NOFDREF)
- in6_pcbdetach(in6p);
+ if (inp->inp_socket->so_state & SS_NOFDREF)
+ in_pcbdetach(inp);
}
void
-in6_pcbdetach(struct in6pcb *in6p)
+in6_setsockaddr(struct inpcb *inp, struct sockaddr_in6 *sin6)
{
- struct socket *so = in6p->in6p_socket;
- int s;
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return;
-#if defined(IPSEC)
- if (ipsec_enabled)
- ipsec_delete_pcbpolicy(in6p);
-#endif
- so->so_pcb = NULL;
-
- s = splsoftnet();
- in6_pcbstate(in6p, IN6P_ATTACHED);
- LIST_REMOVE(&in6p->in6p_head, inph_lhash);
- TAILQ_REMOVE(&in6p->in6p_table->inpt_queue, &in6p->in6p_head,
- inph_queue);
- splx(s);
-
- if (in6p->in6p_options) {
- m_freem(in6p->in6p_options);
- }
- if (in6p->in6p_outputopts != NULL) {
- ip6_clearpktopts(in6p->in6p_outputopts, -1);
- free(in6p->in6p_outputopts, M_IP6OPT);
- }
- rtcache_free(&in6p->in6p_route);
- ip6_freemoptions(in6p->in6p_moptions);
- ip_freemoptions(in6p->in6p_v4moptions);
- sofree(so); /* drops the socket's lock */
-
- pool_put(&in6pcb_pool, in6p);
- mutex_enter(softnet_lock); /* reacquire it */
-}
-
-void
-in6_setsockaddr(struct in6pcb *in6p, struct sockaddr_in6 *sin6)
-{
-
- if (in6p->in6p_af != AF_INET6)
- return;
-
- sockaddr_in6_init(sin6, &in6p->in6p_laddr, in6p->in6p_lport, 0, 0);
+ sockaddr_in6_init(sin6, &inp->inp_laddr6, inp->inp_lport, 0, 0);
(void)sa6_recoverscope(sin6); /* XXX: should catch errors */
}
void
-in6_setpeeraddr(struct in6pcb *in6p, struct sockaddr_in6 *sin6)
+in6_setpeeraddr(struct inpcb *inp, struct sockaddr_in6 *sin6)
{
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return;
- sockaddr_in6_init(sin6, &in6p->in6p_faddr, in6p->in6p_fport, 0, 0);
+ sockaddr_in6_init(sin6, &inp->inp_faddr6, inp->inp_fport, 0, 0);
(void)sa6_recoverscope(sin6); /* XXX: should catch errors */
}
@@ -696,9 +601,9 @@ in6_setpeeraddr(struct in6pcb *in6p, struct sockaddr_in6 *sin6)
int
in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
u_int fport_arg, const struct sockaddr *src, u_int lport_arg, int cmd,
- void *cmdarg, void (*notify)(struct in6pcb *, int))
+ void *cmdarg, void (*notify)(struct inpcb *, int))
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
struct sockaddr_in6 sa6_src;
const struct sockaddr_in6 *sa6_dst;
u_int16_t fport = fport_arg, lport = lport_arg;
@@ -737,11 +642,10 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
}
errno = inet6ctlerrmap[cmd];
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct in6pcb *in6p = (struct in6pcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
struct rtentry *rt = NULL;
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
continue;
/*
@@ -776,22 +680,22 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
* icmp6_mtudisc_update().
*/
if ((PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) &&
- IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
- (rt = rtcache_validate(&in6p->in6p_route)) != NULL &&
+ IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) &&
+ (rt = rtcache_validate(&inp->inp_route)) != NULL &&
!(rt->rt_flags & RTF_HOST)) {
const struct sockaddr_in6 *dst6;
dst6 = (const struct sockaddr_in6 *)
- rtcache_getdst(&in6p->in6p_route);
+ rtcache_getdst(&inp->inp_route);
if (dst6 == NULL)
;
else if (IN6_ARE_ADDR_EQUAL(&dst6->sin6_addr,
&sa6_dst->sin6_addr)) {
- rtcache_unref(rt, &in6p->in6p_route);
+ rtcache_unref(rt, &inp->inp_route);
goto do_notify;
}
}
- rtcache_unref(rt, &in6p->in6p_route);
+ rtcache_unref(rt, &inp->inp_route);
/*
* If the error designates a new path MTU for a destination
@@ -802,10 +706,10 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
* sockets disconnected.
* XXX: should we avoid to notify the value to TCP sockets?
*/
- if (cmd == PRC_MSGSIZE && (in6p->in6p_flags & IN6P_MTU) != 0 &&
- (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) ||
- IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &sa6_dst->sin6_addr))) {
- ip6_notify_pmtu(in6p, (const struct sockaddr_in6 *)dst,
+ if (cmd == PRC_MSGSIZE && (inp->inp_flags & IN6P_MTU) != 0 &&
+ (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6) ||
+ IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, &sa6_dst->sin6_addr))) {
+ ip6_notify_pmtu(inp, (const struct sockaddr_in6 *)dst,
(u_int32_t *)cmdarg);
}
@@ -818,23 +722,23 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
* as usual.
*/
if (lport == 0 && fport == 0 && flowinfo &&
- in6p->in6p_socket != NULL &&
- flowinfo == (in6p->in6p_flowinfo & IPV6_FLOWLABEL_MASK) &&
- IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &sa6_src.sin6_addr))
+ inp->inp_socket != NULL &&
+ flowinfo == (inp->inp_flowinfo & IPV6_FLOWLABEL_MASK) &&
+ IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, &sa6_src.sin6_addr))
goto do_notify;
- else if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr,
+ else if (!IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6,
&sa6_dst->sin6_addr) ||
- in6p->in6p_socket == NULL ||
- (lport && in6p->in6p_lport != lport) ||
+ inp->inp_socket == NULL ||
+ (lport && inp->inp_lport != lport) ||
(!IN6_IS_ADDR_UNSPECIFIED(&sa6_src.sin6_addr) &&
- !IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr,
+ !IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6,
&sa6_src.sin6_addr)) ||
- (fport && in6p->in6p_fport != fport))
+ (fport && inp->inp_fport != fport))
continue;
do_notify:
if (notify)
- (*notify)(in6p, errno);
+ (*notify)(inp, errno);
nmatch++;
}
return nmatch;
@@ -843,24 +747,23 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr *dst,
void
in6_pcbpurgeif0(struct inpcbtable *table, struct ifnet *ifp)
{
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
struct ip6_moptions *im6o;
struct in6_multi_mship *imm, *nimm;
KASSERT(ifp != NULL);
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct in6pcb *in6p = (struct in6pcb *)inph;
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
bool need_unlock = false;
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
continue;
- /* The caller holds either one of in6ps' lock */
- if (!in6p_locked(in6p)) {
- in6p_lock(in6p);
+ /* The caller holds either one of inps' lock */
+ if (!inp_locked(inp)) {
+ inp_lock(inp);
need_unlock = true;
}
- im6o = in6p->in6p_moptions;
+ im6o = inp->inp_moptions6;
if (im6o) {
/*
* Unselect the outgoing interface if it is being
@@ -884,10 +787,10 @@ in6_pcbpurgeif0(struct inpcbtable *table, struct ifnet *ifp)
}
}
- in_purgeifmcast(in6p->in6p_v4moptions, ifp);
+ in_purgeifmcast(inp->inp_moptions, ifp);
if (need_unlock)
- in6p_unlock(in6p);
+ inp_unlock(inp);
}
}
@@ -895,88 +798,43 @@ void
in6_pcbpurgeif(struct inpcbtable *table, struct ifnet *ifp)
{
struct rtentry *rt;
- struct inpcb_hdr *inph;
+ struct inpcb *inp;
- TAILQ_FOREACH(inph, &table->inpt_queue, inph_queue) {
- struct in6pcb *in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
+ if (inp->inp_af != AF_INET6)
continue;
- if ((rt = rtcache_validate(&in6p->in6p_route)) != NULL &&
+ if ((rt = rtcache_validate(&inp->inp_route)) != NULL &&
rt->rt_ifp == ifp) {
- rtcache_unref(rt, &in6p->in6p_route);
- in6_rtchange(in6p, 0);
+ rtcache_unref(rt, &inp->inp_route);
+ in6_rtchange(inp, 0);
} else
- rtcache_unref(rt, &in6p->in6p_route);
+ rtcache_unref(rt, &inp->inp_route);
}
}
/*
- * Check for alternatives when higher level complains
- * about service problems. For now, invalidate cached
- * routing information. If the route was created dynamically
- * (by a redirect), time to try a default gateway again.
- */
-void
-in6_losing(struct in6pcb *in6p)
-{
- struct rtentry *rt;
- struct rt_addrinfo info;
-
- if (in6p->in6p_af != AF_INET6)
- return;
-
- if ((rt = rtcache_validate(&in6p->in6p_route)) == NULL)
- return;
-
- memset(&info, 0, sizeof(info));
- info.rti_info[RTAX_DST] = rtcache_getdst(&in6p->in6p_route);
- info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
- info.rti_info[RTAX_NETMASK] = rt_mask(rt);
- rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0);
- if (rt->rt_flags & RTF_DYNAMIC) {
- int error;
- struct rtentry *nrt;
-
- error = rtrequest(RTM_DELETE, rt_getkey(rt),
- rt->rt_gateway, rt_mask(rt), rt->rt_flags, &nrt);
- rtcache_unref(rt, &in6p->in6p_route);
- if (error == 0) {
- rt_newmsg_dynamic(RTM_DELETE, nrt);
- rt_free(nrt);
- }
- } else
- rtcache_unref(rt, &in6p->in6p_route);
- /*
- * A new route can be allocated
- * the next time output is attempted.
- */
- rtcache_free(&in6p->in6p_route);
-}
-
-/*
* After a routing change, flush old routing. A new route can be
* allocated the next time output is attempted.
*/
void
-in6_rtchange(struct in6pcb *in6p, int errno)
+in6_rtchange(struct inpcb *inp, int errno)
{
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return;
- rtcache_free(&in6p->in6p_route);
+ rtcache_free(&inp->inp_route);
/*
* A new route can be allocated the next time
* output is attempted.
*/
}
-struct in6pcb *
+struct inpcb *
in6_pcblookup_port(struct inpcbtable *table, struct in6_addr *laddr6,
u_int lport_arg, int lookup_wildcard, struct vestigial_inpcb *vp)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
- struct in6pcb *in6p, *match = NULL;
+ struct inpcb *inp, *match = NULL;
int matchwild = 3, wildcard;
u_int16_t lport = lport_arg;
@@ -984,59 +842,58 @@ in6_pcblookup_port(struct inpcbtable *table, struct in6_addr *laddr6,
vp->valid = 0;
head = IN6PCBHASH_PORT(table, lport);
- LIST_FOREACH(inph, head, inph_lhash) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ LIST_FOREACH(inp, head, inp_lhash) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (in6p->in6p_lport != lport)
+ if (inp->inp_lport != lport)
continue;
wildcard = 0;
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6)) {
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
}
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
wildcard++;
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6)) {
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
if (!IN6_IS_ADDR_V4MAPPED(laddr6))
continue;
/* duplicate of IPv4 logic */
wildcard = 0;
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr) &&
- in6p->in6p_faddr.s6_addr32[3])
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6) &&
+ inp->inp_faddr6.s6_addr32[3])
wildcard++;
- if (!in6p->in6p_laddr.s6_addr32[3]) {
+ if (!inp->inp_laddr6.s6_addr32[3]) {
if (laddr6->s6_addr32[3])
wildcard++;
} else {
if (!laddr6->s6_addr32[3])
wildcard++;
else {
- if (in6p->in6p_laddr.s6_addr32[3] !=
+ if (inp->inp_laddr6.s6_addr32[3] !=
laddr6->s6_addr32[3])
continue;
}
}
- } else if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
+ } else if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6)) {
if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
}
if (!IN6_IS_ADDR_UNSPECIFIED(laddr6))
wildcard++;
} else {
if (IN6_IS_ADDR_V4MAPPED(laddr6)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
}
if (IN6_IS_ADDR_UNSPECIFIED(laddr6))
wildcard++;
else {
- if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr,
+ if (!IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6,
laddr6))
continue;
}
@@ -1044,7 +901,7 @@ in6_pcblookup_port(struct inpcbtable *table, struct in6_addr *laddr6,
if (wildcard && !lookup_wildcard)
continue;
if (wildcard < matchwild) {
- match = in6p;
+ match = inp;
matchwild = wildcard;
if (matchwild == 0)
break;
@@ -1105,11 +962,11 @@ in6_pcblookup_port(struct inpcbtable *table, struct in6_addr *laddr6,
}
/*
- * WARNING: return value (rtentry) could be IPv4 one if in6pcb is connected to
+ * WARNING: return value (rtentry) could be IPv4 one if inpcb is connected to
* IPv4 mapped address.
*/
struct rtentry *
-in6_pcbrtentry(struct in6pcb *in6p)
+in6_pcbrtentry(struct inpcb *inp)
{
struct rtentry *rt;
struct route *ro;
@@ -1121,9 +978,9 @@ in6_pcbrtentry(struct in6pcb *in6p)
#endif
} cdst;
- ro = &in6p->in6p_route;
+ ro = &inp->inp_route;
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return (NULL);
cdst.sa = rtcache_getdst(ro);
@@ -1131,27 +988,27 @@ in6_pcbrtentry(struct in6pcb *in6p)
;
#ifdef INET
else if (cdst.sa->sa_family == AF_INET) {
- KASSERT(IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr));
- if (cdst.sa4->sin_addr.s_addr != in6p->in6p_faddr.s6_addr32[3])
+ KASSERT(IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6));
+ if (cdst.sa4->sin_addr.s_addr != inp->inp_faddr6.s6_addr32[3])
rtcache_free(ro);
}
#endif
else {
if (!IN6_ARE_ADDR_EQUAL(&cdst.sa6->sin6_addr,
- &in6p->in6p_faddr))
+ &inp->inp_faddr6))
rtcache_free(ro);
}
if ((rt = rtcache_validate(ro)) == NULL)
rt = rtcache_update(ro, 1);
#ifdef INET
- if (rt == NULL && IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)) {
+ if (rt == NULL && IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6)) {
union {
struct sockaddr dst;
struct sockaddr_in dst4;
} u;
struct in_addr addr;
- addr.s_addr = in6p->in6p_faddr.s6_addr32[3];
+ addr.s_addr = inp->inp_faddr6.s6_addr32[3];
sockaddr_in_init(&u.dst4, &addr, 0);
if (rtcache_setdst(ro, &u.dst) != 0)
@@ -1160,13 +1017,13 @@ in6_pcbrtentry(struct in6pcb *in6p)
rt = rtcache_init(ro);
} else
#endif
- if (rt == NULL && !IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
+ if (rt == NULL && !IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6)) {
union {
struct sockaddr dst;
struct sockaddr_in6 dst6;
} u;
- sockaddr_in6_init(&u.dst6, &in6p->in6p_faddr, 0, 0, 0);
+ sockaddr_in6_init(&u.dst6, &inp->inp_faddr6, 0, 0, 0);
if (rtcache_setdst(ro, &u.dst) != 0)
return NULL;
@@ -1176,50 +1033,48 @@ in6_pcbrtentry(struct in6pcb *in6p)
}
void
-in6_pcbrtentry_unref(struct rtentry *rt, struct in6pcb *in6p)
+in6_pcbrtentry_unref(struct rtentry *rt, struct inpcb *inp)
{
- rtcache_unref(rt, &in6p->in6p_route);
+ rtcache_unref(rt, &inp->inp_route);
}
-struct in6pcb *
+struct inpcb *
in6_pcblookup_connect(struct inpcbtable *table, const struct in6_addr *faddr6,
u_int fport_arg, const struct in6_addr *laddr6, u_int lport_arg,
int faith,
struct vestigial_inpcb *vp)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
- struct in6pcb *in6p;
+ struct inpcb *inp;
u_int16_t fport = fport_arg, lport = lport_arg;
if (vp)
vp->valid = 0;
head = IN6PCBHASH_CONNECT(table, faddr6, fport, laddr6, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ LIST_FOREACH(inp, head, inp_hash) {
+ if (inp->inp_af != AF_INET6)
continue;
/* find exact match on both source and dest */
- if (in6p->in6p_fport != fport)
+ if (inp->inp_fport != fport)
continue;
- if (in6p->in6p_lport != lport)
+ if (inp->inp_lport != lport)
continue;
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
continue;
- if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, faddr6))
+ if (!IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, faddr6))
continue;
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr))
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6))
continue;
- if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, laddr6))
+ if (!IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, laddr6))
continue;
if ((IN6_IS_ADDR_V4MAPPED(laddr6) ||
IN6_IS_ADDR_V4MAPPED(faddr6)) &&
- (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
+ (inp->inp_flags & IN6P_IPV6_V6ONLY))
continue;
- return in6p;
+ return inp;
}
if (vp && table->vestige) {
if ((*table->vestige->lookup6)(faddr6, fport_arg,
@@ -1230,34 +1085,32 @@ in6_pcblookup_connect(struct inpcbtable *table, const struct in6_addr *faddr6,
return NULL;
}
-struct in6pcb *
+struct inpcb *
in6_pcblookup_bind(struct inpcbtable *table, const struct in6_addr *laddr6,
u_int lport_arg, int faith)
{
struct inpcbhead *head;
- struct inpcb_hdr *inph;
- struct in6pcb *in6p;
+ struct inpcb *inp;
u_int16_t lport = lport_arg;
#ifdef INET
struct in6_addr zero_mapped;
#endif
head = IN6PCBHASH_BIND(table, laddr6, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ LIST_FOREACH(inp, head, inp_hash) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (faith && (in6p->in6p_flags & IN6P_FAITH) == 0)
+ if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
continue;
- if (in6p->in6p_fport != 0)
+ if (inp->inp_fport != 0)
continue;
- if (in6p->in6p_lport != lport)
+ if (inp->inp_lport != lport)
continue;
if (IN6_IS_ADDR_V4MAPPED(laddr6) &&
- (in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
- if (IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, laddr6))
+ if (IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, laddr6))
goto out;
}
#ifdef INET
@@ -1265,76 +1118,73 @@ in6_pcblookup_bind(struct inpcbtable *table, const struct in6_addr *laddr6,
memset(&zero_mapped, 0, sizeof(zero_mapped));
zero_mapped.s6_addr16[5] = 0xffff;
head = IN6PCBHASH_BIND(table, &zero_mapped, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ LIST_FOREACH(inp, head, inp_hash) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (faith && (in6p->in6p_flags & IN6P_FAITH) == 0)
+ if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
continue;
- if (in6p->in6p_fport != 0)
+ if (inp->inp_fport != 0)
continue;
- if (in6p->in6p_lport != lport)
+ if (inp->inp_lport != lport)
continue;
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
- if (IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &zero_mapped))
+ if (IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, &zero_mapped))
goto out;
}
}
#endif
head = IN6PCBHASH_BIND(table, &zeroin6_addr, lport);
- LIST_FOREACH(inph, head, inph_hash) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ LIST_FOREACH(inp, head, inp_hash) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (faith && (in6p->in6p_flags & IN6P_FAITH) == 0)
+ if (faith && (inp->inp_flags & IN6P_FAITH) == 0)
continue;
- if (in6p->in6p_fport != 0)
+ if (inp->inp_fport != 0)
continue;
- if (in6p->in6p_lport != lport)
+ if (inp->inp_lport != lport)
continue;
if (IN6_IS_ADDR_V4MAPPED(laddr6) &&
- (in6p->in6p_flags & IN6P_IPV6_V6ONLY) != 0)
+ (inp->inp_flags & IN6P_IPV6_V6ONLY) != 0)
continue;
- if (IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &zeroin6_addr))
+ if (IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, &zeroin6_addr))
goto out;
}
return (NULL);
out:
- inph = &in6p->in6p_head;
- if (inph != LIST_FIRST(head)) {
- LIST_REMOVE(inph, inph_hash);
- LIST_INSERT_HEAD(head, inph, inph_hash);
+ if (inp != LIST_FIRST(head)) {
+ LIST_REMOVE(inp, inp_hash);
+ LIST_INSERT_HEAD(head, inp, inp_hash);
}
- return in6p;
+ return inp;
}
void
-in6_pcbstate(struct in6pcb *in6p, int state)
+in6_pcbstate(struct inpcb *inp, int state)
{
- if (in6p->in6p_af != AF_INET6)
+ if (inp->inp_af != AF_INET6)
return;
- if (in6p->in6p_state > IN6P_ATTACHED)
- LIST_REMOVE(&in6p->in6p_head, inph_hash);
+ if (inp->inp_state > INP_ATTACHED)
+ LIST_REMOVE(inp, inp_hash);
switch (state) {
- case IN6P_BOUND:
- LIST_INSERT_HEAD(IN6PCBHASH_BIND(in6p->in6p_table,
- &in6p->in6p_laddr, in6p->in6p_lport), &in6p->in6p_head,
- inph_hash);
+ case INP_BOUND:
+ LIST_INSERT_HEAD(IN6PCBHASH_BIND(inp->inp_table,
+ &inp->inp_laddr6, inp->inp_lport), inp,
+ inp_hash);
break;
- case IN6P_CONNECTED:
- LIST_INSERT_HEAD(IN6PCBHASH_CONNECT(in6p->in6p_table,
- &in6p->in6p_faddr, in6p->in6p_fport,
- &in6p->in6p_laddr, in6p->in6p_lport), &in6p->in6p_head,
- inph_hash);
+ case INP_CONNECTED:
+ LIST_INSERT_HEAD(IN6PCBHASH_CONNECT(inp->inp_table,
+ &inp->inp_faddr6, inp->inp_fport,
+ &inp->inp_laddr6, inp->inp_lport), inp,
+ inp_hash);
break;
}
- in6p->in6p_state = state;
+ inp->inp_state = state;
}
diff --git a/sys/netinet6/in6_pcb.h b/sys/netinet6/in6_pcb.h
index abc84a7570d..79f563608a9 100644
--- a/sys/netinet6/in6_pcb.h
+++ b/sys/netinet6/in6_pcb.h
@@ -1,4 +1,4 @@
-/* $NetBSD: in6_pcb.h,v 1.53 2022/06/15 04:31:22 knakahara Exp $ */
+/* $NetBSD: in6_pcb.h,v 1.54 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: in6_pcb.h,v 1.45 2001/02/09 05:59:46 itojun Exp $ */
/*
@@ -64,143 +64,6 @@
#ifndef _NETINET6_IN6_PCB_H_
#define _NETINET6_IN6_PCB_H_
-#include <sys/queue.h>
-#include <netinet/in_pcb_hdr.h>
-#include <netinet/ip6.h>
-
-/*
- * Common structure pcb for internet protocol implementation.
- * Here are stored pointers to local and foreign host table
- * entries, local and foreign socket numbers, and pointers
- * up (to a socket structure) and down (to a protocol-specific)
- * control block.
- */
-struct icmp6_filter;
-
-struct in6pcb {
- struct inpcb_hdr in6p_head;
-#define in6p_queue in6p_head.inph_queue
-#define in6p_af in6p_head.inph_af
-#define in6p_ppcb in6p_head.inph_ppcb
-#define in6p_state in6p_head.inph_state
-#define in6p_portalgo in6p_head.inph_portalgo
-#define in6p_socket in6p_head.inph_socket
-#define in6p_table in6p_head.inph_table
-#define in6p_sp in6p_head.inph_sp
- struct route in6p_route; /* placeholder for routing entry */
- u_int16_t in6p_fport; /* foreign port */
- u_int16_t in6p_lport; /* local port */
- u_int32_t in6p_flowinfo; /* priority and flowlabel */
- int in6p_flags; /* generic IP6/datagram flags */
- int in6p_hops; /* default hop limit */
- struct ip6_hdr in6p_ip6; /* header prototype */
- struct mbuf *in6p_options; /* IP6 options */
- struct ip6_pktopts *in6p_outputopts; /* IP6 options for outgoing packets */
- struct ip6_moptions *in6p_moptions; /* IP6 multicast options */
- struct icmp6_filter *in6p_icmp6filt;
- int in6p_cksum; /* IPV6_CHECKSUM setsockopt */
- bool in6p_bindportonsend;
- struct ip_moptions *in6p_v4moptions;/* IP4 multicast options */
- pcb_overudp_cb_t in6p_overudp_cb;
- void *in6p_overudp_arg;
-};
-
-#define in6p_faddr in6p_ip6.ip6_dst
-#define in6p_laddr in6p_ip6.ip6_src
-
-#define in6p_lock(in6p) solock((in6p)->in6p_socket)
-#define in6p_unlock(in6p) sounlock((in6p)->in6p_socket)
-#define in6p_locked(in6p) solocked((in6p)->in6p_socket)
-
-/* states in inp_state: */
-#define IN6P_ATTACHED INP_ATTACHED
-#define IN6P_BOUND INP_BOUND
-#define IN6P_CONNECTED INP_CONNECTED
-
-/*
- * Flags in in6p_flags
- * We define KAME's original flags in higher 16 bits as much as possible
- * for compatibility with *bsd*s.
- */
-#define IN6P_RECVOPTS 0x00001000 /* receive incoming IP6 options */
-#define IN6P_RECVRETOPTS 0x00002000 /* receive IP6 options for reply */
-#define IN6P_RECVDSTADDR 0x00004000 /* receive IP6 dst address */
-#define IN6P_IPV6_V6ONLY 0x00008000 /* restrict AF_INET6 socket for v6 */
-#define IN6P_PKTINFO 0x00010000 /* receive IP6 dst and I/F */
-#define IN6P_HOPLIMIT 0x00020000 /* receive hoplimit */
-#define IN6P_HOPOPTS 0x00040000 /* receive hop-by-hop options */
-#define IN6P_DSTOPTS 0x00080000 /* receive dst options after rthdr */
-#define IN6P_RTHDR 0x00100000 /* receive routing header */
-#define IN6P_RTHDRDSTOPTS 0x00200000 /* receive dstoptions before rthdr */
-#define IN6P_TCLASS 0x00400000 /* traffic class */
-#define IN6P_BINDANY 0x00800000 /* allow bind to any address */
-#define IN6P_HIGHPORT 0x01000000 /* user wants "high" port binding */
-#define IN6P_LOWPORT 0x02000000 /* user wants "low" port binding */
-#define IN6P_ANONPORT 0x04000000 /* port chosen for user */
-#define IN6P_FAITH 0x08000000 /* accept FAITH'ed connections */
-/* XXX should move to an UDP control block */
-#define IN6P_ESPINUDP INP_ESPINUDP /* ESP over UDP for NAT-T */
-
-#define IN6P_RFC2292 0x40000000 /* RFC2292 */
-#define IN6P_MTU 0x80000000 /* use minimum MTU */
-
-#define IN6P_CONTROLOPTS (IN6P_PKTINFO|IN6P_HOPLIMIT|IN6P_HOPOPTS|\
- IN6P_DSTOPTS|IN6P_RTHDR|IN6P_RTHDRDSTOPTS|\
- IN6P_TCLASS|IN6P_RFC2292|\
- IN6P_MTU)
-
-#ifdef _KERNEL
-/* compute hash value for foreign and local in6_addr and port */
-#define IN6_HASH(faddr, fport, laddr, lport) \
- (((faddr)->s6_addr32[0] ^ (faddr)->s6_addr32[1] ^ \
- (faddr)->s6_addr32[2] ^ (faddr)->s6_addr32[3] ^ \
- (laddr)->s6_addr32[0] ^ (laddr)->s6_addr32[1] ^ \
- (laddr)->s6_addr32[2] ^ (laddr)->s6_addr32[3]) \
- + (fport) + (lport))
-
-#define sotoin6pcb(so) ((struct in6pcb *)(so)->so_pcb)
-
-void in6_losing(struct in6pcb *);
-void in6_pcbinit(struct inpcbtable *, int, int);
-int in6_pcballoc(struct socket *, void *);
-int in6_pcbbind(void *, struct sockaddr_in6 *, struct lwp *);
-int in6_pcbconnect(void *, struct sockaddr_in6 *, struct lwp *);
-void in6_pcbdetach(struct in6pcb *);
-void in6_pcbdisconnect(struct in6pcb *);
-struct in6pcb *in6_pcblookup_port(struct inpcbtable *, struct in6_addr *,
- u_int, int, struct vestigial_inpcb *);
-int in6_pcbnotify(struct inpcbtable *, const struct sockaddr *,
- u_int, const struct sockaddr *, u_int, int, void *,
- void (*)(struct in6pcb *, int));
-void in6_pcbpurgeif0(struct inpcbtable *, struct ifnet *);
-void in6_pcbpurgeif(struct inpcbtable *, struct ifnet *);
-void in6_pcbstate(struct in6pcb *, int);
-void in6_rtchange(struct in6pcb *, int);
-void in6_setpeeraddr(struct in6pcb *, struct sockaddr_in6 *);
-void in6_setsockaddr(struct in6pcb *, struct sockaddr_in6 *);
-
-/* in in6_src.c */
-int in6_selecthlim(struct in6pcb *, struct ifnet *);
-int in6_selecthlim_rt(struct in6pcb *);
-int in6_pcbsetport(struct sockaddr_in6 *, struct in6pcb *, struct lwp *);
-
-extern struct rtentry *
- in6_pcbrtentry(struct in6pcb *);
-extern void
- in6_pcbrtentry_unref(struct rtentry *, struct in6pcb *);
-extern struct in6pcb *in6_pcblookup_connect(struct inpcbtable *,
- const struct in6_addr *, u_int, const struct in6_addr *, u_int, int,
- struct vestigial_inpcb *);
-extern struct in6pcb *in6_pcblookup_bind(struct inpcbtable *,
- const struct in6_addr *, u_int, int);
-
-static inline void
-in6_pcb_register_overudp_cb(struct in6pcb *in6p, pcb_overudp_cb_t cb, void *arg)
-{
-
- in6p->in6p_overudp_cb = cb;
- in6p->in6p_overudp_arg = arg;
-}
-#endif /* _KERNEL */
+#include <netinet/in_pcb.h>
#endif /* !_NETINET6_IN6_PCB_H_ */
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index 178eb31b676..a0805e4ed8b 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -1,4 +1,4 @@
-/* $NetBSD: in6_src.c,v 1.88 2021/08/10 06:29:56 kardel Exp $ */
+/* $NetBSD: in6_src.c,v 1.89 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: in6_src.c,v 1.159 2005/10/19 01:40:32 t-momose Exp $ */
/*
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.88 2021/08/10 06:29:56 kardel Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.89 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -809,10 +809,10 @@ out:
* 3. The system default hoplimit.
*/
int
-in6_selecthlim(struct in6pcb *in6p, struct ifnet *ifp)
+in6_selecthlim(struct inpcb *inp, struct ifnet *ifp)
{
- if (in6p && in6p->in6p_hops >= 0)
- return (in6p->in6p_hops);
+ if (inp && inp->inp_hops6 >= 0)
+ return (inp->inp_hops6);
else if (ifp)
return (ND_IFINFO(ifp)->chlim);
else
@@ -820,35 +820,35 @@ in6_selecthlim(struct in6pcb *in6p, struct ifnet *ifp)
}
int
-in6_selecthlim_rt(struct in6pcb *in6p)
+in6_selecthlim_rt(struct inpcb *inp)
{
struct rtentry *rt;
- if (in6p == NULL)
- return in6_selecthlim(in6p, NULL);
+ if (inp == NULL)
+ return in6_selecthlim(inp, NULL);
- rt = rtcache_validate(&in6p->in6p_route);
+ rt = rtcache_validate(&inp->inp_route);
if (rt != NULL) {
- int ret = in6_selecthlim(in6p, rt->rt_ifp);
- rtcache_unref(rt, &in6p->in6p_route);
+ int ret = in6_selecthlim(inp, rt->rt_ifp);
+ rtcache_unref(rt, &inp->inp_route);
return ret;
} else
- return in6_selecthlim(in6p, NULL);
+ return in6_selecthlim(inp, NULL);
}
/*
* Find an empty port and set it to the specified PCB.
*/
int
-in6_pcbsetport(struct sockaddr_in6 *sin6, struct in6pcb *in6p, struct lwp *l)
+in6_pcbsetport(struct sockaddr_in6 *sin6, struct inpcb *inp, struct lwp *l)
{
- struct socket *so = in6p->in6p_socket;
- struct inpcbtable *table = in6p->in6p_table;
+ struct socket *so = inp->inp_socket;
+ struct inpcbtable *table = inp->inp_table;
u_int16_t lport, *lastport;
enum kauth_network_req req;
int error = 0;
- if (in6p->in6p_flags & IN6P_LOWPORT) {
+ if (inp->inp_flags & IN6P_LOWPORT) {
#ifndef IPNOPRIVPORTS
req = KAUTH_REQ_NETWORK_BIND_PRIVPORT;
#else
@@ -870,14 +870,14 @@ in6_pcbsetport(struct sockaddr_in6 *sin6, struct in6pcb *in6p, struct lwp *l)
/*
* Use RFC6056 randomized port selection
*/
- error = portalgo_randport(&lport, &in6p->in6p_head, l->l_cred);
+ error = portalgo_randport(&lport, inp, l->l_cred);
if (error)
return error;
- in6p->in6p_flags |= IN6P_ANONPORT;
+ inp->inp_flags |= IN6P_ANONPORT;
*lastport = lport;
- in6p->in6p_lport = htons(lport);
- in6_pcbstate(in6p, IN6P_BOUND);
+ inp->inp_lport = htons(lport);
+ in6_pcbstate(inp, INP_BOUND);
return (0); /* success */
}
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
index 64ffd8d6877..02601d9357e 100644
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_input.c,v 1.226 2022/10/24 01:54:19 knakahara Exp $ */
+/* $NetBSD: ip6_input.c,v 1.227 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.226 2022/10/24 01:54:19 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.227 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_gateway.h"
@@ -1063,12 +1063,12 @@ ip6_unknown_opt(u_int8_t *optp, struct mbuf *m, int off)
}
void
-ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
+ip6_savecontrol(struct inpcb *inp, struct mbuf **mp,
struct ip6_hdr *ip6, struct mbuf *m)
{
- struct socket *so = in6p->in6p_socket;
+ struct socket *so = inp->inp_socket;
#ifdef RFC2292
-#define IS2292(x, y) ((in6p->in6p_flags & IN6P_RFC2292) ? (x) : (y))
+#define IS2292(x, y) ((inp->inp_flags & IN6P_RFC2292) ? (x) : (y))
#else
#define IS2292(x, y) (y)
#endif
@@ -1083,7 +1083,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
return;
/* RFC 2292 sec. 5 */
- if ((in6p->in6p_flags & IN6P_PKTINFO) != 0) {
+ if ((inp->inp_flags & IN6P_PKTINFO) != 0) {
struct in6_pktinfo pi6;
memcpy(&pi6.ipi6_addr, &ip6->ip6_dst, sizeof(struct in6_addr));
@@ -1095,7 +1095,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
mp = &(*mp)->m_next;
}
- if (in6p->in6p_flags & IN6P_HOPLIMIT) {
+ if (inp->inp_flags & IN6P_HOPLIMIT) {
int hlim = ip6->ip6_hlim & 0xff;
*mp = sbcreatecontrol(&hlim, sizeof(hlim),
@@ -1104,7 +1104,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
mp = &(*mp)->m_next;
}
- if ((in6p->in6p_flags & IN6P_TCLASS) != 0) {
+ if ((inp->inp_flags & IN6P_TCLASS) != 0) {
u_int32_t flowinfo;
int tclass;
@@ -1126,7 +1126,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
* returned to normal user.
* See also RFC3542 section 8 (or RFC2292 section 6).
*/
- if ((in6p->in6p_flags & IN6P_HOPOPTS) != 0) {
+ if ((inp->inp_flags & IN6P_HOPOPTS) != 0) {
/*
* Check if a hop-by-hop options header is contatined in the
* received packet, and if so, store the options as ancillary
@@ -1170,7 +1170,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
}
/* IPV6_DSTOPTS and IPV6_RTHDR socket options */
- if (in6p->in6p_flags & (IN6P_DSTOPTS | IN6P_RTHDR)) {
+ if (inp->inp_flags & (IN6P_DSTOPTS | IN6P_RTHDR)) {
struct ip6_hdr *xip6 = mtod(m, struct ip6_hdr *);
int nxt = xip6->ip6_nxt, off = sizeof(struct ip6_hdr);
@@ -1219,7 +1219,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
switch (nxt) {
case IPPROTO_DSTOPTS:
- if (!(in6p->in6p_flags & IN6P_DSTOPTS))
+ if (!(inp->inp_flags & IN6P_DSTOPTS))
break;
*mp = sbcreatecontrol(ip6e, elen,
@@ -1230,7 +1230,7 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
break;
case IPPROTO_ROUTING:
- if (!(in6p->in6p_flags & IN6P_RTHDR))
+ if (!(inp->inp_flags & IN6P_RTHDR))
break;
*mp = sbcreatecontrol(ip6e, elen,
@@ -1271,14 +1271,14 @@ ip6_savecontrol(struct in6pcb *in6p, struct mbuf **mp,
void
-ip6_notify_pmtu(struct in6pcb *in6p, const struct sockaddr_in6 *dst,
+ip6_notify_pmtu(struct inpcb *inp, const struct sockaddr_in6 *dst,
uint32_t *mtu)
{
struct socket *so;
struct mbuf *m_mtu;
struct ip6_mtuinfo mtuctl;
- so = in6p->in6p_socket;
+ so = inp->inp_socket;
if (mtu == NULL)
return;
diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c
index 5d4a7b746a3..18634b407ce 100644
--- a/sys/netinet6/ip6_output.c
+++ b/sys/netinet6/ip6_output.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_output.c,v 1.229 2021/09/21 15:07:43 christos Exp $ */
+/* $NetBSD: ip6_output.c,v 1.230 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.229 2021/09/21 15:07:43 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.230 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -121,8 +121,8 @@ static int ip6_pcbopt(int, u_char *, int, struct ip6_pktopts **,
static int ip6_getpcbopt(struct ip6_pktopts *, int, struct sockopt *);
static int ip6_setpktopt(int, u_char *, int, struct ip6_pktopts *, kauth_cred_t,
int, int, int);
-static int ip6_setmoptions(const struct sockopt *, struct in6pcb *);
-static int ip6_getmoptions(struct sockopt *, struct in6pcb *);
+static int ip6_setmoptions(const struct sockopt *, struct inpcb *);
+static int ip6_getmoptions(struct sockopt *, struct inpcb *);
static int ip6_copyexthdr(struct mbuf **, void *, int);
static int ip6_insertfraghdr(struct mbuf *, struct mbuf *, int,
struct ip6_frag **);
@@ -196,7 +196,7 @@ ip6_output(
struct route *ro,
int flags,
struct ip6_moptions *im6o,
- struct in6pcb *in6p,
+ struct inpcb *inp,
struct ifnet **ifpp /* XXX: just for statistics */
)
{
@@ -286,7 +286,7 @@ ip6_output(
#ifdef IPSEC
if (ipsec_used) {
/* Check the security policy (SP) for the packet */
- sp = ipsec6_check_policy(m, in6p, flags, &needipsec, &error);
+ sp = ipsec6_check_policy(m, inp, flags, &needipsec, &error);
if (error != 0) {
/*
* Hack: -EINVAL is used to signal that a packet
@@ -1297,7 +1297,7 @@ ip6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
{
int optdatalen, uproto;
void *optdata;
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
struct ip_moptions **mopts;
int error, optval;
int level, optname;
@@ -1319,7 +1319,7 @@ ip6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
case IP_MULTICAST_IF:
case IP_MULTICAST_LOOP:
case IP_MULTICAST_TTL:
- mopts = &in6p->in6p_v4moptions;
+ mopts = &inp->inp_moptions;
switch (op) {
case PRCO_GETOPT:
return ip_getmoptions(*mopts, sopt);
@@ -1341,7 +1341,7 @@ ip6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
switch (optname) {
#ifdef RFC2292
case IPV6_2292PKTOPTIONS:
- error = ip6_pcbopts(&in6p->in6p_outputopts, so, sopt);
+ error = ip6_pcbopts(&inp->inp_outputopts6, so, sopt);
break;
#endif
@@ -1388,29 +1388,29 @@ ip6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
error = EINVAL;
else {
/* -1 = kernel default */
- in6p->in6p_hops = optval;
+ inp->inp_hops6 = optval;
}
break;
#define OPTSET(bit) \
do { \
if (optval) \
- in6p->in6p_flags |= (bit); \
+ inp->inp_flags |= (bit); \
else \
- in6p->in6p_flags &= ~(bit); \
+ inp->inp_flags &= ~(bit); \
} while (/*CONSTCOND*/ 0)
#ifdef RFC2292
#define OPTSET2292(bit) \
do { \
-in6p->in6p_flags |= IN6P_RFC2292; \
+inp->inp_flags |= IN6P_RFC2292; \
if (optval) \
- in6p->in6p_flags |= (bit); \
+ inp->inp_flags |= (bit); \
else \
- in6p->in6p_flags &= ~(bit); \
+ inp->inp_flags &= ~(bit); \
} while (/*CONSTCOND*/ 0)
#endif
-#define OPTBIT(bit) (in6p->in6p_flags & (bit) ? 1 : 0)
+#define OPTBIT(bit) (inp->inp_flags & (bit) ? 1 : 0)
case IPV6_RECVPKTINFO:
#ifdef RFC2292
@@ -1434,7 +1434,7 @@ else \
break;
}
#endif
- optp = &in6p->in6p_outputopts;
+ optp = &inp->inp_outputopts6;
error = ip6_pcbopt(IPV6_HOPLIMIT,
(u_char *)&optval,
sizeof(optval),
@@ -1519,8 +1519,8 @@ else \
* available only prior to bind(2).
* see ipng mailing list, Jun 22 2001.
*/
- if (in6p->in6p_lport ||
- !IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
+ if (inp->inp_lport ||
+ !IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6)) {
error = EINVAL;
break;
}
@@ -1563,7 +1563,7 @@ else \
error = sockopt_get(sopt, &tclass, sizeof(tclass));
if (error)
break;
- optp = &in6p->in6p_outputopts;
+ optp = &inp->inp_outputopts6;
error = ip6_pcbopt(optname,
(u_char *)&tclass,
sizeof(tclass),
@@ -1581,7 +1581,7 @@ else \
break;
{
struct ip6_pktopts **optp;
- optp = &in6p->in6p_outputopts;
+ optp = &inp->inp_outputopts6;
error = ip6_pcbopt(optname,
(u_char *)&optval,
sizeof(optval),
@@ -1669,7 +1669,7 @@ else \
free(optbuf, M_IP6OPT);
break;
}
- optp = &in6p->in6p_outputopts;
+ optp = &inp->inp_outputopts6;
error = ip6_pcbopt(optname, optbuf, optbuflen,
optp, kauth_cred_get(), uproto);
@@ -1683,7 +1683,7 @@ else \
case IPV6_MULTICAST_LOOP:
case IPV6_JOIN_GROUP:
case IPV6_LEAVE_GROUP:
- error = ip6_setmoptions(sopt, in6p);
+ error = ip6_setmoptions(sopt, inp);
break;
case IPV6_PORTRANGE:
@@ -1693,18 +1693,18 @@ else \
switch (optval) {
case IPV6_PORTRANGE_DEFAULT:
- in6p->in6p_flags &= ~(IN6P_LOWPORT);
- in6p->in6p_flags &= ~(IN6P_HIGHPORT);
+ inp->inp_flags &= ~(IN6P_LOWPORT);
+ inp->inp_flags &= ~(IN6P_HIGHPORT);
break;
case IPV6_PORTRANGE_HIGH:
- in6p->in6p_flags &= ~(IN6P_LOWPORT);
- in6p->in6p_flags |= IN6P_HIGHPORT;
+ inp->inp_flags &= ~(IN6P_LOWPORT);
+ inp->inp_flags |= IN6P_HIGHPORT;
break;
case IPV6_PORTRANGE_LOW:
- in6p->in6p_flags &= ~(IN6P_HIGHPORT);
- in6p->in6p_flags |= IN6P_LOWPORT;
+ inp->inp_flags &= ~(IN6P_HIGHPORT);
+ inp->inp_flags |= IN6P_LOWPORT;
break;
default:
@@ -1718,14 +1718,13 @@ else \
if (error)
break;
- error = portalgo_algo_index_select(
- (struct inpcb_hdr *)in6p, optval);
+ error = portalgo_algo_index_select(inp, optval);
break;
#if defined(IPSEC)
case IPV6_IPSEC_POLICY:
if (ipsec_enabled) {
- error = ipsec_set_policy(in6p,
+ error = ipsec_set_policy(inp,
sopt->sopt_data, sopt->sopt_size,
kauth_cred_get());
} else
@@ -1784,7 +1783,7 @@ else \
break;
case IPV6_UNICAST_HOPS:
- optval = in6p->in6p_hops;
+ optval = inp->inp_hops6;
break;
case IPV6_RECVPKTINFO:
@@ -1814,7 +1813,7 @@ else \
case IPV6_PORTRANGE:
{
int flags;
- flags = in6p->in6p_flags;
+ flags = inp->inp_flags;
if (flags & IN6P_HIGHPORT)
optval = IPV6_PORTRANGE_HIGH;
else if (flags & IN6P_LOWPORT)
@@ -1841,7 +1840,7 @@ else \
{
u_long pmtu = 0;
struct ip6_mtuinfo mtuinfo;
- struct route *ro = &in6p->in6p_route;
+ struct route *ro = &inp->inp_route;
struct rtentry *rt;
union {
struct sockaddr dst;
@@ -1855,7 +1854,7 @@ else \
* routing, or optional information to specify
* the outgoing interface.
*/
- sockaddr_in6_init(&u.dst6, &in6p->in6p_faddr, 0, 0, 0);
+ sockaddr_in6_init(&u.dst6, &inp->inp_faddr6, 0, 0, 0);
rt = rtcache_lookup(ro, &u.dst);
error = ip6_getpmtu(rt, NULL, &pmtu, NULL);
rtcache_unref(rt, ro);
@@ -1911,7 +1910,7 @@ else \
case IPV6_DONTFRAG:
case IPV6_USE_MIN_MTU:
case IPV6_PREFER_TEMPADDR:
- error = ip6_getpcbopt(in6p->in6p_outputopts,
+ error = ip6_getpcbopt(inp->inp_outputopts6,
optname, sopt);
break;
@@ -1920,11 +1919,11 @@ else \
case IPV6_MULTICAST_LOOP:
case IPV6_JOIN_GROUP:
case IPV6_LEAVE_GROUP:
- error = ip6_getmoptions(sopt, in6p);
+ error = ip6_getmoptions(sopt, inp);
break;
case IPV6_PORTALGO:
- optval = ((struct inpcb_hdr *)in6p)->inph_portalgo;
+ optval = inp->inp_portalgo;
error = sockopt_setint(sopt, optval);
break;
@@ -1937,7 +1936,7 @@ else \
* XXX: this will return EINVAL as sopt is
* empty
*/
- error = ipsec_get_policy(in6p, sopt->sopt_data,
+ error = ipsec_get_policy(inp, sopt->sopt_data,
sopt->sopt_size, &m);
if (!error)
error = sockopt_setmbuf(sopt, m);
@@ -1960,7 +1959,7 @@ ip6_raw_ctloutput(int op, struct socket *so, struct sockopt *sopt)
{
int error = 0, optval;
const int icmp6off = offsetof(struct icmp6_hdr, icmp6_cksum);
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
int level, optname;
KASSERT(sopt != NULL);
@@ -1995,14 +1994,14 @@ ip6_raw_ctloutput(int op, struct socket *so, struct sockopt *sopt)
if (optval != icmp6off)
error = EINVAL;
} else
- in6p->in6p_cksum = optval;
+ inp->inp_cksum6 = optval;
break;
case PRCO_GETOPT:
if (so->so_proto->pr_protocol == IPPROTO_ICMPV6)
optval = icmp6off;
else
- optval = in6p->in6p_cksum;
+ optval = inp->inp_cksum6;
error = sockopt_setint(sopt, optval);
break;
@@ -2423,17 +2422,17 @@ ip6_get_membership(const struct sockopt *sopt, struct ifnet **ifp,
* Set the IP6 multicast options in response to user setsockopt().
*/
static int
-ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
+ip6_setmoptions(const struct sockopt *sopt, struct inpcb *inp)
{
int error = 0;
u_int loop, ifindex;
struct ipv6_mreq mreq;
struct in6_addr ia;
struct ifnet *ifp;
- struct ip6_moptions *im6o = in6p->in6p_moptions;
+ struct ip6_moptions *im6o = inp->inp_moptions6;
struct in6_multi_mship *imm;
- KASSERT(in6p_locked(in6p));
+ KASSERT(inp_locked(inp));
if (im6o == NULL) {
/*
@@ -2443,7 +2442,7 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
im6o = malloc(sizeof(*im6o), M_IPMOPTS, M_NOWAIT);
if (im6o == NULL)
return (ENOBUFS);
- in6p->in6p_moptions = im6o;
+ inp->inp_moptions6 = im6o;
im6o->im6o_multicast_if_index = 0;
im6o->im6o_multicast_hlim = ip6_defmcasthlim;
im6o->im6o_multicast_loop = IPV6_DEFAULT_MULTICAST_LOOP;
@@ -2532,7 +2531,7 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
}
if (IN6_IS_ADDR_V4MAPPED(&ia)) {
- error = ip_setmoptions(&in6p->in6p_v4moptions, sopt);
+ error = ip_setmoptions(&inp->inp_moptions, sopt);
goto put_break;
}
/*
@@ -2586,7 +2585,7 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
break;
if (IN6_IS_ADDR_V4MAPPED(&mreq.ipv6mr_multiaddr)) {
- error = ip_setmoptions(&in6p->in6p_v4moptions, sopt);
+ error = ip_setmoptions(&inp->inp_moptions, sopt);
break;
}
/*
@@ -2659,7 +2658,7 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
*/
LIST_REMOVE(imm, i6mm_chain);
in6_leavegroup(imm);
- /* in6m_ifp should not leave thanks to in6p_lock */
+ /* in6m_ifp should not leave thanks to inp_lock */
break;
}
@@ -2675,8 +2674,8 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
im6o->im6o_multicast_hlim == ip6_defmcasthlim &&
im6o->im6o_multicast_loop == IPV6_DEFAULT_MULTICAST_LOOP &&
LIST_EMPTY(&im6o->im6o_memberships)) {
- free(in6p->in6p_moptions, M_IPMOPTS);
- in6p->in6p_moptions = NULL;
+ free(inp->inp_moptions6, M_IPMOPTS);
+ inp->inp_moptions6 = NULL;
}
return (error);
@@ -2686,11 +2685,11 @@ ip6_setmoptions(const struct sockopt *sopt, struct in6pcb *in6p)
* Return the IP6 multicast options in response to user getsockopt().
*/
static int
-ip6_getmoptions(struct sockopt *sopt, struct in6pcb *in6p)
+ip6_getmoptions(struct sockopt *sopt, struct inpcb *inp)
{
u_int optval;
int error;
- struct ip6_moptions *im6o = in6p->in6p_moptions;
+ struct ip6_moptions *im6o = inp->inp_moptions6;
switch (sopt->sopt_name) {
case IPV6_MULTICAST_IF:
@@ -2738,7 +2737,7 @@ ip6_freemoptions(struct ip6_moptions *im6o)
if (im6o == NULL)
return;
- /* The owner of im6o (in6p) should be protected by solock */
+ /* The owner of im6o (inp) should be protected by solock */
LIST_FOREACH_SAFE(imm, &im6o->im6o_memberships, i6mm_chain, nimm) {
LIST_REMOVE(imm, i6mm_chain);
in6_leavegroup(imm);
@@ -3299,21 +3298,21 @@ ip6_splithdr(struct mbuf *m, struct ip6_exthdrs *exthdrs)
* Compute IPv6 extension header length.
*/
int
-ip6_optlen(struct in6pcb *in6p)
+ip6_optlen(struct inpcb *inp)
{
int len;
- if (!in6p->in6p_outputopts)
+ if (!inp->inp_outputopts6)
return 0;
len = 0;
#define elen(x) \
(((struct ip6_ext *)(x)) ? (((struct ip6_ext *)(x))->ip6e_len + 1) << 3 : 0)
- len += elen(in6p->in6p_outputopts->ip6po_hbh);
- len += elen(in6p->in6p_outputopts->ip6po_dest1);
- len += elen(in6p->in6p_outputopts->ip6po_rthdr);
- len += elen(in6p->in6p_outputopts->ip6po_dest2);
+ len += elen(inp->inp_outputopts6->ip6po_hbh);
+ len += elen(inp->inp_outputopts6->ip6po_dest1);
+ len += elen(inp->inp_outputopts6->ip6po_rthdr);
+ len += elen(inp->inp_outputopts6->ip6po_dest2);
return len;
#undef elen
}
diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h
index 920055c4759..6c689cddb9b 100644
--- a/sys/netinet6/ip6_var.h
+++ b/sys/netinet6/ip6_var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_var.h,v 1.92 2022/10/24 01:54:19 knakahara Exp $ */
+/* $NetBSD: ip6_var.h,v 1.93 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $ */
/*
@@ -288,7 +288,7 @@ extern int ip6_maxflows; /* maximum amount of flows for ip6ff */
extern int ip6_hashsize; /* size of hash table */
#endif
-struct in6pcb;
+struct inpcb;
extern const struct pr_usrreqs rip6_usrreqs;
int icmp6_ctloutput(int, struct socket *, struct sockopt *);
@@ -306,9 +306,9 @@ int ip6_lasthdr(struct mbuf *, int, int, int *);
struct ip6_hdr;
int ip6_mforward(struct ip6_hdr *, struct ifnet *, struct mbuf *);
int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *);
-void ip6_savecontrol(struct in6pcb *, struct mbuf **, struct ip6_hdr *,
+void ip6_savecontrol(struct inpcb *, struct mbuf **, struct ip6_hdr *,
struct mbuf *);
-void ip6_notify_pmtu(struct in6pcb *, const struct sockaddr_in6 *,
+void ip6_notify_pmtu(struct inpcb *, const struct sockaddr_in6 *,
u_int32_t *);
int ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
@@ -317,7 +317,7 @@ void ip6_forward(struct mbuf *, int, struct ifnet *);
void ip6_mloopback(struct ifnet *, struct mbuf *,
const struct sockaddr_in6 *);
int ip6_output(struct mbuf *, struct ip6_pktopts *, struct route *, int,
- struct ip6_moptions *, struct in6pcb *, struct ifnet **);
+ struct ip6_moptions *, struct inpcb *, struct ifnet **);
int ip6_if_output(struct ifnet * const, struct ifnet * const,
struct mbuf * const,
const struct sockaddr_in6 * const, const struct rtentry *);
@@ -328,7 +328,7 @@ int ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
struct ip6_pktopts *, kauth_cred_t, int);
void ip6_clearpktopts(struct ip6_pktopts *, int);
struct ip6_pktopts *ip6_copypktopts(struct ip6_pktopts *, int);
-int ip6_optlen(struct in6pcb *);
+int ip6_optlen(struct inpcb *);
void ip6_statinc(u_int);
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 8e0694947de..b2dcbedd6b4 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_ip6.c,v 1.178 2022/05/28 10:36:23 andvar Exp $ */
+/* $NetBSD: raw_ip6.c,v 1.179 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.178 2022/05/28 10:36:23 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.179 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_ipsec.h"
@@ -135,24 +135,24 @@ rip6_init(void)
}
static void
-rip6_sbappendaddr(struct in6pcb *last, struct ip6_hdr *ip6,
+rip6_sbappendaddr(struct inpcb *last, struct ip6_hdr *ip6,
const struct sockaddr *sa, int hlen, struct mbuf *n)
{
struct mbuf *opts = NULL;
- if (last->in6p_flags & IN6P_CONTROLOPTS)
+ if (last->inp_flags & IN6P_CONTROLOPTS)
ip6_savecontrol(last, &opts, ip6, n);
m_adj(n, hlen);
- if (sbappendaddr(&last->in6p_socket->so_rcv, sa, n, opts) == 0) {
- soroverflow(last->in6p_socket);
+ if (sbappendaddr(&last->inp_socket->so_rcv, sa, n, opts) == 0) {
+ soroverflow(last->inp_socket);
m_freem(n);
if (opts)
m_freem(opts);
RIP6_STATINC(RIP6_STAT_FULLSOCK);
} else {
- sorwakeup(last->in6p_socket);
+ sorwakeup(last->inp_socket);
}
}
@@ -166,9 +166,8 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
{
struct mbuf *m = *mp;
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
- struct inpcb_hdr *inph;
- struct in6pcb *in6p;
- struct in6pcb *last = NULL;
+ struct inpcb *inp;
+ struct inpcb *last = NULL;
struct sockaddr_in6 rip6src;
struct mbuf *n;
@@ -189,20 +188,19 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
return IPPROTO_DONE;
}
- TAILQ_FOREACH(inph, &raw6cbtable.inpt_queue, inph_queue) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ TAILQ_FOREACH(inp, &raw6cbtable.inpt_queue, inp_queue) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (in6p->in6p_ip6.ip6_nxt &&
- in6p->in6p_ip6.ip6_nxt != proto)
+ if (inp->inp_ip6.ip6_nxt &&
+ inp->inp_ip6.ip6_nxt != proto)
continue;
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
- !IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &ip6->ip6_dst))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) &&
+ !IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, &ip6->ip6_dst))
continue;
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) &&
- !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6) &&
+ !IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, &ip6->ip6_src))
continue;
- if (in6p->in6p_cksum != -1) {
+ if (inp->inp_cksum6 != -1) {
RIP6_STATINC(RIP6_STAT_ISUM);
if (in6_cksum(m, proto, *offp,
m->m_pkthdr.len - *offp)) {
@@ -224,7 +222,7 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
*offp, n);
}
- last = in6p;
+ last = inp;
}
#ifdef IPSEC
@@ -264,7 +262,7 @@ rip6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
struct ip6ctlparam *ip6cp = NULL;
const struct sockaddr_in6 *sa6_src = NULL;
void *cmdarg;
- void (*notify)(struct in6pcb *, int) = in6_rtchange;
+ void (*notify)(struct inpcb *, int) = in6_rtchange;
int nxt;
if (sa->sa_family != AF_INET6 ||
@@ -299,7 +297,7 @@ rip6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
if (ip6 && cmd == PRC_MSGSIZE) {
const struct sockaddr_in6 *sa6 = (const struct sockaddr_in6 *)sa;
int valid = 0;
- struct in6pcb *in6p;
+ struct inpcb *inp;
/*
* Check to see if we have a valid raw IPv6 socket
@@ -308,11 +306,11 @@ rip6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
* XXX chase extension headers, or pass final nxt value
* from icmp6_notify_error()
*/
- in6p = NULL;
- in6p = in6_pcblookup_connect(&raw6cbtable, &sa6->sin6_addr, 0,
+ inp = NULL;
+ inp = in6_pcblookup_connect(&raw6cbtable, &sa6->sin6_addr, 0,
(const struct in6_addr *)&sa6_src->sin6_addr, 0, 0, 0);
#if 0
- if (!in6p) {
+ if (!inp) {
/*
* As the use of sendto(2) is fairly popular,
* we may want to allow non-connected pcb too.
@@ -320,13 +318,13 @@ rip6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
* We should at least check if the local
* address (= s) is really ours.
*/
- in6p = in6_pcblookup_bind(&raw6cbtable,
+ inp = in6_pcblookup_bind(&raw6cbtable,
&sa6->sin6_addr, 0, 0);
}
#endif
- if (in6p && in6p->in6p_ip6.ip6_nxt &&
- in6p->in6p_ip6.ip6_nxt == nxt)
+ if (inp && inp->inp_ip6.ip6_nxt &&
+ inp->inp_ip6.ip6_nxt == nxt)
valid++;
/*
@@ -362,7 +360,7 @@ rip6_output(struct mbuf *m, struct socket * const so,
{
struct in6_addr *dst;
struct ip6_hdr *ip6;
- struct in6pcb *in6p;
+ struct inpcb *inp;
u_int plen = m->m_pkthdr.len;
int error = 0;
struct ip6_pktopts opt, *optp = NULL;
@@ -372,18 +370,18 @@ rip6_output(struct mbuf *m, struct socket * const so,
int bound = curlwp_bind();
struct psref psref;
- in6p = sotoin6pcb(so);
+ inp = sotoinpcb(so);
dst = &dstsock->sin6_addr;
if (control) {
if ((error = ip6_setpktopts(control, &opt,
- in6p->in6p_outputopts,
+ inp->inp_outputopts6,
kauth_cred_get(), so->so_proto->pr_protocol)) != 0) {
goto bad;
}
optp = &opt;
} else
- optp = in6p->in6p_outputopts;
+ optp = inp->inp_outputopts6;
/*
* Check and convert scope zone ID into internal form.
@@ -430,8 +428,8 @@ rip6_output(struct mbuf *m, struct socket * const so,
/*
* Source address selection.
*/
- error = in6_selectsrc(dstsock, optp, in6p->in6p_moptions,
- &in6p->in6p_route, &in6p->in6p_laddr, &oifp, &psref, &ip6->ip6_src);
+ error = in6_selectsrc(dstsock, optp, inp->inp_moptions6,
+ &inp->inp_route, &inp->inp_laddr6, &oifp, &psref, &ip6->ip6_src);
if (error != 0)
goto bad;
@@ -451,18 +449,18 @@ rip6_output(struct mbuf *m, struct socket * const so,
ip6->ip6_dst = dstsock->sin6_addr;
/* fill in the rest of the IPv6 header fields */
- ip6->ip6_flow = in6p->in6p_flowinfo & IPV6_FLOWINFO_MASK;
+ ip6->ip6_flow = inp->inp_flowinfo & IPV6_FLOWINFO_MASK;
ip6->ip6_vfc &= ~IPV6_VERSION_MASK;
ip6->ip6_vfc |= IPV6_VERSION;
/* ip6_plen will be filled in ip6_output, so not fill it here. */
- ip6->ip6_nxt = in6p->in6p_ip6.ip6_nxt;
- ip6->ip6_hlim = in6_selecthlim(in6p, oifp);
+ ip6->ip6_nxt = inp->inp_ip6.ip6_nxt;
+ ip6->ip6_hlim = in6_selecthlim(inp, oifp);
if_put(oifp, &psref);
oifp = NULL;
if (so->so_proto->pr_protocol == IPPROTO_ICMPV6 ||
- in6p->in6p_cksum != -1) {
+ inp->inp_cksum6 != -1) {
const uint8_t nxt = ip6->ip6_nxt;
int off;
u_int16_t sum;
@@ -471,7 +469,7 @@ rip6_output(struct mbuf *m, struct socket * const so,
if (so->so_proto->pr_protocol == IPPROTO_ICMPV6)
off = offsetof(struct icmp6_hdr, icmp6_cksum);
else
- off = in6p->in6p_cksum;
+ off = inp->inp_cksum6;
if (plen < off + 1) {
error = EINVAL;
goto bad;
@@ -497,8 +495,8 @@ rip6_output(struct mbuf *m, struct socket * const so,
{
struct ifnet *ret_oifp = NULL;
- error = ip6_output(m, optp, &in6p->in6p_route, 0,
- in6p->in6p_moptions, in6p, &ret_oifp);
+ error = ip6_output(m, optp, &inp->inp_route, 0,
+ inp->inp_moptions6, inp, &ret_oifp);
if (so->so_proto->pr_protocol == IPPROTO_ICMPV6) {
if (ret_oifp)
icmp6_ifoutstat_inc(ret_oifp, type, code);
@@ -580,10 +578,10 @@ extern u_long rip6_recvspace;
int
rip6_attach(struct socket *so, int proto)
{
- struct in6pcb *in6p;
+ struct inpcb *inp;
int s, error;
- KASSERT(sotoin6pcb(so) == NULL);
+ KASSERT(sotoinpcb(so) == NULL);
sosetlock(so);
error = kauth_authorize_network(kauth_cred_get(),
@@ -600,17 +598,17 @@ rip6_attach(struct socket *so, int proto)
splx(s);
return error;
}
- if ((error = in6_pcballoc(so, &raw6cbtable)) != 0) {
+ if ((error = in_pcballoc(so, &raw6cbtable)) != 0) {
splx(s);
return error;
}
splx(s);
- in6p = sotoin6pcb(so);
- in6p->in6p_ip6.ip6_nxt = proto;
- in6p->in6p_cksum = -1;
+ inp = sotoinpcb(so);
+ inp->inp_ip6.ip6_nxt = proto;
+ inp->inp_cksum6 = -1;
- in6p->in6p_icmp6filt = kmem_alloc(sizeof(struct icmp6_filter), KM_SLEEP);
- ICMP6_FILTER_SETPASSALL(in6p->in6p_icmp6filt);
+ inp->inp_icmp6filt = kmem_alloc(sizeof(struct icmp6_filter), KM_SLEEP);
+ ICMP6_FILTER_SETPASSALL(inp->inp_icmp6filt);
KASSERT(solocked(so));
return error;
}
@@ -618,20 +616,20 @@ rip6_attach(struct socket *so, int proto)
static void
rip6_detach(struct socket *so)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
if (so == ip6_mrouter) {
ip6_mrouter_done();
}
/* xxx: RSVP */
- if (in6p->in6p_icmp6filt != NULL) {
- kmem_free(in6p->in6p_icmp6filt, sizeof(struct icmp6_filter));
- in6p->in6p_icmp6filt = NULL;
+ if (inp->inp_icmp6filt != NULL) {
+ kmem_free(inp->inp_icmp6filt, sizeof(struct icmp6_filter));
+ inp->inp_icmp6filt = NULL;
}
- in6_pcbdetach(in6p);
+ in_pcbdetach(inp);
}
static int
@@ -645,14 +643,14 @@ rip6_accept(struct socket *so, struct sockaddr *nam)
static int
rip6_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)nam;
struct ifaddr *ifa = NULL;
int error = 0;
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
KASSERT(nam != NULL);
if (addr->sin6_len != sizeof(*addr))
@@ -681,7 +679,7 @@ rip6_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
goto out;
}
- in6p->in6p_laddr = addr->sin6_addr;
+ inp->inp_laddr6 = addr->sin6_addr;
error = 0;
out:
pserialize_read_exit(s);
@@ -699,7 +697,7 @@ rip6_listen(struct socket *so, struct lwp *l)
static int
rip6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)nam;
struct in6_addr in6a;
struct ifnet *ifp = NULL;
@@ -709,7 +707,7 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
int bound;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
KASSERT(nam != NULL);
if (IFNET_READER_EMPTY())
@@ -734,9 +732,9 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
bound = curlwp_bind();
/* Source address selection. XXX: need pcblookup? */
- error = in6_selectsrc(addr, in6p->in6p_outputopts,
- in6p->in6p_moptions, &in6p->in6p_route,
- &in6p->in6p_laddr, &ifp, &psref, &in6a);
+ error = in6_selectsrc(addr, inp->inp_outputopts6,
+ inp->inp_moptions6, &inp->inp_route,
+ &inp->inp_laddr6, &ifp, &psref, &in6a);
if (error != 0)
goto out;
/* XXX: see above */
@@ -744,8 +742,8 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
(error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
goto out;
}
- in6p->in6p_laddr = in6a;
- in6p->in6p_faddr = addr->sin6_addr;
+ inp->inp_laddr6 = in6a;
+ inp->inp_faddr6 = addr->sin6_addr;
soisconnected(so);
out:
if_put(ifp, &psref);
@@ -764,15 +762,15 @@ rip6_connect2(struct socket *so, struct socket *so2)
static int
rip6_disconnect(struct socket *so)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
if ((so->so_state & SS_ISCONNECTED) == 0)
return ENOTCONN;
- in6p->in6p_faddr = in6addr_any;
+ inp->inp_faddr6 = in6addr_any;
so->so_state &= ~SS_ISCONNECTED; /* XXX */
return 0;
}
@@ -818,10 +816,10 @@ static int
rip6_peeraddr(struct socket *so, struct sockaddr *nam)
{
KASSERT(solocked(so));
- KASSERT(sotoin6pcb(so) != NULL);
+ KASSERT(sotoinpcb(so) != NULL);
KASSERT(nam != NULL);
- in6_setpeeraddr(sotoin6pcb(so), (struct sockaddr_in6 *)nam);
+ in6_setpeeraddr(sotoinpcb(so), (struct sockaddr_in6 *)nam);
return 0;
}
@@ -829,10 +827,10 @@ static int
rip6_sockaddr(struct socket *so, struct sockaddr *nam)
{
KASSERT(solocked(so));
- KASSERT(sotoin6pcb(so) != NULL);
+ KASSERT(sotoinpcb(so) != NULL);
KASSERT(nam != NULL);
- in6_setsockaddr(sotoin6pcb(so), (struct sockaddr_in6 *)nam);
+ in6_setsockaddr(sotoinpcb(so), (struct sockaddr_in6 *)nam);
return 0;
}
@@ -856,13 +854,13 @@ static int
rip6_send(struct socket *so, struct mbuf *m, struct sockaddr *nam,
struct mbuf *control, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in6 tmp;
struct sockaddr_in6 *dst;
int error = 0;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
KASSERT(m != NULL);
/*
@@ -877,7 +875,7 @@ rip6_send(struct socket *so, struct mbuf *m, struct sockaddr *nam,
goto release;
}
/* XXX */
- sockaddr_in6_init(&tmp, &in6p->in6p_faddr, 0, 0, 0);
+ sockaddr_in6_init(&tmp, &inp->inp_faddr6, 0, 0, 0);
dst = &tmp;
} else {
if (nam == NULL) {
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index 6bfa111ee6d..40c42b07124 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: udp6_usrreq.c,v 1.150 2021/02/19 14:52:00 christos Exp $ */
+/* $NetBSD: udp6_usrreq.c,v 1.151 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */
/* $KAME: udp6_output.c,v 1.43 2001/10/15 09:19:52 itojun Exp $ */
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.150 2021/02/19 14:52:00 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.151 2022/10/28 05:18:39 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -134,7 +134,7 @@ static int udp6_sendspace = 9216; /* really max datagram size */
static int udp6_recvspace = 40 * (1024 + sizeof(struct sockaddr_in6));
/* 40 1K datagrams */
-static void udp6_notify(struct in6pcb *, int);
+static void udp6_notify(struct inpcb *, int);
static void sysctl_net_inet6_udp6_setup(struct sysctllog **);
#ifdef IPSEC
static int udp6_espinudp(struct mbuf **, int);
@@ -175,11 +175,11 @@ udp6_init(void)
* just wake up so that he can collect error status.
*/
static void
-udp6_notify(struct in6pcb *in6p, int errno)
+udp6_notify(struct inpcb *inp, int errno)
{
- in6p->in6p_socket->so_error = errno;
- sorwakeup(in6p->in6p_socket);
- sowwakeup(in6p->in6p_socket);
+ inp->inp_socket->so_error = errno;
+ sorwakeup(inp->inp_socket);
+ sowwakeup(inp->inp_socket);
}
void *
@@ -193,7 +193,7 @@ udp6_ctlinput(int cmd, const struct sockaddr *sa, void *d)
void *cmdarg;
struct ip6ctlparam *ip6cp = NULL;
const struct sockaddr_in6 *sa6_src = NULL;
- void (*notify)(struct in6pcb *, int) = udp6_notify;
+ void (*notify)(struct inpcb *, int) = udp6_notify;
struct udp_portonly {
u_int16_t uh_sport;
u_int16_t uh_dport;
@@ -302,7 +302,7 @@ udp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
{
int s;
int error = 0;
- struct in6pcb *in6p;
+ struct inpcb *inp;
int family;
int optval;
@@ -333,7 +333,7 @@ udp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
switch (op) {
case PRCO_SETOPT:
- in6p = sotoin6pcb(so);
+ inp = sotoinpcb(so);
switch (sopt->sopt_name) {
case UDP_ENCAP:
@@ -343,11 +343,11 @@ udp6_ctloutput(int op, struct socket *so, struct sockopt *sopt)
switch(optval) {
case 0:
- in6p->in6p_flags &= ~IN6P_ESPINUDP;
+ inp->inp_flags &= ~IN6P_ESPINUDP;
break;
case UDP_ENCAP_ESPINUDP:
- in6p->in6p_flags |= IN6P_ESPINUDP;
+ inp->inp_flags |= IN6P_ESPINUDP;
break;
default:
@@ -378,15 +378,15 @@ udp6_sendup(struct mbuf *m, int off /* offset of data portion */,
{
struct mbuf *opts = NULL;
struct mbuf *n;
- struct in6pcb *in6p;
+ struct inpcb *inp;
KASSERT(so != NULL);
KASSERT(so->so_proto->pr_domain->dom_family == AF_INET6);
- in6p = sotoin6pcb(so);
- KASSERT(in6p != NULL);
+ inp = sotoinpcb(so);
+ KASSERT(inp != NULL);
#if defined(IPSEC)
- if (ipsec_used && ipsec_in_reject(m, in6p)) {
+ if (ipsec_used && ipsec_in_reject(m, inp)) {
if ((n = m_copypacket(m, M_DONTWAIT)) != NULL)
icmp6_error(n, ICMP6_DST_UNREACH,
ICMP6_DST_UNREACH_ADMIN, 0);
@@ -395,10 +395,10 @@ udp6_sendup(struct mbuf *m, int off /* offset of data portion */,
#endif
if ((n = m_copypacket(m, M_DONTWAIT)) != NULL) {
- if (in6p->in6p_flags & IN6P_CONTROLOPTS ||
- SOOPT_TIMESTAMP(in6p->in6p_socket->so_options)) {
+ if (inp->inp_flags & IN6P_CONTROLOPTS ||
+ SOOPT_TIMESTAMP(inp->inp_socket->so_options)) {
struct ip6_hdr *ip6 = mtod(n, struct ip6_hdr *);
- ip6_savecontrol(in6p, &opts, ip6, n);
+ ip6_savecontrol(inp, &opts, ip6, n);
}
m_adj(n, off);
@@ -421,8 +421,7 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
int rcvcnt;
struct in6_addr src6, *dst6;
const struct in_addr *dst4;
- struct inpcb_hdr *inph;
- struct in6pcb *in6p;
+ struct inpcb *inp;
struct mbuf *m = *mp;
rcvcnt = 0;
@@ -469,33 +468,32 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
/*
* Locate pcb(s) for datagram.
*/
- TAILQ_FOREACH(inph, &udbtable.inpt_queue, inph_queue) {
- in6p = (struct in6pcb *)inph;
- if (in6p->in6p_af != AF_INET6)
+ TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
+ if (inp->inp_af != AF_INET6)
continue;
- if (in6p->in6p_lport != dport)
+ if (inp->inp_lport != dport)
continue;
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
- if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr,
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6)) {
+ if (!IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6,
dst6))
continue;
} else {
if (IN6_IS_ADDR_V4MAPPED(dst6) &&
- (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
+ (inp->inp_flags & IN6P_IPV6_V6ONLY))
continue;
}
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
- if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr,
- &src6) || in6p->in6p_fport != sport)
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6)) {
+ if (!IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6,
+ &src6) || inp->inp_fport != sport)
continue;
} else {
if (IN6_IS_ADDR_V4MAPPED(&src6) &&
- (in6p->in6p_flags & IN6P_IPV6_V6ONLY))
+ (inp->inp_flags & IN6P_IPV6_V6ONLY))
continue;
}
- udp6_sendup(m, off, sin6tosa(src), in6p->in6p_socket);
+ udp6_sendup(m, off, sin6tosa(src), inp->inp_socket);
rcvcnt++;
/*
@@ -506,7 +504,7 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
* port. It assumes that an application will never
* clear these options after setting them.
*/
- if ((in6p->in6p_socket->so_options &
+ if ((inp->inp_socket->so_options &
(SO_REUSEPORT|SO_REUSEADDR)) == 0)
break;
}
@@ -514,18 +512,18 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
/*
* Locate pcb for datagram.
*/
- in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,
+ inp = in6_pcblookup_connect(&udbtable, &src6, sport, dst6,
dport, 0, 0);
- if (in6p == 0) {
+ if (inp == NULL) {
UDP_STATINC(UDP_STAT_PCBHASHMISS);
- in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0);
- if (in6p == 0)
+ inp = in6_pcblookup_bind(&udbtable, dst6, dport, 0);
+ if (inp == NULL)
return rcvcnt;
}
#ifdef IPSEC
/* Handle ESP over UDP */
- if (in6p->in6p_flags & IN6P_ESPINUDP) {
+ if (inp->inp_flags & IN6P_ESPINUDP) {
switch (udp6_espinudp(mp, off)) {
case -1: /* Error, m was freed */
rcvcnt = -1;
@@ -547,10 +545,10 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
}
#endif
- if (in6p->in6p_overudp_cb != NULL) {
+ if (inp->inp_overudp_cb != NULL) {
int ret;
- ret = in6p->in6p_overudp_cb(mp, off, in6p->in6p_socket,
- sin6tosa(src), in6p->in6p_overudp_arg);
+ ret = inp->inp_overudp_cb(mp, off, inp->inp_socket,
+ sin6tosa(src), inp->inp_overudp_arg);
switch (ret) {
case -1: /* Error, m was freed */
rcvcnt = -1;
@@ -571,7 +569,7 @@ udp6_realinput(int af, struct sockaddr_in6 *src, struct sockaddr_in6 *dst,
}
}
- udp6_sendup(m, off, sin6tosa(src), in6p->in6p_socket);
+ udp6_sendup(m, off, sin6tosa(src), inp->inp_socket);
rcvcnt++;
}
@@ -731,7 +729,7 @@ bad:
}
int
-udp6_output(struct in6pcb * const in6p, struct mbuf *m,
+udp6_output(struct inpcb * const inp, struct mbuf *m,
struct sockaddr_in6 * const addr6, struct mbuf * const control,
struct lwp * const l)
{
@@ -790,11 +788,11 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
panic("%s: control but no lwp", __func__);
}
if ((error = ip6_setpktopts(control, &opt,
- in6p->in6p_outputopts, l->l_cred, IPPROTO_UDP)) != 0)
+ inp->inp_outputopts6, l->l_cred, IPPROTO_UDP)) != 0)
goto release;
optp = &opt;
} else
- optp = in6p->in6p_outputopts;
+ optp = inp->inp_outputopts6;
if (sin6) {
@@ -802,7 +800,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
* Slightly different than v4 version in that we call
* in6_selectsrc and in6_pcbsetport to fill in the local
* address and port rather than in_pcbconnect. in_pcbconnect
- * sets in6p_faddr which causes EISCONN below to be hit on
+ * sets inp_faddr which causes EISCONN below to be hit on
* subsequent sendto.
*/
if (sin6->sin6_port == 0) {
@@ -810,7 +808,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
goto release;
}
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6)) {
/* how about ::ffff:0.0.0.0 case? */
error = EISCONN;
goto release;
@@ -820,7 +818,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
fport = sin6->sin6_port; /* allow 0 port */
if (IN6_IS_ADDR_V4MAPPED(faddr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY)) {
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY)) {
/*
* I believe we should explicitly discard the
* packet when mapped addresses are disabled,
@@ -834,8 +832,8 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
error = EINVAL;
goto release;
}
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr) &&
- !IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr)) {
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) &&
+ !IN6_IS_ADDR_V4MAPPED(&inp->inp_laddr6)) {
/*
* when remote addr is an IPv4-mapped address,
* local addr should not be an IPv6 address,
@@ -854,9 +852,9 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
int bound = curlwp_bind();
error = in6_selectsrc(sin6, optp,
- in6p->in6p_moptions,
- &in6p->in6p_route,
- &in6p->in6p_laddr, &oifp, &psref, &_laddr);
+ inp->inp_moptions6,
+ &inp->inp_route,
+ &inp->inp_laddr6, &oifp, &psref, &_laddr);
if (error)
laddr = NULL;
else
@@ -877,7 +875,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
* udp_output() directly in this case, and thus we'll
* never see this path.
*/
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6)) {
struct sockaddr_in sin_dst;
struct in_addr ina;
struct in_ifaddr *ia4;
@@ -887,8 +885,8 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
memcpy(&ina, &faddr->s6_addr[12], sizeof(ina));
sockaddr_in_init(&sin_dst, &ina, 0);
bound = curlwp_bind();
- ia4 = in_selectsrc(&sin_dst, &in6p->in6p_route,
- in6p->in6p_socket->so_options, NULL,
+ ia4 = in_selectsrc(&sin_dst, &inp->inp_route,
+ inp->inp_socket->so_options, NULL,
&error, &_psref);
if (ia4 == NULL) {
curlwp_bindx(bound);
@@ -906,7 +904,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
laddr = &laddr_mapped;
} else
{
- laddr = &in6p->in6p_laddr; /* XXX */
+ laddr = &inp->inp_laddr6; /* XXX */
}
}
if (laddr == NULL) {
@@ -914,33 +912,33 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
error = EADDRNOTAVAIL;
goto release;
}
- if (in6p->in6p_lport == 0) {
+ if (inp->inp_lport == 0) {
/*
* Craft a sockaddr_in6 for the local endpoint. Use the
* "any" as a base, set the address, and recover the
* scope.
*/
struct sockaddr_in6 lsin6 =
- *((const struct sockaddr_in6 *)in6p->in6p_socket->so_proto->pr_domain->dom_sa_any);
+ *((const struct sockaddr_in6 *)inp->inp_socket->so_proto->pr_domain->dom_sa_any);
lsin6.sin6_addr = *laddr;
error = sa6_recoverscope(&lsin6);
if (error)
goto release;
- error = in6_pcbsetport(&lsin6, in6p, l);
+ error = in6_pcbsetport(&lsin6, inp, l);
if (error) {
- in6p->in6p_laddr = in6addr_any;
+ inp->inp_laddr6 = in6addr_any;
goto release;
}
}
} else {
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6)) {
error = ENOTCONN;
goto release;
}
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)) {
- if ((in6p->in6p_flags & IN6P_IPV6_V6ONLY))
+ if (IN6_IS_ADDR_V4MAPPED(&inp->inp_faddr6)) {
+ if ((inp->inp_flags & IN6P_IPV6_V6ONLY))
{
/*
* XXX: this case would happen when the
@@ -956,9 +954,9 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
} else
af = AF_INET;
}
- laddr = &in6p->in6p_laddr;
- faddr = &in6p->in6p_faddr;
- fport = in6p->in6p_fport;
+ laddr = &inp->inp_laddr6;
+ faddr = &inp->inp_faddr6;
+ fport = inp->inp_fport;
}
if (af == AF_INET)
@@ -978,7 +976,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
* Stuff checksum and output datagram.
*/
udp6 = (struct udphdr *)(mtod(m, char *) + hlen);
- udp6->uh_sport = in6p->in6p_lport; /* lport is always set in the PCB */
+ udp6->uh_sport = inp->inp_lport; /* lport is always set in the PCB */
udp6->uh_dport = fport;
if (plen <= 0xffff)
udp6->uh_ulen = htons((u_int16_t)plen);
@@ -989,14 +987,14 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
switch (af) {
case AF_INET6:
ip6 = mtod(m, struct ip6_hdr *);
- ip6->ip6_flow = in6p->in6p_flowinfo & IPV6_FLOWINFO_MASK;
+ ip6->ip6_flow = inp->inp_flowinfo & IPV6_FLOWINFO_MASK;
ip6->ip6_vfc &= ~IPV6_VERSION_MASK;
ip6->ip6_vfc |= IPV6_VERSION;
#if 0 /* ip6_plen will be filled in ip6_output. */
ip6->ip6_plen = htons((u_int16_t)plen);
#endif
ip6->ip6_nxt = IPPROTO_UDP;
- ip6->ip6_hlim = in6_selecthlim_rt(in6p);
+ ip6->ip6_hlim = in6_selecthlim_rt(inp);
ip6->ip6_src = *laddr;
ip6->ip6_dst = *faddr;
@@ -1006,8 +1004,8 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
UDP6_STATINC(UDP6_STAT_OPACKETS);
- error = ip6_output(m, optp, &in6p->in6p_route, 0,
- in6p->in6p_moptions, in6p, NULL);
+ error = ip6_output(m, optp, &inp->inp_route, 0,
+ inp->inp_moptions6, inp, NULL);
break;
case AF_INET:
#ifdef INET
@@ -1025,7 +1023,7 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
memcpy(&ui->ui_src, &laddr->s6_addr[12], sizeof(ui->ui_src));
ui->ui_ulen = ui->ui_len;
- flags = (in6p->in6p_socket->so_options &
+ flags = (inp->inp_socket->so_options &
(SO_DONTROUTE | SO_BROADCAST));
memcpy(&ui->ui_dst, &faddr->s6_addr[12], sizeof(ui->ui_dst));
@@ -1034,12 +1032,12 @@ udp6_output(struct in6pcb * const in6p, struct mbuf *m,
udp6->uh_sum = 0xffff;
ip->ip_len = htons(hlen + plen);
- ip->ip_ttl = in6_selecthlim(in6p, NULL); /* XXX */
+ ip->ip_ttl = in6_selecthlim(inp, NULL); /* XXX */
ip->ip_tos = 0; /* XXX */
UDP_STATINC(UDP_STAT_OPACKETS);
- error = ip_output(m, NULL, &in6p->in6p_route, flags /* XXX */,
- in6p->in6p_v4moptions, NULL);
+ error = ip_output(m, NULL, &inp->inp_route, flags /* XXX */,
+ inp->inp_moptions, NULL);
break;
#else
error = EAFNOSUPPORT;
@@ -1063,10 +1061,10 @@ releaseopt:
static int
udp6_attach(struct socket *so, int proto)
{
- struct in6pcb *in6p;
+ struct inpcb *inp;
int s, error;
- KASSERT(sotoin6pcb(so) == NULL);
+ KASSERT(sotoinpcb(so) == NULL);
sosetlock(so);
error = soreserve(so, udp6_sendspace, udp6_recvspace);
@@ -1079,14 +1077,14 @@ udp6_attach(struct socket *so, int proto)
* Always attach for IPv6, and only when necessary for IPv4.
*/
s = splsoftnet();
- error = in6_pcballoc(so, &udbtable);
+ error = in_pcballoc(so, &udbtable);
splx(s);
if (error) {
return error;
}
- in6p = sotoin6pcb(so);
- in6p->in6p_cksum = -1; /* just to be sure */
+ inp = sotoinpcb(so);
+ inp->inp_cksum6 = -1; /* just to be sure */
KASSERT(solocked(so));
return 0;
@@ -1095,14 +1093,14 @@ udp6_attach(struct socket *so, int proto)
static void
udp6_detach(struct socket *so)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
s = splsoftnet();
- in6_pcbdetach(in6p);
+ in_pcbdetach(inp);
splx(s);
}
@@ -1117,16 +1115,16 @@ udp6_accept(struct socket *so, struct sockaddr *nam)
static int
udp6_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
int error = 0;
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
s = splsoftnet();
- error = in6_pcbbind(in6p, sin6, l);
+ error = in6_pcbbind(inp, sin6, l);
splx(s);
return error;
}
@@ -1142,17 +1140,17 @@ udp6_listen(struct socket *so, struct lwp *l)
static int
udp6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
int error = 0;
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+ if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
return EISCONN;
s = splsoftnet();
- error = in6_pcbconnect(in6p, (struct sockaddr_in6 *)nam, l);
+ error = in6_pcbconnect(inp, (struct sockaddr_in6 *)nam, l);
splx(s);
if (error == 0)
soisconnected(so);
@@ -1171,22 +1169,22 @@ udp6_connect2(struct socket *so, struct socket *so2)
static int
udp6_disconnect(struct socket *so)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
- if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+ if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
return ENOTCONN;
s = splsoftnet();
- in6_pcbdisconnect(in6p);
- memset((void *)&in6p->in6p_laddr, 0, sizeof(in6p->in6p_laddr));
+ in6_pcbdisconnect(inp);
+ memset((void *)&inp->inp_laddr6, 0, sizeof(inp->inp_laddr6));
splx(s);
so->so_state &= ~SS_ISCONNECTED; /* XXX */
- in6_pcbstate(in6p, IN6P_BOUND); /* XXX */
+ in6_pcbstate(inp, INP_BOUND); /* XXX */
return 0;
}
@@ -1208,11 +1206,11 @@ udp6_abort(struct socket *so)
int s;
KASSERT(solocked(so));
- KASSERT(sotoin6pcb(so) != NULL);
+ KASSERT(sotoinpcb(so) != NULL);
s = splsoftnet();
soisdisconnected(so);
- in6_pcbdetach(sotoin6pcb(so));
+ in_pcbdetach(sotoinpcb(so));
splx(s);
return 0;
@@ -1247,10 +1245,10 @@ static int
udp6_peeraddr(struct socket *so, struct sockaddr *nam)
{
KASSERT(solocked(so));
- KASSERT(sotoin6pcb(so) != NULL);
+ KASSERT(sotoinpcb(so) != NULL);
KASSERT(nam != NULL);
- in6_setpeeraddr(sotoin6pcb(so), (struct sockaddr_in6 *)nam);
+ in6_setpeeraddr(sotoinpcb(so), (struct sockaddr_in6 *)nam);
return 0;
}
@@ -1258,10 +1256,10 @@ static int
udp6_sockaddr(struct socket *so, struct sockaddr *nam)
{
KASSERT(solocked(so));
- KASSERT(sotoin6pcb(so) != NULL);
+ KASSERT(sotoinpcb(so) != NULL);
KASSERT(nam != NULL);
- in6_setsockaddr(sotoin6pcb(so), (struct sockaddr_in6 *)nam);
+ in6_setsockaddr(sotoinpcb(so), (struct sockaddr_in6 *)nam);
return 0;
}
@@ -1285,16 +1283,16 @@ static int
udp6_send(struct socket *so, struct mbuf *m, struct sockaddr *nam,
struct mbuf *control, struct lwp *l)
{
- struct in6pcb *in6p = sotoin6pcb(so);
+ struct inpcb *inp = sotoinpcb(so);
int error = 0;
int s;
KASSERT(solocked(so));
- KASSERT(in6p != NULL);
+ KASSERT(inp != NULL);
KASSERT(m != NULL);
s = splsoftnet();
- error = udp6_output(in6p, m, (struct sockaddr_in6 *)nam, control, l);
+ error = udp6_output(inp, m, (struct sockaddr_in6 *)nam, control, l);
splx(s);
return error;
diff --git a/sys/netinet6/udp6_var.h b/sys/netinet6/udp6_var.h
index c0e7864f7ae..34419adc9e5 100644
--- a/sys/netinet6/udp6_var.h
+++ b/sys/netinet6/udp6_var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: udp6_var.h,v 1.30 2018/11/22 04:48:34 knakahara Exp $ */
+/* $NetBSD: udp6_var.h,v 1.31 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $KAME: udp6_var.h,v 1.11 2000/06/05 00:14:31 itojun Exp $ */
/*
@@ -97,7 +97,7 @@ void *udp6_ctlinput(int, const struct sockaddr *, void *);
int udp6_ctloutput(int, struct socket *, struct sockopt *);
void udp6_init(void);
int udp6_input(struct mbuf **, int *, int);
-int udp6_output(struct in6pcb *, struct mbuf *, struct sockaddr_in6 *,
+int udp6_output(struct inpcb *, struct mbuf *, struct sockaddr_in6 *,
struct mbuf *, struct lwp *);
int udp6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
int udp6_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
diff --git a/sys/netipsec/ipsec.c b/sys/netipsec/ipsec.c
index 759afaef807..030d0b1304b 100644
--- a/sys/netipsec/ipsec.c
+++ b/sys/netipsec/ipsec.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec.c,v 1.173 2021/12/08 20:03:26 andvar Exp $ */
+/* $NetBSD: ipsec.c,v 1.174 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $FreeBSD: ipsec.c,v 1.2.2.2 2003/07/01 01:38:13 sam Exp $ */
/* $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.173 2021/12/08 20:03:26 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.174 2022/10/28 05:18:39 ozaki-r Exp $");
/*
* IPsec controller part.
@@ -160,7 +160,7 @@ static int ipsec_invalpcbcache(struct inpcbpolicy *, int);
int crypto_support = 0;
static struct secpolicy *ipsec_getpolicybysock(struct mbuf *, u_int,
- struct inpcb_hdr *, int *);
+ struct inpcb *, int *);
#ifdef INET6
int ip6_esp_trans_deflev = IPSEC_LEVEL_USE;
@@ -171,7 +171,7 @@ struct secpolicy ip6_def_policy;
int ip6_ipsec_ecn = 0; /* ECN ignore(-1)/forbidden(0)/allowed(1) */
#endif
-static int ipsec_setspidx_inpcb(struct mbuf *, void *);
+static int ipsec_setspidx_inpcb(struct mbuf *, struct inpcb *);
static int ipsec_setspidx(struct mbuf *, struct secpolicyindex *, int, int);
static void ipsec4_get_ulp(struct mbuf *m, struct secpolicyindex *, int);
static int ipsec4_setspidx_ipaddr(struct mbuf *, struct secpolicyindex *);
@@ -198,7 +198,7 @@ ipsec_checkpcbcache(struct mbuf *m, struct inpcbpolicy *pcbsp, int dir)
KASSERT(IPSEC_DIR_IS_VALID(dir));
KASSERT(pcbsp != NULL);
KASSERT(dir < __arraycount(pcbsp->sp_cache));
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
/*
* Checking the generation and sp->state and taking a reference to an SP
@@ -265,7 +265,7 @@ ipsec_fillpcbcache(struct inpcbpolicy *pcbsp, struct mbuf *m,
KASSERT(IPSEC_DIR_IS_INOROUT(dir));
KASSERT(dir < __arraycount(pcbsp->sp_cache));
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
pcbsp->sp_cache[dir].cachesp = NULL;
pcbsp->sp_cache[dir].cachehint = IPSEC_PCBHINT_UNKNOWN;
@@ -301,7 +301,7 @@ ipsec_invalpcbcache(struct inpcbpolicy *pcbsp, int dir)
{
int i;
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
for (i = IPSEC_DIR_INBOUND; i <= IPSEC_DIR_OUTBOUND; i++) {
if (dir != IPSEC_DIR_ANY && i != dir)
@@ -319,7 +319,7 @@ void
ipsec_pcbconn(struct inpcbpolicy *pcbsp)
{
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
pcbsp->sp_cacheflags |= IPSEC_PCBSP_CONNECTED;
ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
@@ -329,7 +329,7 @@ void
ipsec_pcbdisconn(struct inpcbpolicy *pcbsp)
{
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
pcbsp->sp_cacheflags &= ~IPSEC_PCBSP_CONNECTED;
ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
@@ -399,7 +399,7 @@ key_get_default_sp(int af, const char *where, int tag)
* NOTE: IPv6 mapped address concern is implemented here.
*/
static struct secpolicy *
-ipsec_getpolicybysock(struct mbuf *m, u_int dir, struct inpcb_hdr *inph,
+ipsec_getpolicybysock(struct mbuf *m, u_int dir, struct inpcb *inp,
int *error)
{
struct inpcbpolicy *pcbsp = NULL;
@@ -408,22 +408,22 @@ ipsec_getpolicybysock(struct mbuf *m, u_int dir, struct inpcb_hdr *inph,
int af;
KASSERT(m != NULL);
- KASSERT(inph != NULL);
+ KASSERT(inp != NULL);
KASSERT(error != NULL);
KASSERTMSG(IPSEC_DIR_IS_INOROUT(dir), "invalid direction %u", dir);
- KASSERT(inph->inph_socket != NULL);
- KASSERT(inph_locked(inph));
+ KASSERT(inp->inp_socket != NULL);
+ KASSERT(inp_locked(inp));
- /* XXX FIXME inpcb/in6pcb vs socket*/
- af = inph->inph_af;
+ /* XXX FIXME inpcb vs socket*/
+ af = inp->inp_af;
KASSERTMSG(af == AF_INET || af == AF_INET6,
"unexpected protocol family %u", af);
- KASSERT(inph->inph_sp != NULL);
+ KASSERT(inp->inp_sp != NULL);
/* If we have a cached entry, and if it is still valid, use it. */
IPSEC_STATINC(IPSEC_STAT_SPDCACHELOOKUP);
- currsp = ipsec_checkpcbcache(m, inph->inph_sp, dir);
+ currsp = ipsec_checkpcbcache(m, inp->inp_sp, dir);
if (currsp) {
*error = 0;
return currsp;
@@ -435,8 +435,8 @@ ipsec_getpolicybysock(struct mbuf *m, u_int dir, struct inpcb_hdr *inph,
#if defined(INET6)
case AF_INET6:
#endif
- *error = ipsec_setspidx_inpcb(m, inph);
- pcbsp = inph->inph_sp;
+ *error = ipsec_setspidx_inpcb(m, inp);
+ pcbsp = inp->inp_sp;
break;
default:
*error = EPFNOSUPPORT;
@@ -566,7 +566,7 @@ ipsec_getpolicybyaddr(struct mbuf *m, u_int dir, int flag, int *error)
static struct secpolicy *
ipsec_checkpolicy(struct mbuf *m, u_int dir, u_int flag, int *error,
- void *inp)
+ struct inpcb *inp)
{
struct secpolicy *sp;
@@ -575,9 +575,8 @@ ipsec_checkpolicy(struct mbuf *m, u_int dir, u_int flag, int *error,
if (inp == NULL) {
sp = ipsec_getpolicybyaddr(m, dir, flag, error);
} else {
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
- KASSERT(inph->inph_socket != NULL);
- sp = ipsec_getpolicybysock(m, dir, inph, error);
+ KASSERT(inp->inp_socket != NULL);
+ sp = ipsec_getpolicybysock(m, dir, inp, error);
}
if (sp == NULL) {
KASSERTMSG(*error != 0, "getpolicy failed w/o error");
@@ -788,26 +787,25 @@ ipsec_mtu(struct mbuf *m, int *destmtu)
}
static int
-ipsec_setspidx_inpcb(struct mbuf *m, void *pcb)
+ipsec_setspidx_inpcb(struct mbuf *m, struct inpcb *inp)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)pcb;
int error;
- KASSERT(inph != NULL);
- KASSERT(inph->inph_sp != NULL);
- KASSERT(inph->inph_sp->sp_out != NULL);
- KASSERT(inph->inph_sp->sp_in != NULL);
+ KASSERT(inp != NULL);
+ KASSERT(inp->inp_sp != NULL);
+ KASSERT(inp->inp_sp->sp_out != NULL);
+ KASSERT(inp->inp_sp->sp_in != NULL);
- error = ipsec_setspidx(m, &inph->inph_sp->sp_in->spidx,
+ error = ipsec_setspidx(m, &inp->inp_sp->sp_in->spidx,
IPSEC_DIR_INBOUND, 1);
if (error == 0) {
- inph->inph_sp->sp_out->spidx = inph->inph_sp->sp_in->spidx;
- inph->inph_sp->sp_out->spidx.dir = IPSEC_DIR_OUTBOUND;
+ inp->inp_sp->sp_out->spidx = inp->inp_sp->sp_in->spidx;
+ inp->inp_sp->sp_out->spidx.dir = IPSEC_DIR_OUTBOUND;
} else {
- memset(&inph->inph_sp->sp_in->spidx, 0,
- sizeof(inph->inph_sp->sp_in->spidx));
- memset(&inph->inph_sp->sp_out->spidx, 0,
- sizeof(inph->inph_sp->sp_out->spidx));
+ memset(&inp->inp_sp->sp_in->spidx, 0,
+ sizeof(inp->inp_sp->sp_in->spidx));
+ memset(&inp->inp_sp->sp_out->spidx, 0,
+ sizeof(inp->inp_sp->sp_out->spidx));
}
return error;
}
@@ -1144,33 +1142,32 @@ ipsec_destroy_policy(struct secpolicy *sp)
}
int
-ipsec_set_policy(void *inp, const void *request, size_t len,
+ipsec_set_policy(struct inpcb *inp, const void *request, size_t len,
kauth_cred_t cred)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
const struct sadb_x_policy *xpl;
struct secpolicy *newsp, *oldsp;
struct secpolicy **policy;
int error;
KASSERT(!cpu_softintr_p());
- KASSERT(inph != NULL);
- KASSERT(inph_locked(inph));
+ KASSERT(inp != NULL);
+ KASSERT(inp_locked(inp));
KASSERT(request != NULL);
if (len < sizeof(*xpl))
return EINVAL;
xpl = (const struct sadb_x_policy *)request;
- KASSERT(inph->inph_sp != NULL);
+ KASSERT(inp->inp_sp != NULL);
/* select direction */
switch (xpl->sadb_x_policy_dir) {
case IPSEC_DIR_INBOUND:
- policy = &inph->inph_sp->sp_in;
+ policy = &inp->inp_sp->sp_in;
break;
case IPSEC_DIR_OUTBOUND:
- policy = &inph->inph_sp->sp_out;
+ policy = &inp->inp_sp->sp_out;
break;
default:
IPSECLOG(LOG_ERR, "invalid direction=%u\n",
@@ -1223,17 +1220,16 @@ ipsec_set_policy(void *inp, const void *request, size_t len,
}
int
-ipsec_get_policy(void *inp, const void *request, size_t len,
+ipsec_get_policy(struct inpcb *inp, const void *request, size_t len,
struct mbuf **mp)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
const struct sadb_x_policy *xpl;
struct secpolicy *policy;
/* sanity check. */
- if (inph == NULL || request == NULL || mp == NULL)
+ if (inp == NULL || request == NULL || mp == NULL)
return EINVAL;
- KASSERT(inph->inph_sp != NULL);
+ KASSERT(inp->inp_sp != NULL);
if (len < sizeof(*xpl))
return EINVAL;
xpl = (const struct sadb_x_policy *)request;
@@ -1241,10 +1237,10 @@ ipsec_get_policy(void *inp, const void *request, size_t len,
/* select direction */
switch (xpl->sadb_x_policy_dir) {
case IPSEC_DIR_INBOUND:
- policy = inph->inph_sp->sp_in;
+ policy = inp->inp_sp->sp_in;
break;
case IPSEC_DIR_OUTBOUND:
- policy = inph->inph_sp->sp_out;
+ policy = inp->inp_sp->sp_out;
break;
default:
IPSECLOG(LOG_ERR, "invalid direction=%u\n",
@@ -1269,25 +1265,24 @@ ipsec_get_policy(void *inp, const void *request, size_t len,
}
int
-ipsec_delete_pcbpolicy(void *inp)
+ipsec_delete_pcbpolicy(struct inpcb *inp)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
- KASSERT(inph != NULL);
+ KASSERT(inp != NULL);
- if (inph->inph_sp == NULL)
+ if (inp->inp_sp == NULL)
return 0;
- if (inph->inph_sp->sp_in != NULL)
- ipsec_destroy_policy(inph->inph_sp->sp_in);
+ if (inp->inp_sp->sp_in != NULL)
+ ipsec_destroy_policy(inp->inp_sp->sp_in);
- if (inph->inph_sp->sp_out != NULL)
- ipsec_destroy_policy(inph->inph_sp->sp_out);
+ if (inp->inp_sp->sp_out != NULL)
+ ipsec_destroy_policy(inp->inp_sp->sp_out);
- ipsec_invalpcbcache(inph->inph_sp, IPSEC_DIR_ANY);
+ ipsec_invalpcbcache(inp->inp_sp, IPSEC_DIR_ANY);
- ipsec_delpcbpolicy(inph->inph_sp);
- inph->inph_sp = NULL;
+ ipsec_delpcbpolicy(inp->inp_sp);
+ inp->inp_sp = NULL;
return 0;
}
@@ -1453,21 +1448,20 @@ ipsec_sp_reject(const struct secpolicy *sp, const struct mbuf *m)
* Check security policy requirements.
*/
int
-ipsec_in_reject(struct mbuf *m, void *inp)
+ipsec_in_reject(struct mbuf *m, struct inpcb *inp)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
struct secpolicy *sp;
int error;
int result;
KASSERT(m != NULL);
- if (inph == NULL)
+ if (inp == NULL)
sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
IP_FORWARDING, &error);
else
sp = ipsec_getpolicybysock(m, IPSEC_DIR_INBOUND,
- inph, &error);
+ inp, &error);
if (sp != NULL) {
result = ipsec_sp_reject(sp, m);
@@ -1557,21 +1551,20 @@ ipsec_sp_hdrsiz(const struct secpolicy *sp, const struct mbuf *m)
}
size_t
-ipsec_hdrsiz(struct mbuf *m, u_int dir, void *inp)
+ipsec_hdrsiz(struct mbuf *m, u_int dir, struct inpcb *inp)
{
- struct inpcb_hdr *inph = (struct inpcb_hdr *)inp;
struct secpolicy *sp;
int error;
size_t size;
KASSERT(m != NULL);
- KASSERTMSG(inph == NULL || inph->inph_socket != NULL,
+ KASSERTMSG(inp == NULL || inp->inp_socket != NULL,
"socket w/o inpcb");
- if (inph == NULL)
+ if (inp == NULL)
sp = ipsec_getpolicybyaddr(m, dir, IP_FORWARDING, &error);
else
- sp = ipsec_getpolicybysock(m, dir, inph, &error);
+ sp = ipsec_getpolicybysock(m, dir, inp, &error);
if (sp != NULL) {
size = ipsec_sp_hdrsiz(sp, m);
@@ -1804,7 +1797,7 @@ ipsec_logsastr(const struct secasvar *sav, char *buf, size_t size)
#ifdef INET6
struct secpolicy *
-ipsec6_check_policy(struct mbuf *m, struct in6pcb *in6p, int flags,
+ipsec6_check_policy(struct mbuf *m, struct inpcb *inp, int flags,
int *needipsecp, int *errorp)
{
struct secpolicy *sp = NULL;
@@ -1816,11 +1809,11 @@ ipsec6_check_policy(struct mbuf *m, struct in6pcb *in6p, int flags,
goto skippolicycheck;
}
s = splsoftnet();
- if (in6p && ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) {
+ if (inp && ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) {
splx(s);
goto skippolicycheck;
}
- sp = ipsec_checkpolicy(m, IPSEC_DIR_OUTBOUND, flags, &error, in6p);
+ sp = ipsec_checkpolicy(m, IPSEC_DIR_OUTBOUND, flags, &error, inp);
splx(s);
/*
diff --git a/sys/netipsec/ipsec.h b/sys/netipsec/ipsec.h
index e04ec05222a..9656a9d0608 100644
--- a/sys/netipsec/ipsec.h
+++ b/sys/netipsec/ipsec.h
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec.h,v 1.91 2020/08/28 06:20:44 ozaki-r Exp $ */
+/* $NetBSD: ipsec.h,v 1.92 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $FreeBSD: ipsec.h,v 1.2.4.2 2004/02/14 22:23:23 bms Exp $ */
/* $KAME: ipsec.h,v 1.53 2001/11/20 08:32:38 itojun Exp $ */
@@ -46,6 +46,7 @@
#include <sys/localcount.h>
#include <netinet/in_pcb_hdr.h>
+#include <netinet/in_pcb.h>
#include <netipsec/keydb.h>
/*
@@ -126,7 +127,7 @@ struct inpcbpolicy {
} sp_cache[3]; /* XXX 3 == IPSEC_DIR_MAX */
int sp_cacheflags;
#define IPSEC_PCBSP_CONNECTED 1
- struct inpcb_hdr *sp_inph; /* back pointer */
+ struct inpcb *sp_inp; /* back pointer */
};
extern u_int ipsec_spdgen;
@@ -135,7 +136,7 @@ static __inline bool
ipsec_pcb_skip_ipsec(struct inpcbpolicy *pcbsp, int dir)
{
- KASSERT(inph_locked(pcbsp->sp_inph));
+ KASSERT(inp_locked(pcbsp->sp_inp));
return pcbsp->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO &&
pcbsp->sp_cache[(dir)].cachegen == ipsec_spdgen;
@@ -288,10 +289,10 @@ int ipsec_init_pcbpolicy(struct socket *so, struct inpcbpolicy **);
int ipsec_copy_policy(const struct inpcbpolicy *, struct inpcbpolicy *);
u_int ipsec_get_reqlevel(const struct ipsecrequest *);
-int ipsec_set_policy(void *, const void *, size_t, kauth_cred_t);
-int ipsec_get_policy(void *, const void *, size_t, struct mbuf **);
-int ipsec_delete_pcbpolicy(void *);
-int ipsec_in_reject(struct mbuf *, void *);
+int ipsec_set_policy(struct inpcb *, const void *, size_t, kauth_cred_t);
+int ipsec_get_policy(struct inpcb *, const void *, size_t, struct mbuf **);
+int ipsec_delete_pcbpolicy(struct inpcb *);
+int ipsec_in_reject(struct mbuf *, struct inpcb *);
struct secasvar *ipsec_lookup_sa(const struct ipsecrequest *,
const struct mbuf *);
@@ -301,7 +302,7 @@ struct tcpcb;
int ipsec_chkreplay(u_int32_t, const struct secasvar *);
int ipsec_updatereplay(u_int32_t, const struct secasvar *);
-size_t ipsec_hdrsiz(struct mbuf *, u_int, void *);
+size_t ipsec_hdrsiz(struct mbuf *, u_int, struct inpcb *);
size_t ipsec4_hdrsiz_tcp(struct tcpcb *);
union sockaddr_union;
diff --git a/sys/netipsec/ipsec6.h b/sys/netipsec/ipsec6.h
index ca123b47a61..c1f15fc45bf 100644
--- a/sys/netipsec/ipsec6.h
+++ b/sys/netipsec/ipsec6.h
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec6.h,v 1.30 2019/11/01 04:23:21 knakahara Exp $ */
+/* $NetBSD: ipsec6.h,v 1.31 2022/10/28 05:18:39 ozaki-r Exp $ */
/* $FreeBSD: ipsec6.h,v 1.1.4.1 2003/01/24 05:11:35 sam Exp $ */
/* $KAME: ipsec.h,v 1.44 2001/03/23 08:08:47 itojun Exp $ */
@@ -46,10 +46,10 @@ extern int ip6_ah_net_deflev;
extern int ip6_ipsec_ecn;
extern struct secpolicy ip6_def_policy;
-struct in6pcb;
+struct inpcb;
struct tcp6cb;
-struct secpolicy *ipsec6_check_policy(struct mbuf *, struct in6pcb *,
+struct secpolicy *ipsec6_check_policy(struct mbuf *, struct inpcb *,
int, int *, int *);
size_t ipsec6_hdrsiz_tcp(struct tcpcb *);