Author: hselasky
Date: Thu Jun 11 09:41:54 2020
New Revision: 362045
URL: https://svnweb.freebsd.org/changeset/base/362045

Log:
  Make sure packets generated by raw IP code is let through by mlx5en(4).
  
  Allow the TCP header to reside in the mbuf following the IP header.
  Else such packets will get dropped.
  
  Backtrace:
  mlx5e_sq_xmit()
  mlx5e_xmit()
  ether_output_frame()
  ether_output()
  ip_output_send()
  ip_output()
  rip_output()
  sosend_generic()
  sosend()
  kern_sendit()
  sendit()
  sys_sendto()
  amd64_syscall()
  fast_syscall_common()
  
  MFC after:    1 week
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c

Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c      Thu Jun 11 09:38:51 2020        
(r362044)
+++ head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c      Thu Jun 11 09:41:54 2020        
(r362045)
@@ -307,9 +307,15 @@ mlx5e_get_full_header_size(const struct mbuf *mb, cons
                goto failure;
        }
 tcp_packet:
-       if (unlikely(mb->m_len < eth_hdr_len + sizeof(*th)))
-               goto failure;
-       th = (const struct tcphdr *)(mb->m_data + eth_hdr_len);
+       if (unlikely(mb->m_len < eth_hdr_len + sizeof(*th))) {
+               const struct mbuf *m_th = mb->m_next;
+               if (unlikely(mb->m_len != eth_hdr_len ||
+                   m_th == NULL || m_th->m_len < sizeof(*th)))
+                       goto failure;
+               th = (const struct tcphdr *)(m_th->m_data);
+       } else {
+               th = (const struct tcphdr *)(mb->m_data + eth_hdr_len);
+       }
        tcp_hlen = th->th_off << 2;
        eth_hdr_len += tcp_hlen;
 udp_packet:
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to