sync
This commit is contained in:
parent
2a351e0cdc
commit
f57be82572
704 changed files with 20524 additions and 10572 deletions
56
sys/net/if.c
56
sys/net/if.c
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue