mirror of
https://github.com/opnsense/src.git
synced 2026-04-25 08:07:28 -04:00
Add IPv6 support for O_TCPDATALEN opcode.
PR: 222746 MFC after: 1 week
This commit is contained in:
parent
5bcae8ddfa
commit
5c70ebfa57
1 changed files with 20 additions and 4 deletions
|
|
@ -963,7 +963,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 */
|
||||
|
||||
|
|
@ -1205,6 +1205,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;
|
||||
|
|
@ -1219,7 +1220,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) {
|
||||
|
|
@ -1258,6 +1258,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);
|
||||
|
|
@ -1771,10 +1772,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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue