Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 6245
b: refs/heads/master
c: d13964f
h: refs/heads/master
i:
  6243: 32c3052
v: v3
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Aug 29, 2005
1 parent 8e29498 commit ae37a44
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0bd1b59b15e4057101c89d4db15a3683c0d897f7
refs/heads/master: d13964f4490157b8a290903362bfbc54f750a6bc
2 changes: 1 addition & 1 deletion trunk/include/net/raw.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ extern struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num,
unsigned long raddr, unsigned long laddr,
int dif);

extern void raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash);
extern int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash);

#endif /* _RAW_H */
2 changes: 1 addition & 1 deletion trunk/include/net/rawv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
extern struct hlist_head raw_v6_htable[RAWV6_HTABLE_SIZE];
extern rwlock_t raw_v6_lock;

extern void ipv6_raw_deliver(struct sk_buff *skb, int nexthdr);
extern int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr);

extern struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num,
struct in6_addr *loc_addr, struct in6_addr *rmt_addr,
Expand Down
4 changes: 2 additions & 2 deletions trunk/net/ipv4/ip_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,8 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
/* If there maybe a raw socket we must check - if not we
* don't care less
*/
if (raw_sk)
raw_v4_input(skb, skb->nh.iph, hash);
if (raw_sk && !raw_v4_input(skb, skb->nh.iph, hash))
raw_sk = NULL;

if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
int ret;
Expand Down
5 changes: 4 additions & 1 deletion trunk/net/ipv4/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);

Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions trunk/net/ipv6/ip6_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ static inline int ip6_input_finish(struct sk_buff *skb)
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) {
Expand Down
5 changes: 4 additions & 1 deletion trunk/net/ipv6/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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 */
Expand Down

0 comments on commit ae37a44

Please sign in to comment.