|
@@ -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)
|