Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 78763
b: refs/heads/master
c: bfeade0
h: refs/heads/master
i:
  78761: 6183462
  78759: 267db22
v: v3
  • Loading branch information
Daniel Lezcano authored and David S. Miller committed Jan 28, 2008
1 parent 11a0854 commit c2cbda8
Show file tree
Hide file tree
Showing 11 changed files with 24 additions and 16 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: 3c40090a0f5b69deecc5ca615f994957f949333d
refs/heads/master: bfeade087005278fc8cafe230b7658a4f40c5acb
4 changes: 3 additions & 1 deletion trunk/include/net/addrconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ extern int addrconf_add_ifaddr(void __user *arg);
extern int addrconf_del_ifaddr(void __user *arg);
extern int addrconf_set_dstaddr(void __user *arg);

extern int ipv6_chk_addr(struct in6_addr *addr,
extern int ipv6_chk_addr(struct net *net,
struct in6_addr *addr,
struct net_device *dev,
int strict);

#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
extern int ipv6_chk_home_addr(struct in6_addr *addr);
#endif
Expand Down
6 changes: 4 additions & 2 deletions trunk/net/ipv6/addrconf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1206,13 +1206,16 @@ static int ipv6_count_addresses(struct inet6_dev *idev)
return cnt;
}

int ipv6_chk_addr(struct in6_addr *addr, struct net_device *dev, int strict)
int ipv6_chk_addr(struct net *net, struct in6_addr *addr,
struct net_device *dev, int strict)
{
struct inet6_ifaddr * ifp;
u8 hash = ipv6_addr_hash(addr);

read_lock_bh(&addrconf_hash_lock);
for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
if (ifp->idev->dev->nd_net != net)
continue;
if (ipv6_addr_equal(&ifp->addr, addr) &&
!(ifp->flags&IFA_F_TENTATIVE)) {
if (dev == NULL || ifp->idev->dev == dev ||
Expand All @@ -1223,7 +1226,6 @@ int ipv6_chk_addr(struct in6_addr *addr, struct net_device *dev, int strict)
read_unlock_bh(&addrconf_hash_lock);
return ifp != NULL;
}

EXPORT_SYMBOL(ipv6_chk_addr);

static
Expand Down
3 changes: 2 additions & 1 deletion trunk/net/ipv6/af_inet6.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,8 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
*/
v4addr = LOOPBACK4_IPV6;
if (!(addr_type & IPV6_ADDR_MULTICAST)) {
if (!ipv6_chk_addr(&addr->sin6_addr, dev, 0)) {
if (!ipv6_chk_addr(&init_net, &addr->sin6_addr,
dev, 0)) {
if (dev)
dev_put(dev);
err = -EADDRNOTAVAIL;
Expand Down
2 changes: 1 addition & 1 deletion trunk/net/ipv6/anycast.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, struct in6_addr *addr)
return -EPERM;
if (ipv6_addr_is_multicast(addr))
return -EINVAL;
if (ipv6_chk_addr(addr, NULL, 0))
if (ipv6_chk_addr(&init_net, addr, NULL, 0))
return -EINVAL;

pac = sock_kmalloc(sk, sizeof(struct ipv6_ac_socklist), GFP_KERNEL);
Expand Down
3 changes: 2 additions & 1 deletion trunk/net/ipv6/datagram.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,8 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
return -ENODEV;
}
}
if (!ipv6_chk_addr(&src_info->ipi6_addr, dev, 0)) {
if (!ipv6_chk_addr(&init_net, &src_info->ipi6_addr,
dev, 0)) {
if (dev)
dev_put(dev);
err = -EINVAL;
Expand Down
2 changes: 1 addition & 1 deletion trunk/net/ipv6/icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
*/
addr_type = ipv6_addr_type(&hdr->daddr);

if (ipv6_chk_addr(&hdr->daddr, skb->dev, 0))
if (ipv6_chk_addr(&init_net, &hdr->daddr, skb->dev, 0))
saddr = &hdr->daddr;

/*
Expand Down
8 changes: 4 additions & 4 deletions trunk/net/ipv6/ip6_tunnel.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,8 +653,8 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
ldev = dev_get_by_index(&init_net, p->link);

if ((ipv6_addr_is_multicast(&p->laddr) ||
likely(ipv6_chk_addr(&p->laddr, ldev, 0))) &&
likely(!ipv6_chk_addr(&p->raddr, NULL, 0)))
likely(ipv6_chk_addr(&init_net, &p->laddr, ldev, 0))) &&
likely(!ipv6_chk_addr(&init_net, &p->raddr, NULL, 0)))
ret = 1;

if (ldev)
Expand Down Expand Up @@ -788,12 +788,12 @@ static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
if (p->link)
ldev = dev_get_by_index(&init_net, p->link);

if (unlikely(!ipv6_chk_addr(&p->laddr, ldev, 0)))
if (unlikely(!ipv6_chk_addr(&init_net, &p->laddr, ldev, 0)))
printk(KERN_WARNING
"%s xmit: Local address not yet configured!\n",
p->name);
else if (!ipv6_addr_is_multicast(&p->raddr) &&
unlikely(ipv6_chk_addr(&p->raddr, NULL, 0)))
unlikely(ipv6_chk_addr(&init_net, &p->raddr, NULL, 0)))
printk(KERN_WARNING
"%s xmit: Routing loop! "
"Remote address found on this node!\n",
Expand Down
2 changes: 1 addition & 1 deletion trunk/net/ipv6/ndisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
int probes = atomic_read(&neigh->probes);

if (skb && ipv6_chk_addr(&ipv6_hdr(skb)->saddr, dev, 1))
if (skb && ipv6_chk_addr(&init_net, &ipv6_hdr(skb)->saddr, dev, 1))
saddr = &ipv6_hdr(skb)->saddr;

if ((probes -= neigh->parms->ucast_probes) < 0) {
Expand Down
3 changes: 2 additions & 1 deletion trunk/net/ipv6/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,8 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
v4addr = LOOPBACK4_IPV6;
if (!(addr_type & IPV6_ADDR_MULTICAST)) {
err = -EADDRNOTAVAIL;
if (!ipv6_chk_addr(&addr->sin6_addr, dev, 0)) {
if (!ipv6_chk_addr(&init_net, &addr->sin6_addr,
dev, 0)) {
if (dev)
dev_put(dev);
goto out;
Expand Down
5 changes: 3 additions & 2 deletions trunk/net/sctp/ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ static int sctp_v6_available(union sctp_addr *addr, struct sctp_sock *sp)
if (!(type & IPV6_ADDR_UNICAST))
return 0;

return ipv6_chk_addr(in6, NULL, 0);
return ipv6_chk_addr(&init_net, in6, NULL, 0);
}

/* This function checks if the address is a valid address to be used for
Expand Down Expand Up @@ -858,7 +858,8 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
dev = dev_get_by_index(&init_net, addr->v6.sin6_scope_id);
if (!dev)
return 0;
if (!ipv6_chk_addr(&addr->v6.sin6_addr, dev, 0)) {
if (!ipv6_chk_addr(&init_net, &addr->v6.sin6_addr,
dev, 0)) {
dev_put(dev);
return 0;
}
Expand Down

0 comments on commit c2cbda8

Please sign in to comment.