static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, unsigned short num, struct in6_addr *loc_addr, struct in6_addr *rmt_addr, int dif) { struct hlist_node *node; int is_multicast = ipv6_addr_is_multicast(loc_addr); sk_for_each_from(sk, node) if (inet_sk(sk)->inet_num == num) { struct ipv6_pinfo *np = inet6_sk(sk); if (!net_eq(sock_net(sk), net)) continue; if (!ipv6_addr_any(&np->daddr) && !ipv6_addr_equal(&np->daddr, rmt_addr)) continue; if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) goto found; if (is_multicast && inet6_mc_check(sk, loc_addr, rmt_addr)) goto found; continue; } goto found; } sk = NULL; found: return sk; }
/* Grumble... icmp and ip_input want to get at this... */ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num, struct in6_addr *loc_addr, struct in6_addr *rmt_addr) { struct sock *s = sk; int addr_type = ipv6_addr_type(loc_addr); for(s = sk; s; s = s->next) { if(s->num == num) { struct ipv6_pinfo *np = &s->net_pinfo.af_inet6; if (!ipv6_addr_any(&np->daddr) && ipv6_addr_cmp(&np->daddr, rmt_addr)) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { if (ipv6_addr_cmp(&np->rcv_saddr, loc_addr) == 0) break; if ((addr_type & IPV6_ADDR_MULTICAST) && inet6_mc_check(s, loc_addr)) break; continue; } break; } } return s; }
/* Grumble... icmp and ip_input want to get at this... */ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num, struct in6_addr *loc_addr, struct in6_addr *rmt_addr) { struct hlist_node *node; int addr_type = ipv6_addr_type(loc_addr); sk_for_each_from(sk, node) if (inet_sk(sk)->num == num) { struct ipv6_pinfo *np = inet6_sk(sk); if (!ipv6_addr_any(&np->daddr) && ipv6_addr_cmp(&np->daddr, rmt_addr)) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr)) goto found; if ((addr_type & IPV6_ADDR_MULTICAST) && inet6_mc_check(sk, loc_addr, rmt_addr)) goto found; continue; } goto found; } sk = NULL; found: return sk; }
static struct sock *udp_v6_mcast_next(struct sock *sk, u16 loc_port, struct in6_addr *loc_addr, u16 rmt_port, struct in6_addr *rmt_addr, int dif) { struct sock *s = sk; unsigned short num = ntohs(loc_port); for(; s; s = s->next) { if(s->num == num) { struct ipv6_pinfo *np = &s->net_pinfo.af_inet6; if(s->dport) { if(s->dport != rmt_port) continue; } if(!ipv6_addr_any(&np->daddr) && ipv6_addr_cmp(&np->daddr, rmt_addr)) continue; if (s->bound_dev_if && s->bound_dev_if != dif) continue; if(!ipv6_addr_any(&np->rcv_saddr)) { if(ipv6_addr_cmp(&np->rcv_saddr, loc_addr) == 0) return s; } if(!inet6_mc_check(s, loc_addr)) continue; return s; } } return NULL; }
/* Grumble... icmp and ip_input want to get at this... */ struct sock *raw_v6_lookup(struct sock *sk, unsigned short num, struct in6_addr *loc_addr, struct in6_addr *rmt_addr) { struct sock *s = sk; int addr_type = ipv6_addr_type(loc_addr); for(s = sk; s; s = s->next) { if((s->num == num) && !(s->dead && (s->state == TCP_CLOSE))) { struct ipv6_pinfo *np = &s->net_pinfo.af_inet6; if (!ipv6_addr_any(&np->daddr) && ipv6_addr_cmp(&np->daddr, rmt_addr)) continue; if (!ipv6_addr_any(&np->rcv_saddr)) { if (ipv6_addr_cmp(&np->rcv_saddr, loc_addr) == 0) return(s); if ((addr_type & IPV6_ADDR_MULTICAST) && inet6_mc_check(s, loc_addr)) return (s); continue; } return(s); } } return NULL; }