[IPV4/6]: Check if packet was actually delivered to a raw socket to decide whether to send an ICMP unreachable
Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
0bd1b59b15
commit
d13964f449
@@ -150,10 +150,11 @@ static __inline__ int icmp_filter(struct sock *sk, struct sk_buff *skb)
|
||||
* RFC 1122: SHOULD pass TOS value up to the transport layer.
|
||||
* -> It does. And not only TOS, but all IP header.
|
||||
*/
|
||||
void raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
|
||||
int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
|
||||
{
|
||||
struct sock *sk;
|
||||
struct hlist_head *head;
|
||||
int delivered = 0;
|
||||
|
||||
read_lock(&raw_v4_lock);
|
||||
head = &raw_v4_htable[hash];
|
||||
@@ -164,6 +165,7 @@ void raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
|
||||
skb->dev->ifindex);
|
||||
|
||||
while (sk) {
|
||||
delivered = 1;
|
||||
if (iph->protocol != IPPROTO_ICMP || !icmp_filter(sk, skb)) {
|
||||
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
@@ -177,6 +179,7 @@ void raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
|
||||
}
|
||||
out:
|
||||
read_unlock(&raw_v4_lock);
|
||||
return delivered;
|
||||
}
|
||||
|
||||
void raw_err (struct sock *sk, struct sk_buff *skb, u32 info)
|
||||
|
Reference in New Issue
Block a user