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 61b7be303eec..2259114c7242 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1564,6 +1564,21 @@ bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
1564} 1564}
1565EXPORT_SYMBOL(tcp_add_backlog); 1565EXPORT_SYMBOL(tcp_add_backlog);
1566 1566
1567int tcp_filter(struct sock *sk, struct sk_buff *skb)
1568{
1569 struct tcphdr *th = (struct tcphdr *)skb->data;
1570 unsigned int eaten = skb->len;
1571 int err;
1572
1573 err = sk_filter_trim_cap(sk, skb, th->doff * 4);
1574 if (!err) {
1575 eaten -= skb->len;
1576 TCP_SKB_CB(skb)->end_seq -= eaten;
1577 }
1578 return err;
1579}
1580EXPORT_SYMBOL(tcp_filter);
1581
1567/* 1582/*
1568 * From tcp_input.c 1583 * From tcp_input.c
1569 */ 1584 */
@@ -1676,8 +1691,10 @@ process:
1676 1691
1677 nf_reset(skb); 1692 nf_reset(skb);
1678 1693
1679 if (sk_filter(sk, skb)) 1694 if (tcp_filter(sk, skb))
1680 goto discard_and_relse; 1695 goto discard_and_relse;
1696 th = (const struct tcphdr *)skb->data;
1697 iph = ip_hdr(skb);
1681 1698
1682 skb->dev = NULL; 1699 skb->dev = NULL;
1683 1700