aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 6491b7c1f975..5555eb86e549 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1567,6 +1567,21 @@ bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
1567} 1567}
1568EXPORT_SYMBOL(tcp_add_backlog); 1568EXPORT_SYMBOL(tcp_add_backlog);
1569 1569
1570int tcp_filter(struct sock *sk, struct sk_buff *skb)
1571{
1572 struct tcphdr *th = (struct tcphdr *)skb->data;
1573 unsigned int eaten = skb->len;
1574 int err;
1575
1576 err = sk_filter_trim_cap(sk, skb, th->doff * 4);
1577 if (!err) {
1578 eaten -= skb->len;
1579 TCP_SKB_CB(skb)->end_seq -= eaten;
1580 }
1581 return err;
1582}
1583EXPORT_SYMBOL(tcp_filter);
1584
1570/* 1585/*
1571 * From tcp_input.c 1586 * From tcp_input.c
1572 */ 1587 */
@@ -1679,8 +1694,10 @@ process:
1679 1694
1680 nf_reset(skb); 1695 nf_reset(skb);
1681 1696
1682 if (sk_filter(sk, skb)) 1697 if (tcp_filter(sk, skb))
1683 goto discard_and_relse; 1698 goto discard_and_relse;
1699 th = (const struct tcphdr *)skb->data;
1700 iph = ip_hdr(skb);
1684 1701
1685 skb->dev = NULL; 1702 skb->dev = NULL;
1686 1703