quoted hunk ↗ jump to hunk
+static int try_get_ip_tcp_hdr(struct ehea_cqe *cqe, struct sk_buff *skb,
+ struct iphdr **iph, struct tcphdr **tcph)
+{
+ int ip_len;
+
+ /* non tcp/udp packets */
+ if (!cqe->header_length)
+ return -1;
+
+ /* non tcp packet */
+ *iph = (struct iphdr *)(skb->data);
Why the indirection, copying of headers..
quoted hunk ↗ jump to hunk
+ if ((*iph)->protocol != IPPROTO_TCP)
+ return -1;
+
+ ip_len = (u8)((*iph)->ihl);
+ ip_len <<= 2;
+ *tcph = (struct tcphdr *)(((u64)*iph) + ip_len);
+
+ return 0;
+}
+
This code seems to be duplicating a lot (but not all) of the TCP/IP
input path validation checks. This is a security problem if nothing else...
Also, how do you prevent DoS attacks from hostile TCP senders that send
huge number of back to back frames?
--
Stephen Hemminger [off-list ref]