svn commit: r325230 - stable/10/sys/netpfil/ipfw
Andrey V. Elsukov
ae at FreeBSD.org
Tue Oct 31 11:09:40 UTC 2017
Author: ae
Date: Tue Oct 31 11:09:39 2017
New Revision: 325230
URL: https://svnweb.freebsd.org/changeset/base/325230
Log:
MFC r324947:
Add IPv6 support for O_TCPDATALEN opcode.
PR: 222746
Modified:
stable/10/sys/netpfil/ipfw/ip_fw2.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/netpfil/ipfw/ip_fw2.c
==============================================================================
--- stable/10/sys/netpfil/ipfw/ip_fw2.c Tue Oct 31 10:31:47 2017 (r325229)
+++ stable/10/sys/netpfil/ipfw/ip_fw2.c Tue Oct 31 11:09:39 2017 (r325230)
@@ -945,7 +945,7 @@ ipfw_chk(struct ip_fw_args *args)
uint8_t proto;
uint16_t src_port = 0, dst_port = 0; /* NOTE: host format */
struct in_addr src_ip, dst_ip; /* NOTE: network format */
- uint16_t iplen=0;
+ int iplen = 0;
int pktlen;
uint16_t etype = 0; /* Host order stored ether type */
@@ -1186,6 +1186,7 @@ do { \
args->f_id.src_ip = 0;
args->f_id.dst_ip = 0;
args->f_id.flow_id6 = ntohl(ip6->ip6_flow);
+ iplen = ntohs(ip6->ip6_plen) + sizeof(*ip6);
} else if (pktlen >= sizeof(struct ip) &&
(args->eh == NULL || etype == ETHERTYPE_IP) && ip->ip_v == 4) {
is_ipv4 = 1;
@@ -1200,7 +1201,6 @@ do { \
dst_ip = ip->ip_dst;
offset = ntohs(ip->ip_off) & IP_OFFMASK;
iplen = ntohs(ip->ip_len);
- pktlen = iplen < pktlen ? iplen : pktlen;
if (offset == 0) {
switch (proto) {
@@ -1239,6 +1239,7 @@ do { \
args->f_id.dst_ip = ntohl(dst_ip.s_addr);
}
#undef PULLUP_TO
+ pktlen = iplen < pktlen ? iplen: pktlen;
if (proto) { /* we may have port numbers, store them */
args->f_id.proto = proto;
args->f_id.src_port = src_port = ntohs(src_port);
@@ -1698,10 +1699,25 @@ do { \
uint16_t x;
uint16_t *p;
int i;
+#ifdef INET6
+ if (is_ipv6) {
+ struct ip6_hdr *ip6;
+ ip6 = (struct ip6_hdr *)ip;
+ if (ip6->ip6_plen == 0) {
+ /*
+ * Jumbo payload is not
+ * supported by this
+ * opcode.
+ */
+ break;
+ }
+ x = iplen - hlen;
+ } else
+#endif /* INET6 */
+ x = iplen - (ip->ip_hl << 2);
tcp = TCP(ulp);
- x = iplen -
- ((ip->ip_hl + tcp->th_off) << 2);
+ x -= tcp->th_off << 2;
if (cmdlen == 1) {
match = (cmd->arg1 == x);
break;
More information about the svn-src-all
mailing list