sync with OpenBSD -current
This commit is contained in:
parent
e0d126d03b
commit
9d8ac7f158
49 changed files with 304 additions and 657 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: in_proto.c,v 1.103 2024/01/11 14:15:12 bluhm Exp $ */
|
||||
/* $OpenBSD: in_proto.c,v 1.104 2024/04/14 20:46:27 bluhm Exp $ */
|
||||
/* $NetBSD: in_proto.c,v 1.14 1996/02/18 18:58:32 christos Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -210,7 +210,7 @@ const struct protosw inetsw[] = {
|
|||
.pr_type = SOCK_RAW,
|
||||
.pr_domain = &inetdomain,
|
||||
.pr_protocol = IPPROTO_RAW,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT,
|
||||
.pr_input = rip_input,
|
||||
.pr_ctloutput = rip_ctloutput,
|
||||
.pr_usrreqs = &rip_usrreqs,
|
||||
|
@ -377,7 +377,7 @@ const struct protosw inetsw[] = {
|
|||
/* raw wildcard */
|
||||
.pr_type = SOCK_RAW,
|
||||
.pr_domain = &inetdomain,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT,
|
||||
.pr_input = rip_input,
|
||||
.pr_ctloutput = rip_ctloutput,
|
||||
.pr_usrreqs = &rip_usrreqs,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: ip_input.c,v 1.391 2024/02/28 10:57:20 bluhm Exp $ */
|
||||
/* $OpenBSD: ip_input.c,v 1.392 2024/04/14 20:46:27 bluhm Exp $ */
|
||||
/* $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -245,6 +245,30 @@ ip_ours(struct mbuf **mp, int *offp, int nxt, int af)
|
|||
if (af != AF_UNSPEC)
|
||||
return nxt;
|
||||
|
||||
nxt = ip_deliver(mp, offp, nxt, AF_INET, 1);
|
||||
if (nxt == IPPROTO_DONE)
|
||||
return IPPROTO_DONE;
|
||||
|
||||
/* save values for later, use after dequeue */
|
||||
if (*offp != sizeof(struct ip)) {
|
||||
struct m_tag *mtag;
|
||||
struct ipoffnxt *ion;
|
||||
|
||||
/* mbuf tags are expensive, but only used for header options */
|
||||
mtag = m_tag_get(PACKET_TAG_IP_OFFNXT, sizeof(*ion),
|
||||
M_NOWAIT);
|
||||
if (mtag == NULL) {
|
||||
ipstat_inc(ips_idropped);
|
||||
m_freemp(mp);
|
||||
return IPPROTO_DONE;
|
||||
}
|
||||
ion = (struct ipoffnxt *)(mtag + 1);
|
||||
ion->ion_off = *offp;
|
||||
ion->ion_nxt = nxt;
|
||||
|
||||
m_tag_prepend(*mp, mtag);
|
||||
}
|
||||
|
||||
niq_enqueue(&ipintrq, *mp);
|
||||
*mp = NULL;
|
||||
return IPPROTO_DONE;
|
||||
|
@ -260,18 +284,31 @@ ipintr(void)
|
|||
struct mbuf *m;
|
||||
|
||||
while ((m = niq_dequeue(&ipintrq)) != NULL) {
|
||||
struct ip *ip;
|
||||
struct m_tag *mtag;
|
||||
int off, nxt;
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
if ((m->m_flags & M_PKTHDR) == 0)
|
||||
panic("ipintr no HDR");
|
||||
#endif
|
||||
ip = mtod(m, struct ip *);
|
||||
off = ip->ip_hl << 2;
|
||||
nxt = ip->ip_p;
|
||||
mtag = m_tag_find(m, PACKET_TAG_IP_OFFNXT, NULL);
|
||||
if (mtag != NULL) {
|
||||
struct ipoffnxt *ion;
|
||||
|
||||
nxt = ip_deliver(&m, &off, nxt, AF_INET);
|
||||
ion = (struct ipoffnxt *)(mtag + 1);
|
||||
off = ion->ion_off;
|
||||
nxt = ion->ion_nxt;
|
||||
|
||||
m_tag_delete(m, mtag);
|
||||
} else {
|
||||
struct ip *ip;
|
||||
|
||||
ip = mtod(m, struct ip *);
|
||||
off = ip->ip_hl << 2;
|
||||
nxt = ip->ip_p;
|
||||
}
|
||||
|
||||
nxt = ip_deliver(&m, &off, nxt, AF_INET, 0);
|
||||
KASSERT(nxt == IPPROTO_DONE);
|
||||
}
|
||||
}
|
||||
|
@ -675,15 +712,11 @@ ip_fragcheck(struct mbuf **mp, int *offp)
|
|||
#endif
|
||||
|
||||
int
|
||||
ip_deliver(struct mbuf **mp, int *offp, int nxt, int af)
|
||||
ip_deliver(struct mbuf **mp, int *offp, int nxt, int af, int shared)
|
||||
{
|
||||
const struct protosw *psw;
|
||||
int naf = af;
|
||||
#ifdef INET6
|
||||
int nest = 0;
|
||||
#endif /* INET6 */
|
||||
|
||||
NET_ASSERT_LOCKED_EXCLUSIVE();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Tell launch routine the next header
|
||||
|
@ -691,13 +724,41 @@ ip_deliver(struct mbuf **mp, int *offp, int nxt, int af)
|
|||
IPSTAT_INC(delivered);
|
||||
|
||||
while (nxt != IPPROTO_DONE) {
|
||||
const struct protosw *psw;
|
||||
int naf;
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
psw = &inetsw[ip_protox[nxt]];
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
psw = &inet6sw[ip6_protox[nxt]];
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
if (shared && !ISSET(psw->pr_flags, PR_MPINPUT)) {
|
||||
/* delivery not finished, decrement counter, queue */
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
counters_dec(ipcounters, ips_delivered);
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
counters_dec(ip6counters, ip6s_delivered);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef INET6
|
||||
if (af == AF_INET6 &&
|
||||
ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {
|
||||
ip6stat_inc(ip6s_toomanyhdr);
|
||||
goto bad;
|
||||
}
|
||||
#endif /* INET6 */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* protection against faulty packet - there should be
|
||||
|
@ -716,7 +777,7 @@ ip_deliver(struct mbuf **mp, int *offp, int nxt, int af)
|
|||
}
|
||||
}
|
||||
/* Otherwise, just fall through and deliver the packet */
|
||||
#endif /* IPSEC */
|
||||
#endif
|
||||
|
||||
switch (nxt) {
|
||||
case IPPROTO_IPV4:
|
||||
|
@ -728,17 +789,10 @@ ip_deliver(struct mbuf **mp, int *offp, int nxt, int af)
|
|||
naf = AF_INET6;
|
||||
ip6stat_inc(ip6s_delivered);
|
||||
break;
|
||||
#endif /* INET6 */
|
||||
}
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
psw = &inetsw[ip_protox[nxt]];
|
||||
#endif
|
||||
default:
|
||||
naf = af;
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
psw = &inet6sw[ip6_protox[nxt]];
|
||||
break;
|
||||
#endif /* INET6 */
|
||||
}
|
||||
nxt = (*psw->pr_input)(mp, offp, nxt, af);
|
||||
af = naf;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: ip_var.h,v 1.114 2024/03/05 09:45:13 bluhm Exp $ */
|
||||
/* $OpenBSD: ip_var.h,v 1.115 2024/04/14 20:46:27 bluhm Exp $ */
|
||||
/* $NetBSD: ip_var.h,v 1.16 1996/02/13 23:43:20 christos Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -198,6 +198,11 @@ struct ipq {
|
|||
struct in_addr ipq_src, ipq_dst;
|
||||
};
|
||||
|
||||
struct ipoffnxt {
|
||||
int ion_off;
|
||||
int ion_nxt;
|
||||
};
|
||||
|
||||
/* flags passed to ip_output */
|
||||
#define IP_FORWARDING 0x1 /* most of ip header exists */
|
||||
#define IP_RAWOUTPUT 0x2 /* raw ip header exists */
|
||||
|
@ -254,7 +259,7 @@ int ip_sysctl(int *, u_int, void *, size_t *, void *, size_t);
|
|||
void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
|
||||
struct mbuf *);
|
||||
int ip_input_if(struct mbuf **, int *, int, int, struct ifnet *);
|
||||
int ip_deliver(struct mbuf **, int *, int, int);
|
||||
int ip_deliver(struct mbuf **, int *, int, int, int);
|
||||
void ip_forward(struct mbuf *, struct ifnet *, struct rtentry *, int);
|
||||
int rip_ctloutput(int, struct socket *, int, int, struct mbuf *);
|
||||
void rip_init(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue