This commit is contained in:
purplerain 2023-07-10 00:10:46 +00:00
parent 2a351e0cdc
commit f57be82572
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
704 changed files with 20524 additions and 10572 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if.c,v 1.704 2023/07/06 04:55:04 dlg Exp $ */
/* $OpenBSD: if.c,v 1.706 2023/07/07 19:45:26 bluhm Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@ -782,6 +782,7 @@ int
if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
{
int keepflags, keepcksum;
uint16_t keepmss;
#if NBPFILTER > 0
/*
@ -807,9 +808,11 @@ if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
keepcksum = m->m_pkthdr.csum_flags & (M_IPV4_CSUM_OUT |
M_TCP_CSUM_OUT | M_UDP_CSUM_OUT | M_ICMP_CSUM_OUT |
M_TCP_TSO);
keepmss = m->m_pkthdr.ph_mss;
m_resethdr(m);
m->m_flags |= M_LOOP | keepflags;
m->m_pkthdr.csum_flags = keepcksum;
m->m_pkthdr.ph_mss = keepmss;
m->m_pkthdr.ph_ifidx = ifp->if_index;
m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
@ -885,6 +888,57 @@ if_output_ml(struct ifnet *ifp, struct mbuf_list *ml,
return error;
}
int
if_output_tso(struct ifnet *ifp, struct mbuf **mp, struct sockaddr *dst,
struct rtentry *rt, u_int mtu)
{
uint32_t ifcap;
int error;
switch (dst->sa_family) {
case AF_INET:
ifcap = IFCAP_TSOv4;
break;
#ifdef INET6
case AF_INET6:
ifcap = IFCAP_TSOv6;
break;
#endif
default:
unhandled_af(dst->sa_family);
}
/*
* Try to send with TSO first. When forwarding LRO may set
* maximium segment size in mbuf header. Chop TCP segment
* even if it would fit interface MTU to preserve maximum
* path MTU.
*/
error = tcp_if_output_tso(ifp, mp, dst, rt, ifcap, mtu);
if (error || *mp == NULL)
return error;
if ((*mp)->m_pkthdr.len <= mtu) {
switch (dst->sa_family) {
case AF_INET:
in_hdr_cksum_out(*mp, ifp);
in_proto_cksum_out(*mp, ifp);
break;
#ifdef INET6
case AF_INET6:
in6_proto_cksum_out(*mp, ifp);
break;
#endif
}
error = ifp->if_output(ifp, *mp, dst, rt);
*mp = NULL;
return error;
}
/* mp still contains mbuf that has to be fragmented or dropped. */
return 0;
}
int
if_output_mq(struct ifnet *ifp, struct mbuf_queue *mq, unsigned int *total,
struct sockaddr *dst, struct rtentry *rt)