Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174293932
D56337.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D56337.diff
View Options
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -1305,27 +1305,6 @@
int error;
uint16_t tcp_data_sum;
-#ifdef INET
- /* Quickly decide if packet cannot be LRO'ed */
- if (__predict_false(V_ipforwarding != 0))
- return (TCP_LRO_CANNOT);
-#endif
-#ifdef INET6
- /* Quickly decide if packet cannot be LRO'ed */
- if (__predict_false(V_ip6_forwarding != 0))
- return (TCP_LRO_CANNOT);
-#endif
- if (((m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) !=
- ((CSUM_DATA_VALID | CSUM_PSEUDO_HDR))) ||
- (m->m_pkthdr.csum_data != 0xffff)) {
- /*
- * The checksum either did not have hardware offload
- * or it was a bad checksum. We can't LRO such
- * a packet.
- */
- counter_u64_add(tcp_bad_csums, 1);
- return (TCP_LRO_CANNOT);
- }
/* We expect a contiguous header [eh, ip, tcp]. */
pa = tcp_lro_parser(m, &po, &pi, true);
if (__predict_false(pa == NULL))
@@ -1443,6 +1422,29 @@
{
int error;
+#ifdef INET
+ /* Quickly decide if packet cannot be LRO'ed */
+ if (__predict_false(V_ipforwarding != 0))
+ return (TCP_LRO_CANNOT);
+#endif
+#ifdef INET6
+ /* Quickly decide if packet cannot be LRO'ed */
+ if (__predict_false(V_ip6_forwarding != 0))
+ return (TCP_LRO_CANNOT);
+#endif
+
+ if (((m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) !=
+ ((CSUM_DATA_VALID | CSUM_PSEUDO_HDR))) ||
+ (m->m_pkthdr.csum_data != 0xffff)) {
+ /*
+ * The checksum either did not have hardware offload
+ * or it was a bad checksum. We can't LRO such
+ * a packet.
+ */
+ counter_u64_add(tcp_bad_csums, 1);
+ return (TCP_LRO_CANNOT);
+ }
+
/* get current time */
binuptime(&lc->lro_last_queue_time);
CURVNET_SET(lc->ifp->if_vnet);
@@ -1472,6 +1474,22 @@
return;
}
+#ifdef INET
+ /* Quickly decide if packet cannot be LRO'ed */
+ if (__predict_false(V_ipforwarding != 0)) {
+ /* input packet to network layer */
+ (*lc->ifp->if_input) (lc->ifp, mb);
+ return;
+ }
+#endif
+#ifdef INET6
+ /* Quickly decide if packet cannot be LRO'ed */
+ if (__predict_false(V_ip6_forwarding != 0)) {
+ /* input packet to network layer */
+ (*lc->ifp->if_input) (lc->ifp, mb);
+ return;
+ }
+#endif
/* check if packet is not LRO capable */
if (__predict_false((lc->ifp->if_capenable & IFCAP_LRO) == 0)) {
/* input packet to network layer */
@@ -1479,6 +1497,19 @@
return;
}
+ if (((mb->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) !=
+ ((CSUM_DATA_VALID | CSUM_PSEUDO_HDR))) ||
+ (mb->m_pkthdr.csum_data != 0xffff)) {
+ /*
+ * The checksum either did not have hardware offload
+ * or it was a bad checksum. We can't LRO such
+ * a packet.
+ */
+ counter_u64_add(tcp_bad_csums, 1);
+ (*lc->ifp->if_input) (lc->ifp, mb);
+ return;
+ }
+
/* If no hardware or arrival stamp on the packet add timestamp */
if ((tcplro_stacks_wanting_mbufq > 0) &&
(tcp_less_accurate_lro_ts == 0) &&
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 3, 3:06 AM (6 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40110108
Default Alt Text
D56337.diff (2 KB)
Attached To
Mode
D56337: lro: move packet rejection checks out of lro_rx_common to avoid queueing non-LRO'able packets
Attached
Detach File
Event Timeline
Log In to Comment