Commit f3ee4010 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki

[IPV6]: Define constants for link-local multicast addresses.

- Define link-local all-node / all-router multicast addresses.
- Remove ipv6_addr_all_nodes() and ipv6_addr_all_routers().
Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
parent 9acd9f3a
...@@ -48,6 +48,14 @@ extern const struct in6_addr in6addr_any; ...@@ -48,6 +48,14 @@ extern const struct in6_addr in6addr_any;
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
extern const struct in6_addr in6addr_loopback; extern const struct in6_addr in6addr_loopback;
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
#ifdef __KERNEL__
extern const struct in6_addr in6addr_linklocal_allnodes;
#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
extern const struct in6_addr in6addr_linklocal_allrouters;
#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
{ { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2 } } }
#endif
struct sockaddr_in6 { struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */ unsigned short int sin6_family; /* AF_INET6 */
......
...@@ -205,17 +205,6 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr, ...@@ -205,17 +205,6 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
htonl(0xFF000000) | addr->s6_addr32[3]); htonl(0xFF000000) | addr->s6_addr32[3]);
} }
static inline void ipv6_addr_all_nodes(struct in6_addr *addr)
{
ipv6_addr_set(addr, htonl(0xFF020000), 0, 0, htonl(0x1));
}
static inline void ipv6_addr_all_routers(struct in6_addr *addr)
{
ipv6_addr_set(addr, htonl(0xFF020000), 0, 0, htonl(0x2));
}
static inline int ipv6_addr_is_multicast(const struct in6_addr *addr) static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
{ {
return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
......
...@@ -222,6 +222,8 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { ...@@ -222,6 +222,8 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
/* Check if a valid qdisc is available */ /* Check if a valid qdisc is available */
static inline int addrconf_qdisc_ok(struct net_device *dev) static inline int addrconf_qdisc_ok(struct net_device *dev)
...@@ -321,7 +323,6 @@ EXPORT_SYMBOL(in6_dev_finish_destroy); ...@@ -321,7 +323,6 @@ EXPORT_SYMBOL(in6_dev_finish_destroy);
static struct inet6_dev * ipv6_add_dev(struct net_device *dev) static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
{ {
struct inet6_dev *ndev; struct inet6_dev *ndev;
struct in6_addr maddr;
ASSERT_RTNL(); ASSERT_RTNL();
...@@ -406,8 +407,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) ...@@ -406,8 +407,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
rcu_assign_pointer(dev->ip6_ptr, ndev); rcu_assign_pointer(dev->ip6_ptr, ndev);
/* Join all-node multicast group */ /* Join all-node multicast group */
ipv6_addr_all_nodes(&maddr); ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
ipv6_dev_mc_inc(dev, &maddr);
return ndev; return ndev;
} }
...@@ -433,18 +433,15 @@ static void dev_forward_change(struct inet6_dev *idev) ...@@ -433,18 +433,15 @@ static void dev_forward_change(struct inet6_dev *idev)
{ {
struct net_device *dev; struct net_device *dev;
struct inet6_ifaddr *ifa; struct inet6_ifaddr *ifa;
struct in6_addr addr;
if (!idev) if (!idev)
return; return;
dev = idev->dev; dev = idev->dev;
if (dev && (dev->flags & IFF_MULTICAST)) { if (dev && (dev->flags & IFF_MULTICAST)) {
ipv6_addr_all_routers(&addr);
if (idev->cnf.forwarding) if (idev->cnf.forwarding)
ipv6_dev_mc_inc(dev, &addr); ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
else else
ipv6_dev_mc_dec(dev, &addr); ipv6_dev_mc_dec(dev, &in6addr_linklocal_allrouters);
} }
for (ifa=idev->addr_list; ifa; ifa=ifa->if_next) { for (ifa=idev->addr_list; ifa; ifa=ifa->if_next) {
if (ifa->flags&IFA_F_TENTATIVE) if (ifa->flags&IFA_F_TENTATIVE)
...@@ -2654,8 +2651,6 @@ static void addrconf_rs_timer(unsigned long data) ...@@ -2654,8 +2651,6 @@ static void addrconf_rs_timer(unsigned long data)
spin_lock(&ifp->lock); spin_lock(&ifp->lock);
if (ifp->probes++ < ifp->idev->cnf.rtr_solicits) { if (ifp->probes++ < ifp->idev->cnf.rtr_solicits) {
struct in6_addr all_routers;
/* The wait after the last probe can be shorter */ /* The wait after the last probe can be shorter */
addrconf_mod_timer(ifp, AC_RS, addrconf_mod_timer(ifp, AC_RS,
(ifp->probes == ifp->idev->cnf.rtr_solicits) ? (ifp->probes == ifp->idev->cnf.rtr_solicits) ?
...@@ -2663,9 +2658,7 @@ static void addrconf_rs_timer(unsigned long data) ...@@ -2663,9 +2658,7 @@ static void addrconf_rs_timer(unsigned long data)
ifp->idev->cnf.rtr_solicit_interval); ifp->idev->cnf.rtr_solicit_interval);
spin_unlock(&ifp->lock); spin_unlock(&ifp->lock);
ipv6_addr_all_routers(&all_routers); ndisc_send_rs(ifp->idev->dev, &ifp->addr, &in6addr_linklocal_allrouters);
ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
} else { } else {
spin_unlock(&ifp->lock); spin_unlock(&ifp->lock);
/* /*
...@@ -2806,16 +2799,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp) ...@@ -2806,16 +2799,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
ifp->idev->cnf.rtr_solicits > 0 && ifp->idev->cnf.rtr_solicits > 0 &&
(dev->flags&IFF_LOOPBACK) == 0 && (dev->flags&IFF_LOOPBACK) == 0 &&
(ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) { (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
struct in6_addr all_routers;
ipv6_addr_all_routers(&all_routers);
/* /*
* If a host as already performed a random delay * If a host as already performed a random delay
* [...] as part of DAD [...] there is no need * [...] as part of DAD [...] there is no need
* to delay again before sending the first RS * to delay again before sending the first RS
*/ */
ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers); ndisc_send_rs(ifp->idev->dev, &ifp->addr, &in6addr_linklocal_allrouters);
spin_lock_bh(&ifp->lock); spin_lock_bh(&ifp->lock);
ifp->probes = 1; ifp->probes = 1;
......
...@@ -1766,10 +1766,9 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) ...@@ -1766,10 +1766,9 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
struct inet6_dev *idev; struct inet6_dev *idev;
struct sk_buff *skb; struct sk_buff *skb;
struct icmp6hdr *hdr; struct icmp6hdr *hdr;
struct in6_addr *snd_addr; const struct in6_addr *snd_addr;
struct in6_addr *addrp; struct in6_addr *addrp;
struct in6_addr addr_buf; struct in6_addr addr_buf;
struct in6_addr all_routers;
int err, len, payload_len, full_len; int err, len, payload_len, full_len;
u8 ra[8] = { IPPROTO_ICMPV6, 0, u8 ra[8] = { IPPROTO_ICMPV6, 0,
IPV6_TLV_ROUTERALERT, 2, 0, 0, IPV6_TLV_ROUTERALERT, 2, 0, 0,
...@@ -1780,11 +1779,10 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) ...@@ -1780,11 +1779,10 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
IP6_INC_STATS(__in6_dev_get(dev), IP6_INC_STATS(__in6_dev_get(dev),
IPSTATS_MIB_OUTREQUESTS); IPSTATS_MIB_OUTREQUESTS);
rcu_read_unlock(); rcu_read_unlock();
if (type == ICMPV6_MGM_REDUCTION)
snd_addr = &in6addr_linklocal_allrouters;
else
snd_addr = addr; snd_addr = addr;
if (type == ICMPV6_MGM_REDUCTION) {
snd_addr = &all_routers;
ipv6_addr_all_routers(&all_routers);
}
len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
payload_len = len + sizeof(ra); payload_len = len + sizeof(ra);
...@@ -2309,24 +2307,19 @@ void ipv6_mc_init_dev(struct inet6_dev *idev) ...@@ -2309,24 +2307,19 @@ void ipv6_mc_init_dev(struct inet6_dev *idev)
void ipv6_mc_destroy_dev(struct inet6_dev *idev) void ipv6_mc_destroy_dev(struct inet6_dev *idev)
{ {
struct ifmcaddr6 *i; struct ifmcaddr6 *i;
struct in6_addr maddr;
/* Deactivate timers */ /* Deactivate timers */
ipv6_mc_down(idev); ipv6_mc_down(idev);
/* Delete all-nodes address. */ /* Delete all-nodes address. */
ipv6_addr_all_nodes(&maddr);
/* We cannot call ipv6_dev_mc_dec() directly, our caller in /* We cannot call ipv6_dev_mc_dec() directly, our caller in
* addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will * addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will
* fail. * fail.
*/ */
__ipv6_dev_mc_dec(idev, &maddr); __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes);
if (idev->cnf.forwarding) { if (idev->cnf.forwarding)
ipv6_addr_all_routers(&maddr); __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters);
__ipv6_dev_mc_dec(idev, &maddr);
}
write_lock_bh(&idev->lock); write_lock_bh(&idev->lock);
while ((i = idev->mc_list) != NULL) { while ((i = idev->mc_list) != NULL) {
......
...@@ -818,10 +818,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) ...@@ -818,10 +818,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
is_router = !!idev->cnf.forwarding; is_router = !!idev->cnf.forwarding;
if (dad) { if (dad) {
struct in6_addr maddr; ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
ipv6_addr_all_nodes(&maddr);
ndisc_send_na(dev, NULL, &maddr, &msg->target,
is_router, 0, (ifp != NULL), 1); is_router, 0, (ifp != NULL), 1);
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment