[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>
Bu işleme şunda yer alıyor:

işlemeyi yapan:
David S. Miller

ebeveyn
0bd1b59b15
işleme
d13964f449
@@ -166,8 +166,8 @@ resubmit:
|
||||
nexthdr = skb->nh.raw[nhoff];
|
||||
|
||||
raw_sk = sk_head(&raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)]);
|
||||
if (raw_sk)
|
||||
ipv6_raw_deliver(skb, nexthdr);
|
||||
if (raw_sk && !ipv6_raw_deliver(skb, nexthdr))
|
||||
raw_sk = NULL;
|
||||
|
||||
hash = nexthdr & (MAX_INET_PROTOS - 1);
|
||||
if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) {
|
||||
|
@@ -141,11 +141,12 @@ static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
|
||||
*
|
||||
* Caller owns SKB so we must make clones.
|
||||
*/
|
||||
void ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
|
||||
int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
|
||||
{
|
||||
struct in6_addr *saddr;
|
||||
struct in6_addr *daddr;
|
||||
struct sock *sk;
|
||||
int delivered = 0;
|
||||
__u8 hash;
|
||||
|
||||
saddr = &skb->nh.ipv6h->saddr;
|
||||
@@ -167,6 +168,7 @@ void ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
|
||||
sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr, skb->dev->ifindex);
|
||||
|
||||
while (sk) {
|
||||
delivered = 1;
|
||||
if (nexthdr != IPPROTO_ICMPV6 || !icmpv6_filter(sk, skb)) {
|
||||
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
@@ -179,6 +181,7 @@ void ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
|
||||
}
|
||||
out:
|
||||
read_unlock(&raw_v6_lock);
|
||||
return delivered;
|
||||
}
|
||||
|
||||
/* This cleans up af_inet6 a bit. -DaveM */
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle