[NET] IPV6: Fix whitespace errors.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
YOSHIFUJI Hideaki 2007-02-09 23:24:49 +09:00 committed by David S. Miller
parent e905a9edab
commit 1ab1457c42
49 changed files with 869 additions and 869 deletions

View File

@ -3,7 +3,7 @@
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
* *
* $Id: addrconf.c,v 1.69 2001/10/31 21:55:54 davem Exp $ * $Id: addrconf.c,v 1.69 2001/10/31 21:55:54 davem Exp $
@ -105,7 +105,7 @@ static void addrconf_sysctl_unregister(struct ipv6_devconf *p);
#ifdef CONFIG_IPV6_PRIVACY #ifdef CONFIG_IPV6_PRIVACY
static int __ipv6_regen_rndid(struct inet6_dev *idev); static int __ipv6_regen_rndid(struct inet6_dev *idev);
static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr); static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr);
static void ipv6_regen_rndid(unsigned long data); static void ipv6_regen_rndid(unsigned long data);
static int desync_factor = MAX_DESYNC_FACTOR * HZ; static int desync_factor = MAX_DESYNC_FACTOR * HZ;
@ -137,7 +137,7 @@ static void addrconf_rs_timer(unsigned long data);
static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
static void inet6_prefix_notify(int event, struct inet6_dev *idev, static void inet6_prefix_notify(int event, struct inet6_dev *idev,
struct prefix_info *pinfo); struct prefix_info *pinfo);
static int ipv6_chk_same_addr(const struct in6_addr *addr, struct net_device *dev); static int ipv6_chk_same_addr(const struct in6_addr *addr, struct net_device *dev);
@ -241,7 +241,7 @@ int __ipv6_addr_type(const struct in6_addr *addr)
*/ */
if ((st & htonl(0xE0000000)) != htonl(0x00000000) && if ((st & htonl(0xE0000000)) != htonl(0x00000000) &&
(st & htonl(0xE0000000)) != htonl(0xE0000000)) (st & htonl(0xE0000000)) != htonl(0xE0000000))
return (IPV6_ADDR_UNICAST | return (IPV6_ADDR_UNICAST |
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));
if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) {
@ -252,7 +252,7 @@ int __ipv6_addr_type(const struct in6_addr *addr)
} }
if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) if ((st & htonl(0xFFC00000)) == htonl(0xFE800000))
return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST | return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST |
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.1 */ IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.1 */
if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000))
return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST | return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST |
@ -272,11 +272,11 @@ int __ipv6_addr_type(const struct in6_addr *addr)
} }
if (addr->s6_addr32[2] == htonl(0x0000ffff)) if (addr->s6_addr32[2] == htonl(0x0000ffff))
return (IPV6_ADDR_MAPPED | return (IPV6_ADDR_MAPPED |
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */ IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */
} }
return (IPV6_ADDR_RESERVED | return (IPV6_ADDR_RESERVED |
IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.4 */ IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.4 */
} }
@ -348,10 +348,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
if (dev->mtu < IPV6_MIN_MTU) if (dev->mtu < IPV6_MIN_MTU)
return NULL; return NULL;
ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL); ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
if (ndev == NULL) if (ndev == NULL)
return NULL; return NULL;
rwlock_init(&ndev->lock); rwlock_init(&ndev->lock);
ndev->dev = dev; ndev->dev = dev;
@ -462,7 +462,7 @@ static void dev_forward_change(struct inet6_dev *idev)
dev = idev->dev; dev = idev->dev;
if (dev && (dev->flags & IFF_MULTICAST)) { if (dev && (dev->flags & IFF_MULTICAST)) {
ipv6_addr_all_routers(&addr); ipv6_addr_all_routers(&addr);
if (idev->cnf.forwarding) if (idev->cnf.forwarding)
ipv6_dev_mc_inc(dev, &addr); ipv6_dev_mc_inc(dev, &addr);
else else
@ -817,8 +817,8 @@ retry:
tmp_valid_lft = min_t(__u32, tmp_valid_lft = min_t(__u32,
ifp->valid_lft, ifp->valid_lft,
idev->cnf.temp_valid_lft); idev->cnf.temp_valid_lft);
tmp_prefered_lft = min_t(__u32, tmp_prefered_lft = min_t(__u32,
ifp->prefered_lft, ifp->prefered_lft,
idev->cnf.temp_prefered_lft - desync_factor / HZ); idev->cnf.temp_prefered_lft - desync_factor / HZ);
tmp_plen = ifp->prefix_len; tmp_plen = ifp->prefix_len;
max_addresses = idev->cnf.max_addresses; max_addresses = idev->cnf.max_addresses;
@ -828,7 +828,7 @@ retry:
write_unlock(&idev->lock); write_unlock(&idev->lock);
ift = !max_addresses || ift = !max_addresses ||
ipv6_count_addresses(idev) < max_addresses ? ipv6_count_addresses(idev) < max_addresses ?
ipv6_add_addr(idev, &addr, tmp_plen, ipv6_add_addr(idev, &addr, tmp_plen,
ipv6_addr_type(&addr)&IPV6_ADDR_SCOPE_MASK, IFA_F_TEMPORARY) : NULL; ipv6_addr_type(&addr)&IPV6_ADDR_SCOPE_MASK, IFA_F_TEMPORARY) : NULL;
if (!ift || IS_ERR(ift)) { if (!ift || IS_ERR(ift)) {
@ -1160,7 +1160,7 @@ record_it:
if (!ifa_result) if (!ifa_result)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
ipv6_addr_copy(saddr, &ifa_result->addr); ipv6_addr_copy(saddr, &ifa_result->addr);
in6_ifa_put(ifa_result); in6_ifa_put(ifa_result);
return 0; return 0;
@ -1475,7 +1475,7 @@ regen:
* - value 0 * - value 0
* - XXX: already assigned to an address on the device * - XXX: already assigned to an address on the device
*/ */
if (idev->rndid[0] == 0xfd && if (idev->rndid[0] == 0xfd &&
(idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xff && (idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xff &&
(idev->rndid[7]&0x80)) (idev->rndid[7]&0x80))
goto regen; goto regen;
@ -1502,9 +1502,9 @@ static void ipv6_regen_rndid(unsigned long data)
if (__ipv6_regen_rndid(idev) < 0) if (__ipv6_regen_rndid(idev) < 0)
goto out; goto out;
expires = jiffies + expires = jiffies +
idev->cnf.temp_prefered_lft * HZ - idev->cnf.temp_prefered_lft * HZ -
idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor; idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
if (time_before(expires, jiffies)) { if (time_before(expires, jiffies)) {
printk(KERN_WARNING printk(KERN_WARNING
@ -1630,12 +1630,12 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
struct inet6_dev *in6_dev; struct inet6_dev *in6_dev;
pinfo = (struct prefix_info *) opt; pinfo = (struct prefix_info *) opt;
if (len < sizeof(struct prefix_info)) { if (len < sizeof(struct prefix_info)) {
ADBG(("addrconf: prefix option too short\n")); ADBG(("addrconf: prefix option too short\n"));
return; return;
} }
/* /*
* Validation checks ([ADDRCONF], page 19) * Validation checks ([ADDRCONF], page 19)
*/ */
@ -1827,7 +1827,7 @@ ok:
* When a new public address is created as described in [ADDRCONF], * When a new public address is created as described in [ADDRCONF],
* also create a new temporary address. * also create a new temporary address.
*/ */
read_unlock_bh(&in6_dev->lock); read_unlock_bh(&in6_dev->lock);
ipv6_create_tempaddr(ifp, NULL); ipv6_create_tempaddr(ifp, NULL);
} else { } else {
read_unlock_bh(&in6_dev->lock); read_unlock_bh(&in6_dev->lock);
@ -1913,14 +1913,14 @@ static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen,
int scope; int scope;
ASSERT_RTNL(); ASSERT_RTNL();
/* check the lifetime */ /* check the lifetime */
if (!valid_lft || prefered_lft > valid_lft) if (!valid_lft || prefered_lft > valid_lft)
return -EINVAL; return -EINVAL;
if ((dev = __dev_get_by_index(ifindex)) == NULL) if ((dev = __dev_get_by_index(ifindex)) == NULL)
return -ENODEV; return -ENODEV;
if ((idev = addrconf_add_dev(dev)) == NULL) if ((idev = addrconf_add_dev(dev)) == NULL)
return -ENOBUFS; return -ENOBUFS;
@ -1960,7 +1960,7 @@ static int inet6_addr_del(int ifindex, struct in6_addr *pfx, int plen)
struct inet6_ifaddr *ifp; struct inet6_ifaddr *ifp;
struct inet6_dev *idev; struct inet6_dev *idev;
struct net_device *dev; struct net_device *dev;
if ((dev = __dev_get_by_index(ifindex)) == NULL) if ((dev = __dev_get_by_index(ifindex)) == NULL)
return -ENODEV; return -ENODEV;
@ -1973,7 +1973,7 @@ static int inet6_addr_del(int ifindex, struct in6_addr *pfx, int plen)
ipv6_addr_equal(pfx, &ifp->addr)) { ipv6_addr_equal(pfx, &ifp->addr)) {
in6_ifa_hold(ifp); in6_ifa_hold(ifp);
read_unlock_bh(&idev->lock); read_unlock_bh(&idev->lock);
ipv6_del_addr(ifp); ipv6_del_addr(ifp);
/* If the last address is deleted administratively, /* If the last address is deleted administratively,
@ -1993,10 +1993,10 @@ int addrconf_add_ifaddr(void __user *arg)
{ {
struct in6_ifreq ireq; struct in6_ifreq ireq;
int err; int err;
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq))) if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
return -EFAULT; return -EFAULT;
@ -2011,7 +2011,7 @@ int addrconf_del_ifaddr(void __user *arg)
{ {
struct in6_ifreq ireq; struct in6_ifreq ireq;
int err; int err;
if (!capable(CAP_NET_ADMIN)) if (!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
@ -2056,7 +2056,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
return; return;
} }
for (dev = dev_base; dev != NULL; dev = dev->next) { for (dev = dev_base; dev != NULL; dev = dev->next) {
struct in_device * in_dev = __in_dev_get_rtnl(dev); struct in_device * in_dev = __in_dev_get_rtnl(dev);
if (in_dev && (dev->flags & IFF_UP)) { if (in_dev && (dev->flags & IFF_UP)) {
struct in_ifaddr * ifa; struct in_ifaddr * ifa;
@ -2091,7 +2091,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
} }
} }
} }
} }
} }
#endif #endif
@ -2137,7 +2137,7 @@ static void addrconf_dev_config(struct net_device *dev)
ASSERT_RTNL(); ASSERT_RTNL();
if ((dev->type != ARPHRD_ETHER) && if ((dev->type != ARPHRD_ETHER) &&
(dev->type != ARPHRD_FDDI) && (dev->type != ARPHRD_FDDI) &&
(dev->type != ARPHRD_IEEE802_TR) && (dev->type != ARPHRD_IEEE802_TR) &&
(dev->type != ARPHRD_ARCNET) && (dev->type != ARPHRD_ARCNET) &&
@ -2164,9 +2164,9 @@ static void addrconf_sit_config(struct net_device *dev)
ASSERT_RTNL(); ASSERT_RTNL();
/* /*
* Configure the tunnel with one of our IPv4 * Configure the tunnel with one of our IPv4
* addresses... we should configure all of * addresses... we should configure all of
* our v4 addrs in the tunnel * our v4 addrs in the tunnel
*/ */
@ -2233,7 +2233,7 @@ static void addrconf_ip6_tnl_config(struct net_device *dev)
ip6_tnl_add_linklocal(idev); ip6_tnl_add_linklocal(idev);
} }
static int addrconf_notify(struct notifier_block *this, unsigned long event, static int addrconf_notify(struct notifier_block *this, unsigned long event,
void * data) void * data)
{ {
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
@ -2378,7 +2378,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
return -ENODEV; return -ENODEV;
/* Step 1: remove reference to ipv6 device from parent device. /* Step 1: remove reference to ipv6 device from parent device.
Do not dev_put! Do not dev_put!
*/ */
if (how == 1) { if (how == 1) {
idev->dead = 1; idev->dead = 1;
@ -2461,7 +2461,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
/* Step 5: netlink notification of this interface */ /* Step 5: netlink notification of this interface */
idev->tstamp = jiffies; idev->tstamp = jiffies;
inet6_ifinfo_notify(RTM_DELLINK, idev); inet6_ifinfo_notify(RTM_DELLINK, idev);
/* Shot the device (if unregistered) */ /* Shot the device (if unregistered) */
if (how == 1) { if (how == 1) {
@ -2850,8 +2850,8 @@ restart:
age = (now - ifp->tstamp) / HZ; age = (now - ifp->tstamp) / HZ;
#ifdef CONFIG_IPV6_PRIVACY #ifdef CONFIG_IPV6_PRIVACY
regen_advance = ifp->idev->cnf.regen_max_retry * regen_advance = ifp->idev->cnf.regen_max_retry *
ifp->idev->cnf.dad_transmits * ifp->idev->cnf.dad_transmits *
ifp->idev->nd_parms->retrans_time / HZ; ifp->idev->nd_parms->retrans_time / HZ;
#endif #endif
@ -3217,7 +3217,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
s_idx = cb->args[0]; s_idx = cb->args[0];
s_ip_idx = ip_idx = cb->args[1]; s_ip_idx = ip_idx = cb->args[1];
read_lock(&dev_base_lock); read_lock(&dev_base_lock);
for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) { for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
if (idx < s_idx) if (idx < s_idx)
continue; continue;
@ -3234,8 +3234,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
ifa = ifa->if_next, ip_idx++) { ifa = ifa->if_next, ip_idx++) {
if (ip_idx < s_ip_idx) if (ip_idx < s_ip_idx)
continue; continue;
if ((err = inet6_fill_ifaddr(skb, ifa, if ((err = inet6_fill_ifaddr(skb, ifa,
NETLINK_CB(cb->skb).pid, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, RTM_NEWADDR, cb->nlh->nlmsg_seq, RTM_NEWADDR,
NLM_F_MULTI)) <= 0) NLM_F_MULTI)) <= 0)
goto done; goto done;
@ -3243,12 +3243,12 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
break; break;
case MULTICAST_ADDR: case MULTICAST_ADDR:
/* multicast address */ /* multicast address */
for (ifmca = idev->mc_list; ifmca; for (ifmca = idev->mc_list; ifmca;
ifmca = ifmca->next, ip_idx++) { ifmca = ifmca->next, ip_idx++) {
if (ip_idx < s_ip_idx) if (ip_idx < s_ip_idx)
continue; continue;
if ((err = inet6_fill_ifmcaddr(skb, ifmca, if ((err = inet6_fill_ifmcaddr(skb, ifmca,
NETLINK_CB(cb->skb).pid, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, RTM_GETMULTICAST, cb->nlh->nlmsg_seq, RTM_GETMULTICAST,
NLM_F_MULTI)) <= 0) NLM_F_MULTI)) <= 0)
goto done; goto done;
@ -3260,10 +3260,10 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
ifaca = ifaca->aca_next, ip_idx++) { ifaca = ifaca->aca_next, ip_idx++) {
if (ip_idx < s_ip_idx) if (ip_idx < s_ip_idx)
continue; continue;
if ((err = inet6_fill_ifacaddr(skb, ifaca, if ((err = inet6_fill_ifacaddr(skb, ifaca,
NETLINK_CB(cb->skb).pid, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, RTM_GETANYCAST, cb->nlh->nlmsg_seq, RTM_GETANYCAST,
NLM_F_MULTI)) <= 0) NLM_F_MULTI)) <= 0)
goto done; goto done;
} }
break; break;
@ -3426,7 +3426,7 @@ static inline size_t inet6_if_nlmsg_size(void)
); );
} }
static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
u32 pid, u32 seq, int event, unsigned int flags) u32 pid, u32 seq, int event, unsigned int flags)
{ {
struct net_device *dev = idev->dev; struct net_device *dev = idev->dev;
@ -3498,7 +3498,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
continue; continue;
if ((idev = in6_dev_get(dev)) == NULL) if ((idev = in6_dev_get(dev)) == NULL)
continue; continue;
err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI); cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI);
in6_dev_put(idev); in6_dev_put(idev);
if (err <= 0) if (err <= 0)
@ -3514,7 +3514,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
{ {
struct sk_buff *skb; struct sk_buff *skb;
int err = -ENOBUFS; int err = -ENOBUFS;
skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC); skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC);
if (skb == NULL) if (skb == NULL)
goto errout; goto errout;
@ -3578,7 +3578,7 @@ nla_put_failure:
return -EMSGSIZE; return -EMSGSIZE;
} }
static void inet6_prefix_notify(int event, struct inet6_dev *idev, static void inet6_prefix_notify(int event, struct inet6_dev *idev,
struct prefix_info *pinfo) struct prefix_info *pinfo)
{ {
struct sk_buff *skb; struct sk_buff *skb;
@ -3675,10 +3675,10 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, struct file * filp,
rt6_purge_dflt_routers(); rt6_purge_dflt_routers();
} }
return ret; return ret;
} }
static int addrconf_sysctl_forward_strategy(ctl_table *table, static int addrconf_sysctl_forward_strategy(ctl_table *table,
int __user *name, int nlen, int __user *name, int nlen,
void __user *oldval, void __user *oldval,
size_t __user *oldlenp, size_t __user *oldlenp,
@ -3743,19 +3743,19 @@ static struct addrconf_sysctl_table
} addrconf_sysctl __read_mostly = { } addrconf_sysctl __read_mostly = {
.sysctl_header = NULL, .sysctl_header = NULL,
.addrconf_vars = { .addrconf_vars = {
{ {
.ctl_name = NET_IPV6_FORWARDING, .ctl_name = NET_IPV6_FORWARDING,
.procname = "forwarding", .procname = "forwarding",
.data = &ipv6_devconf.forwarding, .data = &ipv6_devconf.forwarding,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &addrconf_sysctl_forward, .proc_handler = &addrconf_sysctl_forward,
.strategy = &addrconf_sysctl_forward_strategy, .strategy = &addrconf_sysctl_forward_strategy,
}, },
{ {
.ctl_name = NET_IPV6_HOP_LIMIT, .ctl_name = NET_IPV6_HOP_LIMIT,
.procname = "hop_limit", .procname = "hop_limit",
.data = &ipv6_devconf.hop_limit, .data = &ipv6_devconf.hop_limit,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec,
@ -3764,116 +3764,116 @@ static struct addrconf_sysctl_table
.ctl_name = NET_IPV6_MTU, .ctl_name = NET_IPV6_MTU,
.procname = "mtu", .procname = "mtu",
.data = &ipv6_devconf.mtu6, .data = &ipv6_devconf.mtu6,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_ACCEPT_RA, .ctl_name = NET_IPV6_ACCEPT_RA,
.procname = "accept_ra", .procname = "accept_ra",
.data = &ipv6_devconf.accept_ra, .data = &ipv6_devconf.accept_ra,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_ACCEPT_REDIRECTS, .ctl_name = NET_IPV6_ACCEPT_REDIRECTS,
.procname = "accept_redirects", .procname = "accept_redirects",
.data = &ipv6_devconf.accept_redirects, .data = &ipv6_devconf.accept_redirects,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_AUTOCONF, .ctl_name = NET_IPV6_AUTOCONF,
.procname = "autoconf", .procname = "autoconf",
.data = &ipv6_devconf.autoconf, .data = &ipv6_devconf.autoconf,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_DAD_TRANSMITS, .ctl_name = NET_IPV6_DAD_TRANSMITS,
.procname = "dad_transmits", .procname = "dad_transmits",
.data = &ipv6_devconf.dad_transmits, .data = &ipv6_devconf.dad_transmits,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_RTR_SOLICITS, .ctl_name = NET_IPV6_RTR_SOLICITS,
.procname = "router_solicitations", .procname = "router_solicitations",
.data = &ipv6_devconf.rtr_solicits, .data = &ipv6_devconf.rtr_solicits,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_RTR_SOLICIT_INTERVAL, .ctl_name = NET_IPV6_RTR_SOLICIT_INTERVAL,
.procname = "router_solicitation_interval", .procname = "router_solicitation_interval",
.data = &ipv6_devconf.rtr_solicit_interval, .data = &ipv6_devconf.rtr_solicit_interval,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_RTR_SOLICIT_DELAY, .ctl_name = NET_IPV6_RTR_SOLICIT_DELAY,
.procname = "router_solicitation_delay", .procname = "router_solicitation_delay",
.data = &ipv6_devconf.rtr_solicit_delay, .data = &ipv6_devconf.rtr_solicit_delay,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_FORCE_MLD_VERSION, .ctl_name = NET_IPV6_FORCE_MLD_VERSION,
.procname = "force_mld_version", .procname = "force_mld_version",
.data = &ipv6_devconf.force_mld_version, .data = &ipv6_devconf.force_mld_version,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
#ifdef CONFIG_IPV6_PRIVACY #ifdef CONFIG_IPV6_PRIVACY
{ {
.ctl_name = NET_IPV6_USE_TEMPADDR, .ctl_name = NET_IPV6_USE_TEMPADDR,
.procname = "use_tempaddr", .procname = "use_tempaddr",
.data = &ipv6_devconf.use_tempaddr, .data = &ipv6_devconf.use_tempaddr,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_TEMP_VALID_LFT, .ctl_name = NET_IPV6_TEMP_VALID_LFT,
.procname = "temp_valid_lft", .procname = "temp_valid_lft",
.data = &ipv6_devconf.temp_valid_lft, .data = &ipv6_devconf.temp_valid_lft,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_TEMP_PREFERED_LFT, .ctl_name = NET_IPV6_TEMP_PREFERED_LFT,
.procname = "temp_prefered_lft", .procname = "temp_prefered_lft",
.data = &ipv6_devconf.temp_prefered_lft, .data = &ipv6_devconf.temp_prefered_lft,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_REGEN_MAX_RETRY, .ctl_name = NET_IPV6_REGEN_MAX_RETRY,
.procname = "regen_max_retry", .procname = "regen_max_retry",
.data = &ipv6_devconf.regen_max_retry, .data = &ipv6_devconf.regen_max_retry,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_MAX_DESYNC_FACTOR, .ctl_name = NET_IPV6_MAX_DESYNC_FACTOR,
.procname = "max_desync_factor", .procname = "max_desync_factor",
.data = &ipv6_devconf.max_desync_factor, .data = &ipv6_devconf.max_desync_factor,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
#endif #endif
{ {
@ -3887,18 +3887,18 @@ static struct addrconf_sysctl_table
{ {
.ctl_name = NET_IPV6_ACCEPT_RA_DEFRTR, .ctl_name = NET_IPV6_ACCEPT_RA_DEFRTR,
.procname = "accept_ra_defrtr", .procname = "accept_ra_defrtr",
.data = &ipv6_devconf.accept_ra_defrtr, .data = &ipv6_devconf.accept_ra_defrtr,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_ACCEPT_RA_PINFO, .ctl_name = NET_IPV6_ACCEPT_RA_PINFO,
.procname = "accept_ra_pinfo", .procname = "accept_ra_pinfo",
.data = &ipv6_devconf.accept_ra_pinfo, .data = &ipv6_devconf.accept_ra_pinfo,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF
{ {
@ -4003,18 +4003,18 @@ static void addrconf_sysctl_register(struct inet6_dev *idev, struct ipv6_devconf
t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */ t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
} }
if (dev) { if (dev) {
dev_name = dev->name; dev_name = dev->name;
t->addrconf_dev[0].ctl_name = dev->ifindex; t->addrconf_dev[0].ctl_name = dev->ifindex;
} else { } else {
dev_name = "default"; dev_name = "default";
t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT; t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
} }
/* /*
* Make a copy of dev_name, because '.procname' is regarded as const * Make a copy of dev_name, because '.procname' is regarded as const
* by sysctl and we wouldn't want anyone to change it under our feet * by sysctl and we wouldn't want anyone to change it under our feet
* (see SIOCSIFNAME). * (see SIOCSIFNAME).
*/ */
dev_name = kstrdup(dev_name, GFP_KERNEL); dev_name = kstrdup(dev_name, GFP_KERNEL);
if (!dev_name) if (!dev_name)
goto free; goto free;
@ -4066,12 +4066,12 @@ static void addrconf_sysctl_unregister(struct ipv6_devconf *p)
int register_inet6addr_notifier(struct notifier_block *nb) int register_inet6addr_notifier(struct notifier_block *nb)
{ {
return atomic_notifier_chain_register(&inet6addr_chain, nb); return atomic_notifier_chain_register(&inet6addr_chain, nb);
} }
int unregister_inet6addr_notifier(struct notifier_block *nb) int unregister_inet6addr_notifier(struct notifier_block *nb)
{ {
return atomic_notifier_chain_unregister(&inet6addr_chain,nb); return atomic_notifier_chain_unregister(&inet6addr_chain,nb);
} }
/* /*
@ -4124,9 +4124,9 @@ int __init addrconf_init(void)
void __exit addrconf_cleanup(void) void __exit addrconf_cleanup(void)
{ {
struct net_device *dev; struct net_device *dev;
struct inet6_dev *idev; struct inet6_dev *idev;
struct inet6_ifaddr *ifa; struct inet6_ifaddr *ifa;
int i; int i;
unregister_netdevice_notifier(&ipv6_dev_notf); unregister_netdevice_notifier(&ipv6_dev_notf);

View File

@ -1,9 +1,9 @@
/* /*
* PF_INET6 socket protocol family * PF_INET6 socket protocol family
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* Adapted from linux/net/ipv4/af_inet.c * Adapted from linux/net/ipv4/af_inet.c
* *
@ -191,7 +191,7 @@ lookup_protocol:
np->mc_loop = 1; np->mc_loop = 1;
np->pmtudisc = IPV6_PMTUDISC_WANT; np->pmtudisc = IPV6_PMTUDISC_WANT;
np->ipv6only = sysctl_ipv6_bindv6only; np->ipv6only = sysctl_ipv6_bindv6only;
/* Init the ipv4 part of the socket since we can have sockets /* Init the ipv4 part of the socket since we can have sockets
* using v6 API for ipv4. * using v6 API for ipv4.
*/ */
@ -206,7 +206,7 @@ lookup_protocol:
inet->pmtudisc = IP_PMTUDISC_DONT; inet->pmtudisc = IP_PMTUDISC_DONT;
else else
inet->pmtudisc = IP_PMTUDISC_WANT; inet->pmtudisc = IP_PMTUDISC_WANT;
/* /*
* Increment only the relevant sk_prot->socks debug field, this changes * Increment only the relevant sk_prot->socks debug field, this changes
* the previous behaviour of incrementing both the equivalent to * the previous behaviour of incrementing both the equivalent to
* answer->prot->socks (inet6_sock_nr) and inet_sock_nr. * answer->prot->socks (inet6_sock_nr) and inet_sock_nr.
@ -293,7 +293,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
*/ */
sk->sk_bound_dev_if = addr->sin6_scope_id; sk->sk_bound_dev_if = addr->sin6_scope_id;
} }
/* Binding to link-local address requires an interface */ /* Binding to link-local address requires an interface */
if (!sk->sk_bound_dev_if) { if (!sk->sk_bound_dev_if) {
err = -EINVAL; err = -EINVAL;
@ -327,7 +327,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
inet->saddr = v4addr; inet->saddr = v4addr;
ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr); ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
if (!(addr_type & IPV6_ADDR_MULTICAST)) if (!(addr_type & IPV6_ADDR_MULTICAST))
ipv6_addr_copy(&np->saddr, &addr->sin6_addr); ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
@ -393,7 +393,7 @@ EXPORT_SYMBOL_GPL(inet6_destroy_sock);
/* /*
* This does both peername and sockname. * This does both peername and sockname.
*/ */
int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer) int *uaddr_len, int peer)
{ {
@ -401,7 +401,7 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
sin->sin6_family = AF_INET6; sin->sin6_family = AF_INET6;
sin->sin6_flowinfo = 0; sin->sin6_flowinfo = 0;
sin->sin6_scope_id = 0; sin->sin6_scope_id = 0;
@ -433,14 +433,14 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
switch(cmd) switch(cmd)
{ {
case SIOCGSTAMP: case SIOCGSTAMP:
return sock_get_timestamp(sk, (struct timeval __user *)arg); return sock_get_timestamp(sk, (struct timeval __user *)arg);
case SIOCADDRT: case SIOCADDRT:
case SIOCDELRT: case SIOCDELRT:
return(ipv6_route_ioctl(cmd,(void __user *)arg)); return(ipv6_route_ioctl(cmd,(void __user *)arg));
case SIOCSIFADDR: case SIOCSIFADDR:
@ -584,7 +584,7 @@ inet6_register_protosw(struct inet_protosw *p)
/* Add the new entry after the last permanent entry if any, so that /* Add the new entry after the last permanent entry if any, so that
* the new entry does not override a permanent entry when matched with * the new entry does not override a permanent entry when matched with
* a wild-card protocol. But it is allowed to override any existing * a wild-card protocol. But it is allowed to override any existing
* non-permanent entry. This means that when we remove this entry, the * non-permanent entry. This means that when we remove this entry, the
* system automatically returns to the old behavior. * system automatically returns to the old behavior.
*/ */
list_add_rcu(&p->list, last_perm); list_add_rcu(&p->list, last_perm);
@ -749,7 +749,7 @@ err_icmp_mib:
snmp6_mib_free((void **)ipv6_statistics); snmp6_mib_free((void **)ipv6_statistics);
err_ip_mib: err_ip_mib:
return -ENOMEM; return -ENOMEM;
} }
static void cleanup_ipv6_mibs(void) static void cleanup_ipv6_mibs(void)
@ -763,7 +763,7 @@ static void cleanup_ipv6_mibs(void)
static int __init inet6_init(void) static int __init inet6_init(void)
{ {
struct sk_buff *dummy_skb; struct sk_buff *dummy_skb;
struct list_head *r; struct list_head *r;
int err; int err;
BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
@ -814,7 +814,7 @@ static int __init inet6_init(void)
err = init_ipv6_mibs(); err = init_ipv6_mibs();
if (err) if (err)
goto out_unregister_sock; goto out_unregister_sock;
/* /*
* ipngwg API draft makes clear that the correct semantics * ipngwg API draft makes clear that the correct semantics
* for TCP and UDP is to consider one TCP and UDP instance * for TCP and UDP is to consider one TCP and UDP instance
@ -933,11 +933,11 @@ static void __exit inet6_exit(void)
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
if6_proc_exit(); if6_proc_exit();
ac6_proc_exit(); ac6_proc_exit();
ipv6_misc_proc_exit(); ipv6_misc_proc_exit();
udp6_proc_exit(); udp6_proc_exit();
udplite6_proc_exit(); udplite6_proc_exit();
tcp6_proc_exit(); tcp6_proc_exit();
raw6_proc_exit(); raw6_proc_exit();
#endif #endif
#ifdef CONFIG_IPV6_MIP6 #ifdef CONFIG_IPV6_MIP6
mip6_fini(); mip6_fini();
@ -952,7 +952,7 @@ static void __exit inet6_exit(void)
ndisc_cleanup(); ndisc_cleanup();
icmpv6_cleanup(); icmpv6_cleanup();
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
ipv6_sysctl_unregister(); ipv6_sysctl_unregister();
#endif #endif
cleanup_ipv6_mibs(); cleanup_ipv6_mibs();
proto_unregister(&rawv6_prot); proto_unregister(&rawv6_prot);

View File

@ -1,26 +1,26 @@
/* /*
* Copyright (C)2002 USAGI/WIDE Project * Copyright (C)2002 USAGI/WIDE Project
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* Authors * Authors
* *
* Mitsuru KANDA @USAGI : IPv6 Support * Mitsuru KANDA @USAGI : IPv6 Support
* Kazunori MIYAZAWA @USAGI : * Kazunori MIYAZAWA @USAGI :
* Kunihiro Ishiguro <kunihiro@ipinfusion.com> * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
* *
* This file is derived from net/ipv4/ah.c. * This file is derived from net/ipv4/ah.c.
*/ */
@ -54,7 +54,7 @@ static int zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr)
optlen = 1; optlen = 1;
break; break;
default: default:
if (len < 2) if (len < 2)
goto bad; goto bad;
optlen = opt[off+1]+2; optlen = opt[off+1]+2;
if (len < optlen) if (len < optlen)
@ -152,7 +152,7 @@ static void ipv6_rearrange_rthdr(struct ipv6hdr *iph, struct ipv6_rt_hdr *rthdr)
segments_left = rthdr->segments_left; segments_left = rthdr->segments_left;
if (segments_left == 0) if (segments_left == 0)
return; return;
rthdr->segments_left = 0; rthdr->segments_left = 0;
/* The value of rthdr->hdrlen has been verified either by the system /* The value of rthdr->hdrlen has been verified either by the system
* call if it is locally generated, or by ipv6_rthdr_rcv() for incoming * call if it is locally generated, or by ipv6_rthdr_rcv() for incoming
@ -278,7 +278,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)
top_iph->hop_limit = 0; top_iph->hop_limit = 0;
ahp = x->data; ahp = x->data;
ah->hdrlen = (XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ah->hdrlen = (XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) +
ahp->icv_trunc_len) >> 2) - 2; ahp->icv_trunc_len) >> 2) - 2;
ah->reserved = 0; ah->reserved = 0;
@ -319,7 +319,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
* Moving the pointer of skb->nh.raw by using skb_pull as long as AH * Moving the pointer of skb->nh.raw by using skb_pull as long as AH
* header length. Then copy back the copy as long as hdr_len * header length. Then copy back the copy as long as hdr_len
* If destination header following AH exists, copy it into after [Ext2]. * If destination header following AH exists, copy it into after [Ext2].
* *
* |<>|[IPv6][Ext1][Ext2][Dest][Payload] * |<>|[IPv6][Ext1][Ext2][Dest][Payload]
* There is offset of AH before IPv6 header after the process. * There is offset of AH before IPv6 header after the process.
*/ */
@ -347,9 +347,9 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
nexthdr = ah->nexthdr; nexthdr = ah->nexthdr;
ah_hlen = (ah->hdrlen + 2) << 2; ah_hlen = (ah->hdrlen + 2) << 2;
if (ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_full_len) && if (ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_full_len) &&
ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len)) ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len))
goto out; goto out;
if (!pskb_may_pull(skb, ah_hlen)) if (!pskb_may_pull(skb, ah_hlen))
goto out; goto out;
@ -365,7 +365,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
skb->nh.ipv6h->flow_lbl[2] = 0; skb->nh.ipv6h->flow_lbl[2] = 0;
skb->nh.ipv6h->hop_limit = 0; skb->nh.ipv6h->hop_limit = 0;
{ {
u8 auth_data[MAX_AH_AUTH_LEN]; u8 auth_data[MAX_AH_AUTH_LEN];
memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len); memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len);
@ -395,8 +395,8 @@ out:
return err; return err;
} }
static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
int type, int code, int offset, __be32 info) int type, int code, int offset, __be32 info)
{ {
struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
struct ip_auth_hdr *ah = (struct ip_auth_hdr*)(skb->data+offset); struct ip_auth_hdr *ah = (struct ip_auth_hdr*)(skb->data+offset);
@ -445,7 +445,7 @@ static int ah6_init_state(struct xfrm_state *x)
ahp->tfm = tfm; ahp->tfm = tfm;
if (crypto_hash_setkey(tfm, ahp->key, ahp->key_len)) if (crypto_hash_setkey(tfm, ahp->key, ahp->key_len))
goto error; goto error;
/* /*
* Lookup the algorithm description maintained by xfrm_algo, * Lookup the algorithm description maintained by xfrm_algo,
* verify crypto transform properties, and store information * verify crypto transform properties, and store information
@ -462,16 +462,16 @@ static int ah6_init_state(struct xfrm_state *x)
aalg_desc->uinfo.auth.icv_fullbits/8); aalg_desc->uinfo.auth.icv_fullbits/8);
goto error; goto error;
} }
ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8; ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;
ahp->icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8; ahp->icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8;
BUG_ON(ahp->icv_trunc_len > MAX_AH_AUTH_LEN); BUG_ON(ahp->icv_trunc_len > MAX_AH_AUTH_LEN);
ahp->work_icv = kmalloc(ahp->icv_full_len, GFP_KERNEL); ahp->work_icv = kmalloc(ahp->icv_full_len, GFP_KERNEL);
if (!ahp->work_icv) if (!ahp->work_icv)
goto error; goto error;
x->props.header_len = XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len); x->props.header_len = XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len);
if (x->props.mode == XFRM_MODE_TUNNEL) if (x->props.mode == XFRM_MODE_TUNNEL)
x->props.header_len += sizeof(struct ipv6hdr); x->props.header_len += sizeof(struct ipv6hdr);

View File

@ -1,6 +1,6 @@
/* /*
* Anycast support for IPv6 * Anycast support for IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* David L Stevens (dlstevens@us.ibm.com) * David L Stevens (dlstevens@us.ibm.com)
@ -397,7 +397,7 @@ static int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr)
in6_dev_put(idev); in6_dev_put(idev);
return ret; return ret;
} }
/* /*
* check if the interface has this anycast address * check if the interface has this anycast address
*/ */

View File

@ -1,9 +1,9 @@
/* /*
* common UDP/RAW code * common UDP/RAW code
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: datagram.c,v 1.24 2002/02/01 22:01:04 davem Exp $ * $Id: datagram.c,v 1.24 2002/02/01 22:01:04 davem Exp $
* *
@ -55,10 +55,10 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
} }
if (addr_len < SIN6_LEN_RFC2133) if (addr_len < SIN6_LEN_RFC2133)
return -EINVAL; return -EINVAL;
if (usin->sin6_family != AF_INET6) if (usin->sin6_family != AF_INET6)
return -EAFNOSUPPORT; return -EAFNOSUPPORT;
memset(&fl, 0, sizeof(fl)); memset(&fl, 0, sizeof(fl));
if (np->sndflow) { if (np->sndflow) {
@ -93,14 +93,14 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
sin.sin_addr.s_addr = daddr->s6_addr32[3]; sin.sin_addr.s_addr = daddr->s6_addr32[3];
sin.sin_port = usin->sin6_port; sin.sin_port = usin->sin6_port;
err = ip4_datagram_connect(sk, err = ip4_datagram_connect(sk,
(struct sockaddr*) &sin, (struct sockaddr*) &sin,
sizeof(sin)); sizeof(sin));
ipv4_connected: ipv4_connected:
if (err) if (err)
goto out; goto out;
ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), inet->daddr); ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), inet->daddr);
if (ipv6_addr_any(&np->saddr)) { if (ipv6_addr_any(&np->saddr)) {
@ -206,7 +206,7 @@ out:
return err; return err;
} }
void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
__be16 port, u32 info, u8 *payload) __be16 port, u32 info, u8 *payload)
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
@ -223,7 +223,7 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
serr = SKB_EXT_ERR(skb); serr = SKB_EXT_ERR(skb);
serr->ee.ee_errno = err; serr->ee.ee_errno = err;
serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6; serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6;
serr->ee.ee_type = icmph->icmp6_type; serr->ee.ee_type = icmph->icmp6_type;
serr->ee.ee_code = icmph->icmp6_code; serr->ee.ee_code = icmph->icmp6_code;
serr->ee.ee_pad = 0; serr->ee.ee_pad = 0;
serr->ee.ee_info = info; serr->ee.ee_info = info;
@ -259,7 +259,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
serr = SKB_EXT_ERR(skb); serr = SKB_EXT_ERR(skb);
serr->ee.ee_errno = err; serr->ee.ee_errno = err;
serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL; serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL;
serr->ee.ee_type = 0; serr->ee.ee_type = 0;
serr->ee.ee_code = 0; serr->ee.ee_code = 0;
serr->ee.ee_pad = 0; serr->ee.ee_pad = 0;
serr->ee.ee_info = info; serr->ee.ee_info = info;
@ -274,7 +274,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
kfree_skb(skb); kfree_skb(skb);
} }
/* /*
* Handle MSG_ERRQUEUE * Handle MSG_ERRQUEUE
*/ */
int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
@ -312,7 +312,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
if (sin) { if (sin) {
sin->sin6_family = AF_INET6; sin->sin6_family = AF_INET6;
sin->sin6_flowinfo = 0; sin->sin6_flowinfo = 0;
sin->sin6_port = serr->port; sin->sin6_port = serr->port;
sin->sin6_scope_id = 0; sin->sin6_scope_id = 0;
if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) {
ipv6_addr_copy(&sin->sin6_addr, ipv6_addr_copy(&sin->sin6_addr,
@ -370,7 +370,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
spin_unlock_bh(&sk->sk_error_queue.lock); spin_unlock_bh(&sk->sk_error_queue.lock);
} }
out_free_skb: out_free_skb:
kfree_skb(skb); kfree_skb(skb);
out: out:
return err; return err;
@ -419,7 +419,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
* report extension headers (except for HbH) * report extension headers (except for HbH)
* in order. * in order.
* *
* Also note that IPV6_RECVRTHDRDSTOPTS is NOT * Also note that IPV6_RECVRTHDRDSTOPTS is NOT
* (and WILL NOT be) defined because * (and WILL NOT be) defined because
* IPV6_RECVDSTOPTS is more generic. --yoshfuji * IPV6_RECVDSTOPTS is more generic. --yoshfuji
*/ */
@ -512,15 +512,15 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
continue; continue;
switch (cmsg->cmsg_type) { switch (cmsg->cmsg_type) {
case IPV6_PKTINFO: case IPV6_PKTINFO:
case IPV6_2292PKTINFO: case IPV6_2292PKTINFO:
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) { if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg); src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);
if (src_info->ipi6_ifindex) { if (src_info->ipi6_ifindex) {
if (fl->oif && src_info->ipi6_ifindex != fl->oif) if (fl->oif && src_info->ipi6_ifindex != fl->oif)
return -EINVAL; return -EINVAL;
@ -531,7 +531,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
if (addr_type == IPV6_ADDR_ANY) if (addr_type == IPV6_ADDR_ANY)
break; break;
if (addr_type & IPV6_ADDR_LINKLOCAL) { if (addr_type & IPV6_ADDR_LINKLOCAL) {
if (!src_info->ipi6_ifindex) if (!src_info->ipi6_ifindex)
return -EINVAL; return -EINVAL;
@ -554,7 +554,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
break; break;
case IPV6_FLOWINFO: case IPV6_FLOWINFO:
if (cmsg->cmsg_len < CMSG_LEN(4)) { if (cmsg->cmsg_len < CMSG_LEN(4)) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
@ -570,7 +570,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
case IPV6_2292HOPOPTS: case IPV6_2292HOPOPTS:
case IPV6_HOPOPTS: case IPV6_HOPOPTS:
if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
@ -590,7 +590,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
break; break;
case IPV6_2292DSTOPTS: case IPV6_2292DSTOPTS:
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
@ -641,7 +641,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
case IPV6_2292RTHDR: case IPV6_2292RTHDR:
case IPV6_RTHDR: case IPV6_RTHDR:
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) { if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
@ -661,7 +661,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
len = ((rthdr->hdrlen + 1) << 3); len = ((rthdr->hdrlen + 1) << 3);
if (cmsg->cmsg_len < CMSG_LEN(len)) { if (cmsg->cmsg_len < CMSG_LEN(len)) {
err = -EINVAL; err = -EINVAL;
goto exit_f; goto exit_f;
} }
@ -716,7 +716,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
} }
default: default:
LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n", LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n",
cmsg->cmsg_type); cmsg->cmsg_type);
err = -EINVAL; err = -EINVAL;
break; break;
}; };

View File

@ -1,26 +1,26 @@
/* /*
* Copyright (C)2002 USAGI/WIDE Project * Copyright (C)2002 USAGI/WIDE Project
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* Authors * Authors
* *
* Mitsuru KANDA @USAGI : IPv6 Support * Mitsuru KANDA @USAGI : IPv6 Support
* Kazunori MIYAZAWA @USAGI : * Kazunori MIYAZAWA @USAGI :
* Kunihiro Ishiguro <kunihiro@ipinfusion.com> * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
* *
* This file is derived from net/ipv4/esp.c * This file is derived from net/ipv4/esp.c
*/ */
@ -166,7 +166,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
} }
/* If integrity check is required, do this. */ /* If integrity check is required, do this. */
if (esp->auth.icv_full_len) { if (esp->auth.icv_full_len) {
u8 sum[alen]; u8 sum[alen];
ret = esp_mac_digest(esp, skb, 0, skb->len - alen); ret = esp_mac_digest(esp, skb, 0, skb->len - alen);
@ -197,7 +197,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
if (esp->conf.ivlen) if (esp->conf.ivlen)
crypto_blkcipher_set_iv(tfm, esph->enc_data, esp->conf.ivlen); crypto_blkcipher_set_iv(tfm, esph->enc_data, esp->conf.ivlen);
{ {
u8 nexthdr[2]; u8 nexthdr[2];
struct scatterlist *sg = &esp->sgbuf[0]; struct scatterlist *sg = &esp->sgbuf[0];
u8 padlen; u8 padlen;
@ -225,7 +225,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
/* ... check padding bits here. Silly. :-) */ /* ... check padding bits here. Silly. :-) */
pskb_trim(skb, skb->len - alen - padlen - 2); pskb_trim(skb, skb->len - alen - padlen - 2);
ret = nexthdr[1]; ret = nexthdr[1];
@ -256,20 +256,20 @@ static u32 esp6_get_max_size(struct xfrm_state *x, int mtu)
} }
static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
int type, int code, int offset, __be32 info) int type, int code, int offset, __be32 info)
{ {
struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
struct ipv6_esp_hdr *esph = (struct ipv6_esp_hdr*)(skb->data+offset); struct ipv6_esp_hdr *esph = (struct ipv6_esp_hdr*)(skb->data+offset);
struct xfrm_state *x; struct xfrm_state *x;
if (type != ICMPV6_DEST_UNREACH && if (type != ICMPV6_DEST_UNREACH &&
type != ICMPV6_PKT_TOOBIG) type != ICMPV6_PKT_TOOBIG)
return; return;
x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6); x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6);
if (!x) if (!x)
return; return;
printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/" NIP6_FMT "\n", printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/" NIP6_FMT "\n",
ntohl(esph->spi), NIP6(iph->daddr)); ntohl(esph->spi), NIP6(iph->daddr));
xfrm_state_put(x); xfrm_state_put(x);
} }
@ -326,10 +326,10 @@ static int esp6_init_state(struct xfrm_state *x)
esp->auth.tfm = hash; esp->auth.tfm = hash;
if (crypto_hash_setkey(hash, esp->auth.key, esp->auth.key_len)) if (crypto_hash_setkey(hash, esp->auth.key, esp->auth.key_len))
goto error; goto error;
aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0); aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
BUG_ON(!aalg_desc); BUG_ON(!aalg_desc);
if (aalg_desc->uinfo.auth.icv_fullbits/8 != if (aalg_desc->uinfo.auth.icv_fullbits/8 !=
crypto_hash_digestsize(hash)) { crypto_hash_digestsize(hash)) {
NETDEBUG(KERN_INFO "ESP: %s digestsize %u != %hu\n", NETDEBUG(KERN_INFO "ESP: %s digestsize %u != %hu\n",
@ -338,10 +338,10 @@ static int esp6_init_state(struct xfrm_state *x)
aalg_desc->uinfo.auth.icv_fullbits/8); aalg_desc->uinfo.auth.icv_fullbits/8);
goto error; goto error;
} }
esp->auth.icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8; esp->auth.icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;
esp->auth.icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8; esp->auth.icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8;
esp->auth.work_icv = kmalloc(esp->auth.icv_full_len, GFP_KERNEL); esp->auth.work_icv = kmalloc(esp->auth.icv_full_len, GFP_KERNEL);
if (!esp->auth.work_icv) if (!esp->auth.work_icv)
goto error; goto error;

View File

@ -16,7 +16,7 @@
*/ */
/* Changes: /* Changes:
* yoshfuji : ensure not to overrun while parsing * yoshfuji : ensure not to overrun while parsing
* tlv options. * tlv options.
* Mitsuru KANDA @USAGI and: Remove ipv6_parse_exthdrs(). * Mitsuru KANDA @USAGI and: Remove ipv6_parse_exthdrs().
* YOSHIFUJI Hideaki @USAGI Register inbound extension header * YOSHIFUJI Hideaki @USAGI Register inbound extension header
@ -167,8 +167,8 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
goto bad; goto bad;
for (curr=procs; curr->type >= 0; curr++) { for (curr=procs; curr->type >= 0; curr++) {
if (curr->type == skb->nh.raw[off]) { if (curr->type == skb->nh.raw[off]) {
/* type specific length/alignment /* type specific length/alignment
checks will be performed in the checks will be performed in the
func(). */ func(). */
if (curr->func(skbp, off) == 0) if (curr->func(skbp, off) == 0)
return 0; return 0;
@ -572,7 +572,7 @@ void __init ipv6_rthdr_init(void)
For now we need to test the engine, so that I created For now we need to test the engine, so that I created
temporary (or permanent) backdoor. temporary (or permanent) backdoor.
If listening socket set IPV6_RTHDR to 2, then we invert header. If listening socket set IPV6_RTHDR to 2, then we invert header.
--ANK (980729) --ANK (980729)
*/ */
struct ipv6_txoptions * struct ipv6_txoptions *
@ -635,7 +635,7 @@ static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
return 1; return 1;
} }
LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n",
skb->nh.raw[optoff+1]); skb->nh.raw[optoff+1]);
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
} }
@ -649,7 +649,7 @@ static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff)
if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) { if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) {
LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n",
skb->nh.raw[optoff+1]); skb->nh.raw[optoff+1]);
IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
IPSTATS_MIB_INHDRERRORS); IPSTATS_MIB_INHDRERRORS);
goto drop; goto drop;
@ -740,7 +740,7 @@ static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto,
int hops; int hops;
ihdr = (struct rt0_hdr *) opt; ihdr = (struct rt0_hdr *) opt;
phdr = (struct rt0_hdr *) skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3); phdr = (struct rt0_hdr *) skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3);
memcpy(phdr, ihdr, sizeof(struct rt0_hdr)); memcpy(phdr, ihdr, sizeof(struct rt0_hdr));

View File

@ -4,13 +4,13 @@
*/ */
#include <net/ipv6.h> #include <net/ipv6.h>
/* /*
* find out if nexthdr is a well-known extension header or a protocol * find out if nexthdr is a well-known extension header or a protocol
*/ */
int ipv6_ext_hdr(u8 nexthdr) int ipv6_ext_hdr(u8 nexthdr)
{ {
/* /*
* find out if nexthdr is an extension header or a protocol * find out if nexthdr is an extension header or a protocol
*/ */
return ( (nexthdr == NEXTHDR_HOP) || return ( (nexthdr == NEXTHDR_HOP) ||
@ -25,18 +25,18 @@ int ipv6_ext_hdr(u8 nexthdr)
* Skip any extension headers. This is used by the ICMP module. * Skip any extension headers. This is used by the ICMP module.
* *
* Note that strictly speaking this conflicts with RFC 2460 4.0: * Note that strictly speaking this conflicts with RFC 2460 4.0:
* ...The contents and semantics of each extension header determine whether * ...The contents and semantics of each extension header determine whether
* or not to proceed to the next header. Therefore, extension headers must * or not to proceed to the next header. Therefore, extension headers must
* be processed strictly in the order they appear in the packet; a * be processed strictly in the order they appear in the packet; a
* receiver must not, for example, scan through a packet looking for a * receiver must not, for example, scan through a packet looking for a
* particular kind of extension header and process that header prior to * particular kind of extension header and process that header prior to
* processing all preceding ones. * processing all preceding ones.
* *
* We do exactly this. This is a protocol bug. We can't decide after a * We do exactly this. This is a protocol bug. We can't decide after a
* seeing an unknown discard-with-error flavour TLV option if it's a * seeing an unknown discard-with-error flavour TLV option if it's a
* ICMP error message or not (errors should never be send in reply to * ICMP error message or not (errors should never be send in reply to
* ICMP error messages). * ICMP error messages).
* *
* But I see no other way to do this. This might need to be reexamined * But I see no other way to do this. This might need to be reexamined
* when Linux implements ESP (and maybe AUTH) headers. * when Linux implements ESP (and maybe AUTH) headers.
* --AK * --AK
@ -90,9 +90,9 @@ int ipv6_skip_exthdr(const struct sk_buff *skb, int start, u8 *nexthdrp)
break; break;
hdrlen = 8; hdrlen = 8;
} else if (nexthdr == NEXTHDR_AUTH) } else if (nexthdr == NEXTHDR_AUTH)
hdrlen = (hp->hdrlen+2)<<2; hdrlen = (hp->hdrlen+2)<<2;
else else
hdrlen = ipv6_optlen(hp); hdrlen = ipv6_optlen(hp);
nexthdr = hp->nexthdr; nexthdr = hp->nexthdr;
start += hdrlen; start += hdrlen;

View File

@ -107,7 +107,7 @@ static __inline__ void icmpv6_xmit_unlock(void)
spin_unlock_bh(&icmpv6_socket->sk->sk_lock.slock); spin_unlock_bh(&icmpv6_socket->sk->sk_lock.slock);
} }
/* /*
* Slightly more convenient version of icmpv6_send. * Slightly more convenient version of icmpv6_send.
*/ */
void icmpv6_param_prob(struct sk_buff *skb, int code, int pos) void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
@ -153,8 +153,8 @@ static int is_ineligible(struct sk_buff *skb)
static int sysctl_icmpv6_time __read_mostly = 1*HZ; static int sysctl_icmpv6_time __read_mostly = 1*HZ;
/* /*
* Check the ICMP output rate limit * Check the ICMP output rate limit
*/ */
static inline int icmpv6_xrlim_allow(struct sock *sk, int type, static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
struct flowi *fl) struct flowi *fl)
@ -170,7 +170,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
if (type == ICMPV6_PKT_TOOBIG) if (type == ICMPV6_PKT_TOOBIG)
return 1; return 1;
/* /*
* Look up the output route. * Look up the output route.
* XXX: perhaps the expire for routing entries cloned by * XXX: perhaps the expire for routing entries cloned by
* this lookup should be more aggressive (not longer than timeout). * this lookup should be more aggressive (not longer than timeout).
@ -198,7 +198,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
/* /*
* an inline helper for the "simple" if statement below * an inline helper for the "simple" if statement below
* checks if parameter problem report is caused by an * checks if parameter problem report is caused by an
* unrecognized IPv6 option that has the Option Type * unrecognized IPv6 option that has the Option Type
* highest-order two bits set to 10 * highest-order two bits set to 10
*/ */
@ -298,7 +298,7 @@ static inline void mip6_addr_swap(struct sk_buff *skb) {}
/* /*
* Send an ICMP message in response to a packet in error * Send an ICMP message in response to a packet in error
*/ */
void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
struct net_device *dev) struct net_device *dev)
{ {
struct inet6_dev *idev = NULL; struct inet6_dev *idev = NULL;
@ -320,7 +320,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
return; return;
/* /*
* Make sure we respect the rules * Make sure we respect the rules
* i.e. RFC 1885 2.4(e) * i.e. RFC 1885 2.4(e)
* Rule (e.1) is enforced by not using icmpv6_send * Rule (e.1) is enforced by not using icmpv6_send
* in any code that processes icmp errors. * in any code that processes icmp errors.
@ -336,8 +336,8 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) { if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
if (type != ICMPV6_PKT_TOOBIG && if (type != ICMPV6_PKT_TOOBIG &&
!(type == ICMPV6_PARAMPROB && !(type == ICMPV6_PARAMPROB &&
code == ICMPV6_UNK_OPTION && code == ICMPV6_UNK_OPTION &&
(opt_unrec(skb, info)))) (opt_unrec(skb, info))))
return; return;
@ -364,7 +364,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
return; return;
} }
/* /*
* Never answer to a ICMP packet. * Never answer to a ICMP packet.
*/ */
if (is_ineligible(skb)) { if (is_ineligible(skb)) {
@ -543,14 +543,14 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
} }
err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, skb->len + sizeof(struct icmp6hdr)); err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, skb->len + sizeof(struct icmp6hdr));
ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTECHOREPLIES); ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTECHOREPLIES);
ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS); ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS);
out_put: out_put:
if (likely(idev != NULL)) if (likely(idev != NULL))
in6_dev_put(idev); in6_dev_put(idev);
dst_release(dst); dst_release(dst);
out: out:
icmpv6_xmit_unlock(); icmpv6_xmit_unlock();
} }
@ -608,7 +608,7 @@ static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info)
} }
read_unlock(&raw_v6_lock); read_unlock(&raw_v6_lock);
} }
/* /*
* Handle icmp messages * Handle icmp messages
*/ */
@ -722,9 +722,9 @@ static int icmpv6_rcv(struct sk_buff **pskb)
if (type & ICMPV6_INFOMSG_MASK) if (type & ICMPV6_INFOMSG_MASK)
break; break;
/* /*
* error of unknown type. * error of unknown type.
* must pass to upper level * must pass to upper level
*/ */
icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu); icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
@ -852,7 +852,7 @@ int icmpv6_err_convert(int type, int code, int *err)
case ICMPV6_PKT_TOOBIG: case ICMPV6_PKT_TOOBIG:
*err = EMSGSIZE; *err = EMSGSIZE;
break; break;
case ICMPV6_PARAMPROB: case ICMPV6_PARAMPROB:
*err = EPROTO; *err = EPROTO;
fatal = 1; fatal = 1;

View File

@ -115,7 +115,7 @@ struct sock *inet6_lookup_listener(struct inet_hashinfo *hashinfo,
sk_for_each(sk, node, &hashinfo->listening_hash[inet_lhashfn(hnum)]) { sk_for_each(sk, node, &hashinfo->listening_hash[inet_lhashfn(hnum)]) {
if (inet_sk(sk)->num == hnum && sk->sk_family == PF_INET6) { if (inet_sk(sk)->num == hnum && sk->sk_family == PF_INET6) {
const struct ipv6_pinfo *np = inet6_sk(sk); const struct ipv6_pinfo *np = inet6_sk(sk);
score = 1; score = 1;
if (!ipv6_addr_any(&np->rcv_saddr)) { if (!ipv6_addr_any(&np->rcv_saddr)) {
if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
@ -249,81 +249,81 @@ int inet6_hash_connect(struct inet_timewait_death_row *death_row,
{ {
struct inet_hashinfo *hinfo = death_row->hashinfo; struct inet_hashinfo *hinfo = death_row->hashinfo;
const unsigned short snum = inet_sk(sk)->num; const unsigned short snum = inet_sk(sk)->num;
struct inet_bind_hashbucket *head; struct inet_bind_hashbucket *head;
struct inet_bind_bucket *tb; struct inet_bind_bucket *tb;
int ret; int ret;
if (snum == 0) { if (snum == 0) {
const int low = sysctl_local_port_range[0]; const int low = sysctl_local_port_range[0];
const int high = sysctl_local_port_range[1]; const int high = sysctl_local_port_range[1];
const int range = high - low; const int range = high - low;
int i, port; int i, port;
static u32 hint; static u32 hint;
const u32 offset = hint + inet6_sk_port_offset(sk); const u32 offset = hint + inet6_sk_port_offset(sk);
struct hlist_node *node; struct hlist_node *node;
struct inet_timewait_sock *tw = NULL; struct inet_timewait_sock *tw = NULL;
local_bh_disable(); local_bh_disable();
for (i = 1; i <= range; i++) { for (i = 1; i <= range; i++) {
port = low + (i + offset) % range; port = low + (i + offset) % range;
head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)]; head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
spin_lock(&head->lock); spin_lock(&head->lock);
/* Does not bother with rcv_saddr checks, /* Does not bother with rcv_saddr checks,
* because the established check is already * because the established check is already
* unique enough. * unique enough.
*/ */
inet_bind_bucket_for_each(tb, node, &head->chain) { inet_bind_bucket_for_each(tb, node, &head->chain) {
if (tb->port == port) { if (tb->port == port) {
BUG_TRAP(!hlist_empty(&tb->owners)); BUG_TRAP(!hlist_empty(&tb->owners));
if (tb->fastreuse >= 0) if (tb->fastreuse >= 0)
goto next_port; goto next_port;
if (!__inet6_check_established(death_row, if (!__inet6_check_established(death_row,
sk, port, sk, port,
&tw)) &tw))
goto ok; goto ok;
goto next_port; goto next_port;
} }
} }
tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep, tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep,
head, port); head, port);
if (!tb) { if (!tb) {
spin_unlock(&head->lock); spin_unlock(&head->lock);
break; break;
} }
tb->fastreuse = -1; tb->fastreuse = -1;
goto ok; goto ok;
next_port: next_port:
spin_unlock(&head->lock); spin_unlock(&head->lock);
} }
local_bh_enable(); local_bh_enable();
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
ok: ok:
hint += i; hint += i;
/* Head lock still held and bh's disabled */ /* Head lock still held and bh's disabled */
inet_bind_hash(sk, tb, port); inet_bind_hash(sk, tb, port);
if (sk_unhashed(sk)) { if (sk_unhashed(sk)) {
inet_sk(sk)->sport = htons(port); inet_sk(sk)->sport = htons(port);
__inet6_hash(hinfo, sk); __inet6_hash(hinfo, sk);
} }
spin_unlock(&head->lock); spin_unlock(&head->lock);
if (tw) { if (tw) {
inet_twsk_deschedule(tw, death_row); inet_twsk_deschedule(tw, death_row);
inet_twsk_put(tw); inet_twsk_put(tw);
} }
ret = 0; ret = 0;
goto out; goto out;
} }
head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)]; head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
tb = inet_csk(sk)->icsk_bind_hash; tb = inet_csk(sk)->icsk_bind_hash;
spin_lock_bh(&head->lock); spin_lock_bh(&head->lock);
if (sk_head(&tb->owners) == sk && sk->sk_bind_node.next == NULL) { if (sk_head(&tb->owners) == sk && sk->sk_bind_node.next == NULL) {

View File

@ -1,9 +1,9 @@
/* /*
* Linux INET6 implementation * Linux INET6 implementation
* Forwarding Information Database * Forwarding Information Database
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: ip6_fib.c,v 1.25 2001/10/31 21:55:55 davem Exp $ * $Id: ip6_fib.c,v 1.25 2001/10/31 21:55:55 davem Exp $
* *
@ -97,7 +97,7 @@ static DEFINE_TIMER(ip6_fib_timer, fib6_run_gc, 0, 0);
static struct fib6_walker_t fib6_walker_list = { static struct fib6_walker_t fib6_walker_list = {
.prev = &fib6_walker_list, .prev = &fib6_walker_list,
.next = &fib6_walker_list, .next = &fib6_walker_list,
}; };
#define FOR_WALKERS(w) for ((w)=fib6_walker_list.next; (w) != &fib6_walker_list; (w)=(w)->next) #define FOR_WALKERS(w) for ((w)=fib6_walker_list.next; (w) != &fib6_walker_list; (w)=(w)->next)
@ -131,7 +131,7 @@ static __inline__ u32 fib6_new_sernum(void)
/* /*
* Auxiliary address test functions for the radix tree. * Auxiliary address test functions for the radix tree.
* *
* These assume a 32bit processor (although it will work on * These assume a 32bit processor (although it will work on
* 64bit processors) * 64bit processors)
*/ */
@ -434,7 +434,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
struct fib6_node *pn = NULL; struct fib6_node *pn = NULL;
struct rt6key *key; struct rt6key *key;
int bit; int bit;
__be32 dir = 0; __be32 dir = 0;
__u32 sernum = fib6_new_sernum(); __u32 sernum = fib6_new_sernum();
RT6_TRACE("fib6_add_1\n"); RT6_TRACE("fib6_add_1\n");
@ -452,27 +452,27 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
if (plen < fn->fn_bit || if (plen < fn->fn_bit ||
!ipv6_prefix_equal(&key->addr, addr, fn->fn_bit)) !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit))
goto insert_above; goto insert_above;
/* /*
* Exact match ? * Exact match ?
*/ */
if (plen == fn->fn_bit) { if (plen == fn->fn_bit) {
/* clean up an intermediate node */ /* clean up an intermediate node */
if ((fn->fn_flags & RTN_RTINFO) == 0) { if ((fn->fn_flags & RTN_RTINFO) == 0) {
rt6_release(fn->leaf); rt6_release(fn->leaf);
fn->leaf = NULL; fn->leaf = NULL;
} }
fn->fn_sernum = sernum; fn->fn_sernum = sernum;
return fn; return fn;
} }
/* /*
* We have more bits to go * We have more bits to go
*/ */
/* Try to walk down on tree. */ /* Try to walk down on tree. */
fn->fn_sernum = sernum; fn->fn_sernum = sernum;
dir = addr_bit_set(addr, fn->fn_bit); dir = addr_bit_set(addr, fn->fn_bit);
@ -490,7 +490,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
if (ln == NULL) if (ln == NULL)
return NULL; return NULL;
ln->fn_bit = plen; ln->fn_bit = plen;
ln->parent = pn; ln->parent = pn;
ln->fn_sernum = sernum; ln->fn_sernum = sernum;
@ -504,7 +504,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
insert_above: insert_above:
/* /*
* split since we don't have a common prefix anymore or * split since we don't have a common prefix anymore or
* we have a less significant route. * we have a less significant route.
* we've to insert an intermediate node on the list * we've to insert an intermediate node on the list
* this new node will point to the one we need to create * this new node will point to the one we need to create
@ -518,18 +518,18 @@ insert_above:
See comment in __ipv6_addr_diff: bit may be an invalid value, See comment in __ipv6_addr_diff: bit may be an invalid value,
but if it is >= plen, the value is ignored in any case. but if it is >= plen, the value is ignored in any case.
*/ */
bit = __ipv6_addr_diff(addr, &key->addr, addrlen); bit = __ipv6_addr_diff(addr, &key->addr, addrlen);
/* /*
* (intermediate)[in] * (intermediate)[in]
* / \ * / \
* (new leaf node)[ln] (old node)[fn] * (new leaf node)[ln] (old node)[fn]
*/ */
if (plen > bit) { if (plen > bit) {
in = node_alloc(); in = node_alloc();
ln = node_alloc(); ln = node_alloc();
if (in == NULL || ln == NULL) { if (in == NULL || ln == NULL) {
if (in) if (in)
node_free(in); node_free(in);
@ -538,8 +538,8 @@ insert_above:
return NULL; return NULL;
} }
/* /*
* new intermediate node. * new intermediate node.
* RTN_RTINFO will * RTN_RTINFO will
* be off since that an address that chooses one of * be off since that an address that chooses one of
* the branches would not match less specific routes * the branches would not match less specific routes
@ -576,7 +576,7 @@ insert_above:
} }
} else { /* plen <= bit */ } else { /* plen <= bit */
/* /*
* (new leaf node)[ln] * (new leaf node)[ln]
* / \ * / \
* (old node)[fn] NULL * (old node)[fn] NULL
@ -592,7 +592,7 @@ insert_above:
ln->parent = pn; ln->parent = pn;
ln->fn_sernum = sernum; ln->fn_sernum = sernum;
if (dir) if (dir)
pn->right = ln; pn->right = ln;
else else
@ -1206,7 +1206,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info)
* However, it is internally reenterable wrt itself and fib6_add/fib6_del. * However, it is internally reenterable wrt itself and fib6_add/fib6_del.
* It means, that we can modify tree during walking * It means, that we can modify tree during walking
* and use this function for garbage collection, clone pruning, * and use this function for garbage collection, clone pruning,
* cleaning tree when a device goes down etc. etc. * cleaning tree when a device goes down etc. etc.
* *
* It guarantees that every node will be traversed, * It guarantees that every node will be traversed,
* and that it will be traversed only once. * and that it will be traversed only once.
@ -1245,7 +1245,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
continue; continue;
} }
w->state = FWS_L; w->state = FWS_L;
#endif #endif
case FWS_L: case FWS_L:
if (fn->left) { if (fn->left) {
w->node = fn->left; w->node = fn->left;
@ -1338,7 +1338,7 @@ static int fib6_clean_node(struct fib6_walker_t *w)
/* /*
* Convenient frontend to tree walker. * Convenient frontend to tree walker.
* *
* func is called on each route. * func is called on each route.
* It may return -1 -> delete this route. * It may return -1 -> delete this route.
* 0 -> continue walking * 0 -> continue walking

View File

@ -228,10 +228,10 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
struct ipv6_txoptions * fopt) struct ipv6_txoptions * fopt)
{ {
struct ipv6_txoptions * fl_opt = fl->opt; struct ipv6_txoptions * fl_opt = fl->opt;
if (fopt == NULL || fopt->opt_flen == 0) if (fopt == NULL || fopt->opt_flen == 0)
return fl_opt; return fl_opt;
if (fl_opt != NULL) { if (fl_opt != NULL) {
opt_space->hopopt = fl_opt->hopopt; opt_space->hopopt = fl_opt->hopopt;
opt_space->dst0opt = fl_opt->dst0opt; opt_space->dst0opt = fl_opt->dst0opt;

View File

@ -1,6 +1,6 @@
/* /*
* IPv6 input * IPv6 input
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
@ -48,7 +48,7 @@
inline int ip6_rcv_finish( struct sk_buff *skb) inline int ip6_rcv_finish( struct sk_buff *skb)
{ {
if (skb->dst == NULL) if (skb->dst == NULL)
ip6_route_input(skb); ip6_route_input(skb);
@ -173,9 +173,9 @@ resubmit:
hash = nexthdr & (MAX_INET_PROTOS - 1); hash = nexthdr & (MAX_INET_PROTOS - 1);
if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) { if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) {
int ret; int ret;
if (ipprot->flags & INET6_PROTO_FINAL) { if (ipprot->flags & INET6_PROTO_FINAL) {
struct ipv6hdr *hdr; struct ipv6hdr *hdr;
/* Free reference early: we don't need it any more, /* Free reference early: we don't need it any more,
and it may hold ip_conntrack module loaded and it may hold ip_conntrack module loaded
@ -192,9 +192,9 @@ resubmit:
goto discard; goto discard;
} }
if (!(ipprot->flags & INET6_PROTO_NOPOLICY) && if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
goto discard; goto discard;
ret = ipprot->handler(&skb); ret = ipprot->handler(&skb);
if (ret > 0) if (ret > 0)
goto resubmit; goto resubmit;
@ -205,8 +205,8 @@ resubmit:
if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
IP6_INC_STATS_BH(idev, IPSTATS_MIB_INUNKNOWNPROTOS); IP6_INC_STATS_BH(idev, IPSTATS_MIB_INUNKNOWNPROTOS);
icmpv6_send(skb, ICMPV6_PARAMPROB, icmpv6_send(skb, ICMPV6_PARAMPROB,
ICMPV6_UNK_NEXTHDR, nhoff, ICMPV6_UNK_NEXTHDR, nhoff,
skb->dev); skb->dev);
} }
} else } else
IP6_INC_STATS_BH(idev, IPSTATS_MIB_INDELIVERS); IP6_INC_STATS_BH(idev, IPSTATS_MIB_INDELIVERS);
@ -253,7 +253,7 @@ int ip6_mc_input(struct sk_buff *skb)
struct dst_entry *dst; struct dst_entry *dst;
dst = skb->dst; dst = skb->dst;
if (deliver) { if (deliver) {
skb2 = skb_clone(skb, GFP_ATOMIC); skb2 = skb_clone(skb, GFP_ATOMIC);
dst_output(skb2); dst_output(skb2);

View File

@ -1,9 +1,9 @@
/* /*
* IPv6 output functions * IPv6 output functions
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: ip6_output.c,v 1.34 2002/02/01 22:01:04 davem Exp $ * $Id: ip6_output.c,v 1.34 2002/02/01 22:01:04 davem Exp $
* *
@ -363,7 +363,7 @@ int ip6_forward(struct sk_buff *skb)
struct dst_entry *dst = skb->dst; struct dst_entry *dst = skb->dst;
struct ipv6hdr *hdr = skb->nh.ipv6h; struct ipv6hdr *hdr = skb->nh.ipv6h;
struct inet6_skb_parm *opt = IP6CB(skb); struct inet6_skb_parm *opt = IP6CB(skb);
if (ipv6_devconf.forwarding == 0) if (ipv6_devconf.forwarding == 0)
goto error; goto error;
@ -473,7 +473,7 @@ int ip6_forward(struct sk_buff *skb)
hdr = skb->nh.ipv6h; hdr = skb->nh.ipv6h;
/* Mangling hops number delayed to point after skb COW */ /* Mangling hops number delayed to point after skb COW */
hdr->hop_limit--; hdr->hop_limit--;
IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS); IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
@ -659,7 +659,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
frag->nh.ipv6h->payload_len = htons(frag->len - sizeof(struct ipv6hdr)); frag->nh.ipv6h->payload_len = htons(frag->len - sizeof(struct ipv6hdr));
ip6_copy_metadata(frag, skb); ip6_copy_metadata(frag, skb);
} }
err = output(skb); err = output(skb);
if(!err) if(!err)
IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGCREATES); IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGCREATES);
@ -792,7 +792,7 @@ slow_path:
fail: fail:
IP6_INC_STATS(ip6_dst_idev(skb->dst), IP6_INC_STATS(ip6_dst_idev(skb->dst),
IPSTATS_MIB_FRAGFAILS); IPSTATS_MIB_FRAGFAILS);
kfree_skb(skb); kfree_skb(skb);
return err; return err;
} }
@ -955,7 +955,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
struct frag_hdr fhdr; struct frag_hdr fhdr;
/* specify the length of each IP datagram fragment*/ /* specify the length of each IP datagram fragment*/
skb_shinfo(skb)->gso_size = mtu - fragheaderlen - skb_shinfo(skb)->gso_size = mtu - fragheaderlen -
sizeof(struct frag_hdr); sizeof(struct frag_hdr);
skb_shinfo(skb)->gso_type = SKB_GSO_UDP; skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
ipv6_select_ident(skb, &fhdr); ipv6_select_ident(skb, &fhdr);
@ -1058,13 +1058,13 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
* fragment alignment (= 8-15 octects, in total). * fragment alignment (= 8-15 octects, in total).
* *
* Note that we may need to "move" the data from the tail of * Note that we may need to "move" the data from the tail of
* of the buffer to the new fragment when we split * of the buffer to the new fragment when we split
* the message. * the message.
* *
* FIXME: It may be fragmented into multiple chunks * FIXME: It may be fragmented into multiple chunks
* at once if non-fragmentable extension headers * at once if non-fragmentable extension headers
* are too large. * are too large.
* --yoshfuji * --yoshfuji
*/ */
inet->cork.length += length; inet->cork.length += length;
@ -1129,7 +1129,7 @@ alloc_new_skb:
/* /*
* We just reserve space for fragment header. * We just reserve space for fragment header.
* Note: this may be overallocation if the message * Note: this may be overallocation if the message
* (without MSG_MORE) fits into the MTU. * (without MSG_MORE) fits into the MTU.
*/ */
alloclen += sizeof(struct frag_hdr); alloclen += sizeof(struct frag_hdr);
@ -1310,7 +1310,7 @@ int ip6_push_pending_frames(struct sock *sk)
ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst); ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst);
skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr)); skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr));
*(__be32*)hdr = fl->fl6_flowlabel | *(__be32*)hdr = fl->fl6_flowlabel |
htonl(0x60000000 | ((int)np->cork.tclass << 20)); htonl(0x60000000 | ((int)np->cork.tclass << 20));

View File

@ -3,7 +3,7 @@
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Ville Nuorvala <vnuorval@tcs.hut.fi> * Ville Nuorvala <vnuorval@tcs.hut.fi>
* *
* $Id$ * $Id$
* *
@ -67,8 +67,8 @@ MODULE_LICENSE("GPL");
#define HASH_SIZE 32 #define HASH_SIZE 32
#define HASH(addr) ((__force u32)((addr)->s6_addr32[0] ^ (addr)->s6_addr32[1] ^ \ #define HASH(addr) ((__force u32)((addr)->s6_addr32[0] ^ (addr)->s6_addr32[1] ^ \
(addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \ (addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \
(HASH_SIZE - 1)) (HASH_SIZE - 1))
static int ip6ip6_fb_tnl_dev_init(struct net_device *dev); static int ip6ip6_fb_tnl_dev_init(struct net_device *dev);
static int ip6ip6_tnl_dev_init(struct net_device *dev); static int ip6ip6_tnl_dev_init(struct net_device *dev);
@ -90,7 +90,7 @@ static inline struct dst_entry *ip6_tnl_dst_check(struct ip6_tnl *t)
{ {
struct dst_entry *dst = t->dst_cache; struct dst_entry *dst = t->dst_cache;
if (dst && dst->obsolete && if (dst && dst->obsolete &&
dst->ops->check(dst, t->dst_cookie) == NULL) { dst->ops->check(dst, t->dst_cookie) == NULL) {
t->dst_cache = NULL; t->dst_cache = NULL;
dst_release(dst); dst_release(dst);
@ -116,12 +116,12 @@ static inline void ip6_tnl_dst_store(struct ip6_tnl *t, struct dst_entry *dst)
/** /**
* ip6ip6_tnl_lookup - fetch tunnel matching the end-point addresses * ip6ip6_tnl_lookup - fetch tunnel matching the end-point addresses
* @remote: the address of the tunnel exit-point * @remote: the address of the tunnel exit-point
* @local: the address of the tunnel entry-point * @local: the address of the tunnel entry-point
* *
* Return: * Return:
* tunnel matching given end-points if found, * tunnel matching given end-points if found,
* else fallback tunnel if its device is up, * else fallback tunnel if its device is up,
* else %NULL * else %NULL
**/ **/
@ -146,13 +146,13 @@ ip6ip6_tnl_lookup(struct in6_addr *remote, struct in6_addr *local)
/** /**
* ip6ip6_bucket - get head of list matching given tunnel parameters * ip6ip6_bucket - get head of list matching given tunnel parameters
* @p: parameters containing tunnel end-points * @p: parameters containing tunnel end-points
* *
* Description: * Description:
* ip6ip6_bucket() returns the head of the list matching the * ip6ip6_bucket() returns the head of the list matching the
* &struct in6_addr entries laddr and raddr in @p. * &struct in6_addr entries laddr and raddr in @p.
* *
* Return: head of IPv6 tunnel list * Return: head of IPv6 tunnel list
**/ **/
static struct ip6_tnl ** static struct ip6_tnl **
@ -213,8 +213,8 @@ ip6ip6_tnl_unlink(struct ip6_tnl *t)
* *
* Description: * Description:
* Create tunnel matching given parameters. * Create tunnel matching given parameters.
* *
* Return: * Return:
* created tunnel or NULL * created tunnel or NULL
**/ **/
@ -234,7 +234,7 @@ static struct ip6_tnl *ip6_tnl_create(struct ip6_tnl_parm *p)
if (__dev_get_by_name(name) == NULL) if (__dev_get_by_name(name) == NULL)
break; break;
} }
if (i == IP6_TNL_MAX) if (i == IP6_TNL_MAX)
goto failed; goto failed;
} }
dev = alloc_netdev(sizeof (*t), name, ip6ip6_tnl_dev_setup); dev = alloc_netdev(sizeof (*t), name, ip6ip6_tnl_dev_setup);
@ -258,7 +258,7 @@ failed:
/** /**
* ip6ip6_tnl_locate - find or create tunnel matching given parameters * ip6ip6_tnl_locate - find or create tunnel matching given parameters
* @p: tunnel parameters * @p: tunnel parameters
* @create: != 0 if allowed to create new tunnel if no match found * @create: != 0 if allowed to create new tunnel if no match found
* *
* Description: * Description:
@ -289,7 +289,7 @@ static struct ip6_tnl *ip6ip6_tnl_locate(struct ip6_tnl_parm *p, int create)
/** /**
* ip6ip6_tnl_dev_uninit - tunnel device uninitializer * ip6ip6_tnl_dev_uninit - tunnel device uninitializer
* @dev: the device to be destroyed * @dev: the device to be destroyed
* *
* Description: * Description:
* ip6ip6_tnl_dev_uninit() removes tunnel from its list * ip6ip6_tnl_dev_uninit() removes tunnel from its list
**/ **/
@ -314,8 +314,8 @@ ip6ip6_tnl_dev_uninit(struct net_device *dev)
* parse_tvl_tnl_enc_lim - handle encapsulation limit option * parse_tvl_tnl_enc_lim - handle encapsulation limit option
* @skb: received socket buffer * @skb: received socket buffer
* *
* Return: * Return:
* 0 if none was found, * 0 if none was found,
* else index to encapsulation limit * else index to encapsulation limit
**/ **/
@ -392,8 +392,8 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
__u16 len; __u16 len;
int err = -ENOENT; int err = -ENOENT;
/* If the packet doesn't contain the original IPv6 header we are /* If the packet doesn't contain the original IPv6 header we are
in trouble since we might need the source address for further in trouble since we might need the source address for further
processing of the error. */ processing of the error. */
read_lock(&ip6ip6_lock); read_lock(&ip6ip6_lock);
@ -418,7 +418,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_WARNING printk(KERN_WARNING
"%s: Too small hop limit or " "%s: Too small hop limit or "
"routing loop in tunnel!\n", "routing loop in tunnel!\n",
t->parms.name); t->parms.name);
rel_msg = 1; rel_msg = 1;
} }
@ -502,7 +502,7 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
int ret = 0; int ret = 0;
if (p->flags & IP6_TNL_F_CAP_RCV) { if (p->flags & IP6_TNL_F_CAP_RCV) {
struct net_device *ldev = NULL; struct net_device *ldev = NULL;
if (p->link) if (p->link)
ldev = dev_get_by_index(p->link); ldev = dev_get_by_index(p->link);
@ -525,7 +525,7 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
* Return: 0 * Return: 0
**/ **/
static int static int
ip6ip6_rcv(struct sk_buff *skb) ip6ip6_rcv(struct sk_buff *skb)
{ {
struct ipv6hdr *ipv6h; struct ipv6hdr *ipv6h;
@ -595,13 +595,13 @@ static void init_tel_txopt(struct ipv6_tel_txoption *opt, __u8 encap_limit)
/** /**
* ip6ip6_tnl_addr_conflict - compare packet addresses to tunnel's own * ip6ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
* @t: the outgoing tunnel device * @t: the outgoing tunnel device
* @hdr: IPv6 header from the incoming packet * @hdr: IPv6 header from the incoming packet
* *
* Description: * Description:
* Avoid trivial tunneling loop by checking that tunnel exit-point * Avoid trivial tunneling loop by checking that tunnel exit-point
* doesn't match source of incoming packet. * doesn't match source of incoming packet.
* *
* Return: * Return:
* 1 if conflict, * 1 if conflict,
* 0 else * 0 else
**/ **/
@ -617,7 +617,7 @@ static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
struct ip6_tnl_parm *p = &t->parms; struct ip6_tnl_parm *p = &t->parms;
int ret = 0; int ret = 0;
if (p->flags & IP6_TNL_F_CAP_XMIT) { if (p->flags & IP6_TNL_F_CAP_XMIT) {
struct net_device *ldev = NULL; struct net_device *ldev = NULL;
if (p->link) if (p->link)
@ -641,19 +641,19 @@ static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
return ret; return ret;
} }
/** /**
* ip6ip6_tnl_xmit - encapsulate packet and send * ip6ip6_tnl_xmit - encapsulate packet and send
* @skb: the outgoing socket buffer * @skb: the outgoing socket buffer
* @dev: the outgoing tunnel device * @dev: the outgoing tunnel device
* *
* Description: * Description:
* Build new header and do some sanity checks on the packet before sending * Build new header and do some sanity checks on the packet before sending
* it. * it.
* *
* Return: * Return:
* 0 * 0
**/ **/
static int static int
ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct ip6_tnl *t = netdev_priv(dev); struct ip6_tnl *t = netdev_priv(dev);
@ -715,7 +715,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
if (tdev == dev) { if (tdev == dev) {
stats->collisions++; stats->collisions++;
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_WARNING printk(KERN_WARNING
"%s: Local routing loop detected!\n", "%s: Local routing loop detected!\n",
t->parms.name); t->parms.name);
goto tx_err_dst_release; goto tx_err_dst_release;
@ -741,11 +741,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
* Okay, now see if we can stuff it in the buffer as-is. * Okay, now see if we can stuff it in the buffer as-is.
*/ */
max_headroom += LL_RESERVED_SPACE(tdev); max_headroom += LL_RESERVED_SPACE(tdev);
if (skb_headroom(skb) < max_headroom || if (skb_headroom(skb) < max_headroom ||
skb_cloned(skb) || skb_shared(skb)) { skb_cloned(skb) || skb_shared(skb)) {
struct sk_buff *new_skb; struct sk_buff *new_skb;
if (!(new_skb = skb_realloc_headroom(skb, max_headroom))) if (!(new_skb = skb_realloc_headroom(skb, max_headroom)))
goto tx_err_dst_release; goto tx_err_dst_release;
@ -775,7 +775,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
ipv6_addr_copy(&ipv6h->daddr, &fl.fl6_dst); ipv6_addr_copy(&ipv6h->daddr, &fl.fl6_dst);
nf_reset(skb); nf_reset(skb);
pkt_len = skb->len; pkt_len = skb->len;
err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL,
skb->dst->dev, dst_output); skb->dst->dev, dst_output);
if (net_xmit_eval(err) == 0) { if (net_xmit_eval(err) == 0) {
@ -898,14 +898,14 @@ ip6ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
} }
/** /**
* ip6ip6_tnl_ioctl - configure ipv6 tunnels from userspace * ip6ip6_tnl_ioctl - configure ipv6 tunnels from userspace
* @dev: virtual device associated with tunnel * @dev: virtual device associated with tunnel
* @ifr: parameters passed from userspace * @ifr: parameters passed from userspace
* @cmd: command to be performed * @cmd: command to be performed
* *
* Description: * Description:
* ip6ip6_tnl_ioctl() is used for managing IPv6 tunnels * ip6ip6_tnl_ioctl() is used for managing IPv6 tunnels
* from userspace. * from userspace.
* *
* The possible commands are the following: * The possible commands are the following:
* %SIOCGETTUNNEL: get tunnel parameters for device * %SIOCGETTUNNEL: get tunnel parameters for device
@ -913,7 +913,7 @@ ip6ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
* %SIOCCHGTUNNEL: change tunnel parameters to those given * %SIOCCHGTUNNEL: change tunnel parameters to those given
* %SIOCDELTUNNEL: delete tunnel * %SIOCDELTUNNEL: delete tunnel
* *
* The fallback device "ip6tnl0", created during module * The fallback device "ip6tnl0", created during module
* initialization, can be used for creating other tunnel devices. * initialization, can be used for creating other tunnel devices.
* *
* Return: * Return:
@ -1009,7 +1009,7 @@ ip6ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
} }
/** /**
* ip6ip6_tnl_get_stats - return the stats for tunnel device * ip6ip6_tnl_get_stats - return the stats for tunnel device
* @dev: virtual device associated with tunnel * @dev: virtual device associated with tunnel
* *
* Return: stats for device * Return: stats for device
@ -1102,7 +1102,7 @@ ip6ip6_tnl_dev_init(struct net_device *dev)
* Return: 0 * Return: 0
**/ **/
static int static int
ip6ip6_fb_tnl_dev_init(struct net_device *dev) ip6ip6_fb_tnl_dev_init(struct net_device *dev)
{ {
struct ip6_tnl *t = netdev_priv(dev); struct ip6_tnl *t = netdev_priv(dev);

View File

@ -9,25 +9,25 @@
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
/* /*
* [Memo] * [Memo]
* *
* Outbound: * Outbound:
* The compression of IP datagram MUST be done before AH/ESP processing, * The compression of IP datagram MUST be done before AH/ESP processing,
* fragmentation, and the addition of Hop-by-Hop/Routing header. * fragmentation, and the addition of Hop-by-Hop/Routing header.
* *
* Inbound: * Inbound:
* The decompression of IP datagram MUST be done after the reassembly, * The decompression of IP datagram MUST be done after the reassembly,
* AH/ESP processing. * AH/ESP processing.
*/ */
#include <linux/module.h> #include <linux/module.h>
@ -176,7 +176,7 @@ out_ok:
} }
static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
int type, int code, int offset, __be32 info) int type, int code, int offset, __be32 info)
{ {
__be32 spi; __be32 spi;
struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
@ -422,7 +422,7 @@ static int ipcomp6_init_state(struct xfrm_state *x)
x->props.header_len = 0; x->props.header_len = 0;
if (x->props.mode == XFRM_MODE_TUNNEL) if (x->props.mode == XFRM_MODE_TUNNEL)
x->props.header_len += sizeof(struct ipv6hdr); x->props.header_len += sizeof(struct ipv6hdr);
mutex_lock(&ipcomp6_resource_mutex); mutex_lock(&ipcomp6_resource_mutex);
if (!ipcomp6_alloc_scratches()) if (!ipcomp6_alloc_scratches())
goto error; goto error;
@ -455,7 +455,7 @@ error:
goto out; goto out;
} }
static struct xfrm_type ipcomp6_type = static struct xfrm_type ipcomp6_type =
{ {
.description = "IPCOMP6", .description = "IPCOMP6",
.owner = THIS_MODULE, .owner = THIS_MODULE,
@ -467,7 +467,7 @@ static struct xfrm_type ipcomp6_type =
.hdr_offset = xfrm6_find_1stfragopt, .hdr_offset = xfrm6_find_1stfragopt,
}; };
static struct inet6_protocol ipcomp6_protocol = static struct inet6_protocol ipcomp6_protocol =
{ {
.handler = xfrm6_rcv, .handler = xfrm6_rcv,
.err_handler = ipcomp6_err, .err_handler = ipcomp6_err,
@ -490,7 +490,7 @@ static int __init ipcomp6_init(void)
static void __exit ipcomp6_fini(void) static void __exit ipcomp6_fini(void)
{ {
if (inet6_del_protocol(&ipcomp6_protocol, IPPROTO_COMP) < 0) if (inet6_del_protocol(&ipcomp6_protocol, IPPROTO_COMP) < 0)
printk(KERN_INFO "ipv6 ipcomp close: can't remove protocol\n"); printk(KERN_INFO "ipv6 ipcomp close: can't remove protocol\n");
if (xfrm_unregister_type(&ipcomp6_type, AF_INET6) < 0) if (xfrm_unregister_type(&ipcomp6_type, AF_INET6) < 0)
printk(KERN_INFO "ipv6 ipcomp close: can't remove xfrm type\n"); printk(KERN_INFO "ipv6 ipcomp close: can't remove xfrm type\n");

View File

@ -1,9 +1,9 @@
/* /*
* IPv6 BSD socket options interface * IPv6 BSD socket options interface
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* Based on linux/net/ipv4/ip_sockglue.c * Based on linux/net/ipv4/ip_sockglue.c
* *
@ -164,7 +164,7 @@ out:
} }
static struct packet_type ipv6_packet_type = { static struct packet_type ipv6_packet_type = {
.type = __constant_htons(ETH_P_IPV6), .type = __constant_htons(ETH_P_IPV6),
.func = ipv6_rcv, .func = ipv6_rcv,
.gso_send_check = ipv6_gso_send_check, .gso_send_check = ipv6_gso_send_check,
.gso_segment = ipv6_gso_segment, .gso_segment = ipv6_gso_segment,
@ -320,7 +320,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
np->rxopt.bits.rxinfo = valbool; np->rxopt.bits.rxinfo = valbool;
retv = 0; retv = 0;
break; break;
case IPV6_2292PKTINFO: case IPV6_2292PKTINFO:
np->rxopt.bits.rxoinfo = valbool; np->rxopt.bits.rxoinfo = valbool;
retv = 0; retv = 0;
@ -376,7 +376,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
np->tclass = val; np->tclass = val;
retv = 0; retv = 0;
break; break;
case IPV6_RECVTCLASS: case IPV6_RECVTCLASS:
np->rxopt.bits.rxtclass = valbool; np->rxopt.bits.rxtclass = valbool;
retv = 0; retv = 0;
@ -893,7 +893,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
case IPV6_MTU: case IPV6_MTU:
{ {
struct dst_entry *dst; struct dst_entry *dst;
val = 0; val = 0;
lock_sock(sk); lock_sock(sk);
dst = sk_dst_get(sk); dst = sk_dst_get(sk);
if (dst) { if (dst) {

View File

@ -1,13 +1,13 @@
/* /*
* Multicast support for IPv6 * Multicast support for IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: mcast.c,v 1.40 2002/02/08 03:57:19 davem Exp $ * $Id: mcast.c,v 1.40 2002/02/08 03:57:19 davem Exp $
* *
* Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c * Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -644,7 +644,7 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
memset(&ss, 0, sizeof(ss)); memset(&ss, 0, sizeof(ss));
psin6->sin6_family = AF_INET6; psin6->sin6_family = AF_INET6;
psin6->sin6_addr = psl->sl_addr[i]; psin6->sin6_addr = psl->sl_addr[i];
if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss))) if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss)))
return -EFAULT; return -EFAULT;
} }
return 0; return 0;
@ -1168,7 +1168,7 @@ int igmp6_event_query(struct sk_buff *skb)
/* compute payload length excluding extension headers */ /* compute payload length excluding extension headers */
len = ntohs(skb->nh.ipv6h->payload_len) + sizeof(struct ipv6hdr); len = ntohs(skb->nh.ipv6h->payload_len) + sizeof(struct ipv6hdr);
len -= (char *)skb->h.raw - (char *)skb->nh.ipv6h; len -= (char *)skb->h.raw - (char *)skb->nh.ipv6h;
/* Drop queries with not link local source */ /* Drop queries with not link local source */
if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr)&IPV6_ADDR_LINKLOCAL)) if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr)&IPV6_ADDR_LINKLOCAL))
@ -1206,7 +1206,7 @@ int igmp6_event_query(struct sk_buff *skb)
/* clear deleted report items */ /* clear deleted report items */
mld_clear_delrec(idev); mld_clear_delrec(idev);
} else if (len >= 28) { } else if (len >= 28) {
int srcs_offset = sizeof(struct mld2_query) - int srcs_offset = sizeof(struct mld2_query) -
sizeof(struct icmp6hdr); sizeof(struct icmp6hdr);
if (!pskb_may_pull(skb, srcs_offset)) { if (!pskb_may_pull(skb, srcs_offset)) {
in6_dev_put(idev); in6_dev_put(idev);
@ -1230,7 +1230,7 @@ int igmp6_event_query(struct sk_buff *skb)
} }
/* mark sources to include, if group & source-specific */ /* mark sources to include, if group & source-specific */
if (mlh2->nsrcs != 0) { if (mlh2->nsrcs != 0) {
if (!pskb_may_pull(skb, srcs_offset + if (!pskb_may_pull(skb, srcs_offset +
ntohs(mlh2->nsrcs) * sizeof(struct in6_addr))) { ntohs(mlh2->nsrcs) * sizeof(struct in6_addr))) {
in6_dev_put(idev); in6_dev_put(idev);
return -EINVAL; return -EINVAL;
@ -1304,7 +1304,7 @@ int igmp6_event_report(struct sk_buff *skb)
/* Drop reports with not link local source */ /* Drop reports with not link local source */
addr_type = ipv6_addr_type(&skb->nh.ipv6h->saddr); addr_type = ipv6_addr_type(&skb->nh.ipv6h->saddr);
if (addr_type != IPV6_ADDR_ANY && if (addr_type != IPV6_ADDR_ANY &&
!(addr_type&IPV6_ADDR_LINKLOCAL)) !(addr_type&IPV6_ADDR_LINKLOCAL))
return -EINVAL; return -EINVAL;
@ -1413,7 +1413,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
if (ipv6_get_lladdr(dev, &addr_buf)) { if (ipv6_get_lladdr(dev, &addr_buf)) {
/* <draft-ietf-magma-mld-source-05.txt>: /* <draft-ietf-magma-mld-source-05.txt>:
* use unspecified address as the source address * use unspecified address as the source address
* when a valid link-local address is not available. * when a valid link-local address is not available.
*/ */
memset(&addr_buf, 0, sizeof(addr_buf)); memset(&addr_buf, 0, sizeof(addr_buf));
@ -1454,7 +1454,7 @@ static inline int mld_dev_queue_xmit2(struct sk_buff *skb)
static inline int mld_dev_queue_xmit(struct sk_buff *skb) static inline int mld_dev_queue_xmit(struct sk_buff *skb)
{ {
return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb, NULL, skb->dev, return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb, NULL, skb->dev,
mld_dev_queue_xmit2); mld_dev_queue_xmit2);
} }
static void mld_sendpack(struct sk_buff *skb) static void mld_sendpack(struct sk_buff *skb)
@ -1754,8 +1754,8 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
{ {
struct sock *sk = igmp6_socket->sk; struct sock *sk = igmp6_socket->sk;
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; struct in6_addr *snd_addr;
struct in6_addr *addrp; struct in6_addr *addrp;
struct in6_addr addr_buf; struct in6_addr addr_buf;
@ -1793,7 +1793,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
if (ipv6_get_lladdr(dev, &addr_buf)) { if (ipv6_get_lladdr(dev, &addr_buf)) {
/* <draft-ietf-magma-mld-source-05.txt>: /* <draft-ietf-magma-mld-source-05.txt>:
* use unspecified address as the source address * use unspecified address as the source address
* when a valid link-local address is not available. * when a valid link-local address is not available.
*/ */
memset(&addr_buf, 0, sizeof(addr_buf)); memset(&addr_buf, 0, sizeof(addr_buf));
@ -2330,7 +2330,7 @@ static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq)
struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
for (state->dev = dev_base, state->idev = NULL; for (state->dev = dev_base, state->idev = NULL;
state->dev; state->dev;
state->dev = state->dev->next) { state->dev = state->dev->next) {
struct inet6_dev *idev; struct inet6_dev *idev;
idev = in6_dev_get(state->dev); idev = in6_dev_get(state->dev);
@ -2413,7 +2413,7 @@ static int igmp6_mc_seq_show(struct seq_file *seq, void *v)
struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
seq_printf(seq, seq_printf(seq,
"%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n",
state->dev->ifindex, state->dev->name, state->dev->ifindex, state->dev->name,
NIP6(im->mca_addr), NIP6(im->mca_addr),
im->mca_users, im->mca_flags, im->mca_users, im->mca_flags,
@ -2474,7 +2474,7 @@ static inline struct ip6_sf_list *igmp6_mcf_get_first(struct seq_file *seq)
struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq); struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
for (state->dev = dev_base, state->idev = NULL, state->im = NULL; for (state->dev = dev_base, state->idev = NULL, state->im = NULL;
state->dev; state->dev;
state->dev = state->dev->next) { state->dev = state->dev->next) {
struct inet6_dev *idev; struct inet6_dev *idev;
idev = in6_dev_get(state->dev); idev = in6_dev_get(state->dev);
@ -2579,7 +2579,7 @@ static int igmp6_mcf_seq_show(struct seq_file *seq, void *v)
struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq); struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
if (v == SEQ_START_TOKEN) { if (v == SEQ_START_TOKEN) {
seq_printf(seq, seq_printf(seq,
"%3s %6s " "%3s %6s "
"%32s %32s %6s %6s\n", "Idx", "%32s %32s %6s %6s\n", "Idx",
"Device", "Multicast Address", "Device", "Multicast Address",
@ -2608,7 +2608,7 @@ static int igmp6_mcf_seq_open(struct inode *inode, struct file *file)
struct seq_file *seq; struct seq_file *seq;
int rc = -ENOMEM; int rc = -ENOMEM;
struct igmp6_mcf_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); struct igmp6_mcf_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
if (!s) if (!s)
goto out; goto out;

View File

@ -333,7 +333,7 @@ static struct xfrm_type mip6_destopt_type =
.destructor = mip6_destopt_destroy, .destructor = mip6_destopt_destroy,
.input = mip6_destopt_input, .input = mip6_destopt_input,
.output = mip6_destopt_output, .output = mip6_destopt_output,
.reject = mip6_destopt_reject, .reject = mip6_destopt_reject,
.hdr_offset = mip6_destopt_offset, .hdr_offset = mip6_destopt_offset,
.local_addr = mip6_xfrm_addr, .local_addr = mip6_xfrm_addr,
}; };

View File

@ -1,9 +1,9 @@
/* /*
* Neighbour Discovery for IPv6 * Neighbour Discovery for IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* Mike Shaver <shaver@ingenia.com> * Mike Shaver <shaver@ingenia.com>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -427,25 +427,25 @@ static inline void ndisc_flow_init(struct flowi *fl, u8 type,
static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
struct in6_addr *daddr, struct in6_addr *solicited_addr, struct in6_addr *daddr, struct in6_addr *solicited_addr,
int router, int solicited, int override, int inc_opt) int router, int solicited, int override, int inc_opt)
{ {
struct in6_addr tmpaddr; struct in6_addr tmpaddr;
struct inet6_ifaddr *ifp; struct inet6_ifaddr *ifp;
struct inet6_dev *idev; struct inet6_dev *idev;
struct flowi fl; struct flowi fl;
struct dst_entry* dst; struct dst_entry* dst;
struct sock *sk = ndisc_socket->sk; struct sock *sk = ndisc_socket->sk;
struct in6_addr *src_addr; struct in6_addr *src_addr;
struct nd_msg *msg; struct nd_msg *msg;
int len; int len;
struct sk_buff *skb; struct sk_buff *skb;
int err; int err;
len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
/* for anycast or proxy, solicited_addr != src_addr */ /* for anycast or proxy, solicited_addr != src_addr */
ifp = ipv6_get_ifaddr(solicited_addr, dev, 1); ifp = ipv6_get_ifaddr(solicited_addr, dev, 1);
if (ifp) { if (ifp) {
src_addr = solicited_addr; src_addr = solicited_addr;
in6_ifa_put(ifp); in6_ifa_put(ifp);
} else { } else {
@ -479,7 +479,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
if (skb == NULL) { if (skb == NULL) {
ND_PRINTK0(KERN_ERR ND_PRINTK0(KERN_ERR
"ICMPv6 NA: %s() failed to allocate an skb.\n", "ICMPv6 NA: %s() failed to allocate an skb.\n",
__FUNCTION__); __FUNCTION__);
dst_release(dst); dst_release(dst);
return; return;
@ -491,16 +491,16 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
msg = (struct nd_msg *)skb_put(skb, len); msg = (struct nd_msg *)skb_put(skb, len);
skb->h.raw = (unsigned char*)msg; skb->h.raw = (unsigned char*)msg;
msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
msg->icmph.icmp6_code = 0; msg->icmph.icmp6_code = 0;
msg->icmph.icmp6_cksum = 0; msg->icmph.icmp6_cksum = 0;
msg->icmph.icmp6_unused = 0; msg->icmph.icmp6_unused = 0;
msg->icmph.icmp6_router = router; msg->icmph.icmp6_router = router;
msg->icmph.icmp6_solicited = solicited; msg->icmph.icmp6_solicited = solicited;
msg->icmph.icmp6_override = override; msg->icmph.icmp6_override = override;
/* Set the target address. */ /* Set the target address. */
ipv6_addr_copy(&msg->target, solicited_addr); ipv6_addr_copy(&msg->target, solicited_addr);
if (inc_opt) if (inc_opt)
@ -508,9 +508,9 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
dev->addr_len, dev->type); dev->addr_len, dev->type);
/* checksum */ /* checksum */
msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, len, msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, len,
IPPROTO_ICMPV6, IPPROTO_ICMPV6,
csum_partial((__u8 *) msg, csum_partial((__u8 *) msg,
len, 0)); len, 0));
skb->dst = dst; skb->dst = dst;
@ -524,20 +524,20 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
if (likely(idev != NULL)) if (likely(idev != NULL))
in6_dev_put(idev); in6_dev_put(idev);
} }
void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
struct in6_addr *solicit, struct in6_addr *solicit,
struct in6_addr *daddr, struct in6_addr *saddr) struct in6_addr *daddr, struct in6_addr *saddr)
{ {
struct flowi fl; struct flowi fl;
struct dst_entry* dst; struct dst_entry* dst;
struct inet6_dev *idev; struct inet6_dev *idev;
struct sock *sk = ndisc_socket->sk; struct sock *sk = ndisc_socket->sk;
struct sk_buff *skb; struct sk_buff *skb;
struct nd_msg *msg; struct nd_msg *msg;
struct in6_addr addr_buf; struct in6_addr addr_buf;
int len; int len;
int err; int err;
int send_llinfo; int send_llinfo;
@ -569,7 +569,7 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
1, &err); 1, &err);
if (skb == NULL) { if (skb == NULL) {
ND_PRINTK0(KERN_ERR ND_PRINTK0(KERN_ERR
"ICMPv6 NA: %s() failed to allocate an skb.\n", "ICMPv6 NA: %s() failed to allocate an skb.\n",
__FUNCTION__); __FUNCTION__);
dst_release(dst); dst_release(dst);
return; return;
@ -594,9 +594,9 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
/* checksum */ /* checksum */
msg->icmph.icmp6_cksum = csum_ipv6_magic(&skb->nh.ipv6h->saddr, msg->icmph.icmp6_cksum = csum_ipv6_magic(&skb->nh.ipv6h->saddr,
daddr, len, daddr, len,
IPPROTO_ICMPV6, IPPROTO_ICMPV6,
csum_partial((__u8 *) msg, csum_partial((__u8 *) msg,
len, 0)); len, 0));
/* send it! */ /* send it! */
skb->dst = dst; skb->dst = dst;
@ -619,10 +619,10 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
struct dst_entry* dst; struct dst_entry* dst;
struct inet6_dev *idev; struct inet6_dev *idev;
struct sock *sk = ndisc_socket->sk; struct sock *sk = ndisc_socket->sk;
struct sk_buff *skb; struct sk_buff *skb;
struct icmp6hdr *hdr; struct icmp6hdr *hdr;
__u8 * opt; __u8 * opt;
int len; int len;
int err; int err;
ndisc_flow_init(&fl, NDISC_ROUTER_SOLICITATION, saddr, daddr, ndisc_flow_init(&fl, NDISC_ROUTER_SOLICITATION, saddr, daddr,
@ -640,13 +640,13 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
if (dev->addr_len) if (dev->addr_len)
len += ndisc_opt_addr_space(dev); len += ndisc_opt_addr_space(dev);
skb = sock_alloc_send_skb(sk, skb = sock_alloc_send_skb(sk,
(MAX_HEADER + sizeof(struct ipv6hdr) + (MAX_HEADER + sizeof(struct ipv6hdr) +
len + LL_RESERVED_SPACE(dev)), len + LL_RESERVED_SPACE(dev)),
1, &err); 1, &err);
if (skb == NULL) { if (skb == NULL) {
ND_PRINTK0(KERN_ERR ND_PRINTK0(KERN_ERR
"ICMPv6 RS: %s() failed to allocate an skb.\n", "ICMPv6 RS: %s() failed to allocate an skb.\n",
__FUNCTION__); __FUNCTION__);
dst_release(dst); dst_release(dst);
return; return;
@ -655,12 +655,12 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
skb_reserve(skb, LL_RESERVED_SPACE(dev)); skb_reserve(skb, LL_RESERVED_SPACE(dev));
ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
hdr = (struct icmp6hdr *)skb_put(skb, len); hdr = (struct icmp6hdr *)skb_put(skb, len);
skb->h.raw = (unsigned char*)hdr; skb->h.raw = (unsigned char*)hdr;
hdr->icmp6_type = NDISC_ROUTER_SOLICITATION; hdr->icmp6_type = NDISC_ROUTER_SOLICITATION;
hdr->icmp6_code = 0; hdr->icmp6_code = 0;
hdr->icmp6_cksum = 0; hdr->icmp6_cksum = 0;
hdr->icmp6_unused = 0; hdr->icmp6_unused = 0;
opt = (u8*) (hdr + 1); opt = (u8*) (hdr + 1);
@ -686,7 +686,7 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
if (likely(idev != NULL)) if (likely(idev != NULL))
in6_dev_put(idev); in6_dev_put(idev);
} }
static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
{ {
@ -748,7 +748,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
int is_router; int is_router;
if (ipv6_addr_is_multicast(&msg->target)) { if (ipv6_addr_is_multicast(&msg->target)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 NS: multicast target address"); "ICMPv6 NS: multicast target address");
return; return;
} }
@ -768,7 +768,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
} }
if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) { if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 NS: invalid ND options\n"); "ICMPv6 NS: invalid ND options\n");
return; return;
} }
@ -782,12 +782,12 @@ static void ndisc_recv_ns(struct sk_buff *skb)
} }
/* RFC2461 7.1.1: /* RFC2461 7.1.1:
* If the IP source address is the unspecified address, * If the IP source address is the unspecified address,
* there MUST NOT be source link-layer address option * there MUST NOT be source link-layer address option
* in the message. * in the message.
*/ */
if (dad) { if (dad) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 NS: bad DAD packet (link-layer address option)\n"); "ICMPv6 NS: bad DAD packet (link-layer address option)\n");
return; return;
} }
@ -816,7 +816,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
goto out; goto out;
} }
} }
addrconf_dad_failure(ifp); addrconf_dad_failure(ifp);
return; return;
} }
@ -829,7 +829,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
} }
if (ipv6_chk_acast_addr(dev, &msg->target) || if (ipv6_chk_acast_addr(dev, &msg->target) ||
(idev->cnf.forwarding && (idev->cnf.forwarding &&
(ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) && (ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) &&
(pneigh = pneigh_lookup(&nd_tbl, (pneigh = pneigh_lookup(&nd_tbl,
&msg->target, dev, 0)) != NULL)) { &msg->target, dev, 0)) != NULL)) {
@ -839,8 +839,8 @@ static void ndisc_recv_ns(struct sk_buff *skb)
idev->nd_parms->proxy_delay != 0) { idev->nd_parms->proxy_delay != 0) {
/* /*
* for anycast or proxy, * for anycast or proxy,
* sender should delay its response * sender should delay its response
* by a random time between 0 and * by a random time between 0 and
* MAX_ANYCAST_DELAY_TIME seconds. * MAX_ANYCAST_DELAY_TIME seconds.
* (RFC2461) -- yoshfuji * (RFC2461) -- yoshfuji
*/ */
@ -869,14 +869,14 @@ static void ndisc_recv_ns(struct sk_buff *skb)
else else
NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast); NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
/* /*
* update / create cache entry * update / create cache entry
* for the source address * for the source address
*/ */
neigh = __neigh_lookup(&nd_tbl, saddr, dev, neigh = __neigh_lookup(&nd_tbl, saddr, dev,
!inc || lladdr || !dev->addr_len); !inc || lladdr || !dev->addr_len);
if (neigh) if (neigh)
neigh_update(neigh, lladdr, NUD_STALE, neigh_update(neigh, lladdr, NUD_STALE,
NEIGH_UPDATE_F_WEAK_OVERRIDE| NEIGH_UPDATE_F_WEAK_OVERRIDE|
NEIGH_UPDATE_F_OVERRIDE); NEIGH_UPDATE_F_OVERRIDE);
if (neigh || !dev->hard_header) { if (neigh || !dev->hard_header) {
@ -926,7 +926,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
"ICMPv6 NA: solicited NA is multicasted.\n"); "ICMPv6 NA: solicited NA is multicasted.\n");
return; return;
} }
if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) { if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 NS: invalid ND option\n"); "ICMPv6 NS: invalid ND option\n");
@ -1057,7 +1057,7 @@ out:
static void ndisc_router_discovery(struct sk_buff *skb) static void ndisc_router_discovery(struct sk_buff *skb)
{ {
struct ra_msg *ra_msg = (struct ra_msg *) skb->h.raw; struct ra_msg *ra_msg = (struct ra_msg *) skb->h.raw;
struct neighbour *neigh = NULL; struct neighbour *neigh = NULL;
struct inet6_dev *in6_dev; struct inet6_dev *in6_dev;
struct rt6_info *rt = NULL; struct rt6_info *rt = NULL;
@ -1076,7 +1076,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return; return;
} }
if (optlen < 0) { if (optlen < 0) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 RA: packet too short\n"); "ICMPv6 RA: packet too short\n");
return; return;
} }
@ -1286,7 +1286,7 @@ skip_defrtr:
rt6_mtu_change(skb->dev, mtu); rt6_mtu_change(skb->dev, mtu);
} }
} }
if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) { if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 RA: invalid RA options"); "ICMPv6 RA: invalid RA options");
@ -1339,7 +1339,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
if (ipv6_addr_equal(dest, target)) { if (ipv6_addr_equal(dest, target)) {
on_link = 1; on_link = 1;
} else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) { } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 Redirect: target address is not link-local.\n"); "ICMPv6 Redirect: target address is not link-local.\n");
return; return;
} }
@ -1352,11 +1352,11 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
return; return;
} }
/* RFC2461 8.1: /* RFC2461 8.1:
* The IP source address of the Redirect MUST be the same as the current * The IP source address of the Redirect MUST be the same as the current
* first-hop router for the specified ICMP Destination Address. * first-hop router for the specified ICMP Destination Address.
*/ */
if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) { if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 Redirect: invalid ND options\n"); "ICMPv6 Redirect: invalid ND options\n");
@ -1410,8 +1410,8 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 Redirect: no link-local address on %s\n", "ICMPv6 Redirect: no link-local address on %s\n",
dev->name); dev->name);
return; return;
} }
if (!ipv6_addr_equal(&skb->nh.ipv6h->daddr, target) && if (!ipv6_addr_equal(&skb->nh.ipv6h->daddr, target) &&
!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) { !(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
@ -1507,7 +1507,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
* build redirect option and copy skb over to the new packet. * build redirect option and copy skb over to the new packet.
*/ */
memset(opt, 0, 8); memset(opt, 0, 8);
*(opt++) = ND_OPT_REDIRECT_HDR; *(opt++) = ND_OPT_REDIRECT_HDR;
*(opt++) = (rd_len >> 3); *(opt++) = (rd_len >> 3);
opt += 6; opt += 6;
@ -1556,7 +1556,7 @@ int ndisc_rcv(struct sk_buff *skb)
} }
if (msg->icmph.icmp6_code != 0) { if (msg->icmph.icmp6_code != 0) {
ND_PRINTK2(KERN_WARNING ND_PRINTK2(KERN_WARNING
"ICMPv6 NDISC: invalid ICMPv6 code: %d\n", "ICMPv6 NDISC: invalid ICMPv6 code: %d\n",
msg->icmph.icmp6_code); msg->icmph.icmp6_code);
return 0; return 0;
@ -1717,12 +1717,12 @@ int __init ndisc_init(struct net_proto_family *ops)
{ {
struct ipv6_pinfo *np; struct ipv6_pinfo *np;
struct sock *sk; struct sock *sk;
int err; int err;
err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket); err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket);
if (err < 0) { if (err < 0) {
ND_PRINTK0(KERN_ERR ND_PRINTK0(KERN_ERR
"ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n", "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n",
err); err);
ndisc_socket = NULL; /* For safety. */ ndisc_socket = NULL; /* For safety. */
return err; return err;
@ -1736,14 +1736,14 @@ int __init ndisc_init(struct net_proto_family *ops)
np->mc_loop = 0; np->mc_loop = 0;
sk->sk_prot->unhash(sk); sk->sk_prot->unhash(sk);
/* /*
* Initialize the neighbour table * Initialize the neighbour table
*/ */
neigh_table_init(&nd_tbl); neigh_table_init(&nd_tbl);
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH, neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH,
"ipv6", "ipv6",
&ndisc_ifinfo_sysctl_change, &ndisc_ifinfo_sysctl_change,
&ndisc_ifinfo_sysctl_strategy); &ndisc_ifinfo_sysctl_strategy);

View File

@ -91,7 +91,7 @@ __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN) if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN)
break; break;
if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
skb->len - dataoff, protocol, skb->len - dataoff, protocol,
csum_sub(skb->csum, csum_sub(skb->csum,
skb_checksum(skb, 0, skb_checksum(skb, 0,
dataoff, 0)))) { dataoff, 0)))) {
@ -106,7 +106,7 @@ __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
protocol, protocol,
csum_sub(0, csum_sub(0,
skb_checksum(skb, 0, skb_checksum(skb, 0,
dataoff, 0)))); dataoff, 0))));
csum = __skb_checksum_complete(skb); csum = __skb_checksum_complete(skb);
} }
return csum; return csum;

View File

@ -95,7 +95,7 @@ __ipq_find_entry(ipq_cmpfn cmpfn, unsigned long data)
list_for_each_prev(p, &queue_list) { list_for_each_prev(p, &queue_list) {
struct ipq_queue_entry *entry = (struct ipq_queue_entry *)p; struct ipq_queue_entry *entry = (struct ipq_queue_entry *)p;
if (!cmpfn || cmpfn(entry, data)) if (!cmpfn || cmpfn(entry, data))
return entry; return entry;
} }
@ -127,7 +127,7 @@ static inline void
__ipq_flush(int verdict) __ipq_flush(int verdict)
{ {
struct ipq_queue_entry *entry; struct ipq_queue_entry *entry;
while ((entry = __ipq_find_dequeue_entry(NULL, 0))) while ((entry = __ipq_find_dequeue_entry(NULL, 0)))
ipq_issue_verdict(entry, verdict); ipq_issue_verdict(entry, verdict);
} }
@ -136,21 +136,21 @@ static inline int
__ipq_set_mode(unsigned char mode, unsigned int range) __ipq_set_mode(unsigned char mode, unsigned int range)
{ {
int status = 0; int status = 0;
switch(mode) { switch(mode) {
case IPQ_COPY_NONE: case IPQ_COPY_NONE:
case IPQ_COPY_META: case IPQ_COPY_META:
copy_mode = mode; copy_mode = mode;
copy_range = 0; copy_range = 0;
break; break;
case IPQ_COPY_PACKET: case IPQ_COPY_PACKET:
copy_mode = mode; copy_mode = mode;
copy_range = range; copy_range = range;
if (copy_range > 0xFFFF) if (copy_range > 0xFFFF)
copy_range = 0xFFFF; copy_range = 0xFFFF;
break; break;
default: default:
status = -EINVAL; status = -EINVAL;
@ -171,7 +171,7 @@ static struct ipq_queue_entry *
ipq_find_dequeue_entry(ipq_cmpfn cmpfn, unsigned long data) ipq_find_dequeue_entry(ipq_cmpfn cmpfn, unsigned long data)
{ {
struct ipq_queue_entry *entry; struct ipq_queue_entry *entry;
write_lock_bh(&queue_lock); write_lock_bh(&queue_lock);
entry = __ipq_find_dequeue_entry(cmpfn, data); entry = __ipq_find_dequeue_entry(cmpfn, data);
write_unlock_bh(&queue_lock); write_unlock_bh(&queue_lock);
@ -197,14 +197,14 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
struct nlmsghdr *nlh; struct nlmsghdr *nlh;
read_lock_bh(&queue_lock); read_lock_bh(&queue_lock);
switch (copy_mode) { switch (copy_mode) {
case IPQ_COPY_META: case IPQ_COPY_META:
case IPQ_COPY_NONE: case IPQ_COPY_NONE:
size = NLMSG_SPACE(sizeof(*pmsg)); size = NLMSG_SPACE(sizeof(*pmsg));
data_len = 0; data_len = 0;
break; break;
case IPQ_COPY_PACKET: case IPQ_COPY_PACKET:
if ((entry->skb->ip_summed == CHECKSUM_PARTIAL || if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
entry->skb->ip_summed == CHECKSUM_COMPLETE) && entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
@ -216,10 +216,10 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
data_len = entry->skb->len; data_len = entry->skb->len;
else else
data_len = copy_range; data_len = copy_range;
size = NLMSG_SPACE(sizeof(*pmsg) + data_len); size = NLMSG_SPACE(sizeof(*pmsg) + data_len);
break; break;
default: default:
*errp = -EINVAL; *errp = -EINVAL;
read_unlock_bh(&queue_lock); read_unlock_bh(&queue_lock);
@ -231,7 +231,7 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
skb = alloc_skb(size, GFP_ATOMIC); skb = alloc_skb(size, GFP_ATOMIC);
if (!skb) if (!skb)
goto nlmsg_failure; goto nlmsg_failure;
old_tail= skb->tail; old_tail= skb->tail;
nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh)); nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh));
pmsg = NLMSG_DATA(nlh); pmsg = NLMSG_DATA(nlh);
@ -244,29 +244,29 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
pmsg->mark = entry->skb->mark; pmsg->mark = entry->skb->mark;
pmsg->hook = entry->info->hook; pmsg->hook = entry->info->hook;
pmsg->hw_protocol = entry->skb->protocol; pmsg->hw_protocol = entry->skb->protocol;
if (entry->info->indev) if (entry->info->indev)
strcpy(pmsg->indev_name, entry->info->indev->name); strcpy(pmsg->indev_name, entry->info->indev->name);
else else
pmsg->indev_name[0] = '\0'; pmsg->indev_name[0] = '\0';
if (entry->info->outdev) if (entry->info->outdev)
strcpy(pmsg->outdev_name, entry->info->outdev->name); strcpy(pmsg->outdev_name, entry->info->outdev->name);
else else
pmsg->outdev_name[0] = '\0'; pmsg->outdev_name[0] = '\0';
if (entry->info->indev && entry->skb->dev) { if (entry->info->indev && entry->skb->dev) {
pmsg->hw_type = entry->skb->dev->type; pmsg->hw_type = entry->skb->dev->type;
if (entry->skb->dev->hard_header_parse) if (entry->skb->dev->hard_header_parse)
pmsg->hw_addrlen = pmsg->hw_addrlen =
entry->skb->dev->hard_header_parse(entry->skb, entry->skb->dev->hard_header_parse(entry->skb,
pmsg->hw_addr); pmsg->hw_addr);
} }
if (data_len) if (data_len)
if (skb_copy_bits(entry->skb, 0, pmsg->payload, data_len)) if (skb_copy_bits(entry->skb, 0, pmsg->payload, data_len))
BUG(); BUG();
nlh->nlmsg_len = skb->tail - old_tail; nlh->nlmsg_len = skb->tail - old_tail;
return skb; return skb;
@ -279,7 +279,7 @@ nlmsg_failure:
} }
static int static int
ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info, ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
unsigned int queuenum, void *data) unsigned int queuenum, void *data)
{ {
int status = -EINVAL; int status = -EINVAL;
@ -301,37 +301,37 @@ ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
nskb = ipq_build_packet_message(entry, &status); nskb = ipq_build_packet_message(entry, &status);
if (nskb == NULL) if (nskb == NULL)
goto err_out_free; goto err_out_free;
write_lock_bh(&queue_lock); write_lock_bh(&queue_lock);
if (!peer_pid) if (!peer_pid)
goto err_out_free_nskb; goto err_out_free_nskb;
if (queue_total >= queue_maxlen) { if (queue_total >= queue_maxlen) {
queue_dropped++; queue_dropped++;
status = -ENOSPC; status = -ENOSPC;
if (net_ratelimit()) if (net_ratelimit())
printk (KERN_WARNING "ip6_queue: fill at %d entries, " printk (KERN_WARNING "ip6_queue: fill at %d entries, "
"dropping packet(s). Dropped: %d\n", queue_total, "dropping packet(s). Dropped: %d\n", queue_total,
queue_dropped); queue_dropped);
goto err_out_free_nskb; goto err_out_free_nskb;
} }
/* netlink_unicast will either free the nskb or attach it to a socket */ /* netlink_unicast will either free the nskb or attach it to a socket */
status = netlink_unicast(ipqnl, nskb, peer_pid, MSG_DONTWAIT); status = netlink_unicast(ipqnl, nskb, peer_pid, MSG_DONTWAIT);
if (status < 0) { if (status < 0) {
queue_user_dropped++; queue_user_dropped++;
goto err_out_unlock; goto err_out_unlock;
} }
__ipq_enqueue_entry(entry); __ipq_enqueue_entry(entry);
write_unlock_bh(&queue_lock); write_unlock_bh(&queue_lock);
return status; return status;
err_out_free_nskb: err_out_free_nskb:
kfree_skb(nskb); kfree_skb(nskb);
err_out_unlock: err_out_unlock:
write_unlock_bh(&queue_lock); write_unlock_bh(&queue_lock);
@ -357,11 +357,11 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
return -EINVAL; return -EINVAL;
if (diff > skb_tailroom(e->skb)) { if (diff > skb_tailroom(e->skb)) {
struct sk_buff *newskb; struct sk_buff *newskb;
newskb = skb_copy_expand(e->skb, newskb = skb_copy_expand(e->skb,
skb_headroom(e->skb), skb_headroom(e->skb),
diff, diff,
GFP_ATOMIC); GFP_ATOMIC);
if (newskb == NULL) { if (newskb == NULL) {
printk(KERN_WARNING "ip6_queue: OOM " printk(KERN_WARNING "ip6_queue: OOM "
"in mangle, dropping packet\n"); "in mangle, dropping packet\n");
@ -401,11 +401,11 @@ ipq_set_verdict(struct ipq_verdict_msg *vmsg, unsigned int len)
return -ENOENT; return -ENOENT;
else { else {
int verdict = vmsg->value; int verdict = vmsg->value;
if (vmsg->data_len && vmsg->data_len == len) if (vmsg->data_len && vmsg->data_len == len)
if (ipq_mangle_ipv6(vmsg, entry) < 0) if (ipq_mangle_ipv6(vmsg, entry) < 0)
verdict = NF_DROP; verdict = NF_DROP;
ipq_issue_verdict(entry, verdict); ipq_issue_verdict(entry, verdict);
return 0; return 0;
} }
@ -424,7 +424,7 @@ ipq_set_mode(unsigned char mode, unsigned int range)
static int static int
ipq_receive_peer(struct ipq_peer_msg *pmsg, ipq_receive_peer(struct ipq_peer_msg *pmsg,
unsigned char type, unsigned int len) unsigned char type, unsigned int len)
{ {
int status = 0; int status = 0;
@ -434,15 +434,15 @@ ipq_receive_peer(struct ipq_peer_msg *pmsg,
switch (type) { switch (type) {
case IPQM_MODE: case IPQM_MODE:
status = ipq_set_mode(pmsg->msg.mode.value, status = ipq_set_mode(pmsg->msg.mode.value,
pmsg->msg.mode.range); pmsg->msg.mode.range);
break; break;
case IPQM_VERDICT: case IPQM_VERDICT:
if (pmsg->msg.verdict.value > NF_MAX_VERDICT) if (pmsg->msg.verdict.value > NF_MAX_VERDICT)
status = -EINVAL; status = -EINVAL;
else else
status = ipq_set_verdict(&pmsg->msg.verdict, status = ipq_set_verdict(&pmsg->msg.verdict,
len - sizeof(*pmsg)); len - sizeof(*pmsg));
break; break;
default: default:
status = -EINVAL; status = -EINVAL;
@ -456,7 +456,7 @@ dev_cmp(struct ipq_queue_entry *entry, unsigned long ifindex)
if (entry->info->indev) if (entry->info->indev)
if (entry->info->indev->ifindex == ifindex) if (entry->info->indev->ifindex == ifindex)
return 1; return 1;
if (entry->info->outdev) if (entry->info->outdev)
if (entry->info->outdev->ifindex == ifindex) if (entry->info->outdev->ifindex == ifindex)
return 1; return 1;
@ -468,7 +468,7 @@ static void
ipq_dev_drop(int ifindex) ipq_dev_drop(int ifindex)
{ {
struct ipq_queue_entry *entry; struct ipq_queue_entry *entry;
while ((entry = ipq_find_dequeue_entry(dev_cmp, ifindex)) != NULL) while ((entry = ipq_find_dequeue_entry(dev_cmp, ifindex)) != NULL)
ipq_issue_verdict(entry, NF_DROP); ipq_issue_verdict(entry, NF_DROP);
} }
@ -492,25 +492,25 @@ ipq_rcv_skb(struct sk_buff *skb)
pid = nlh->nlmsg_pid; pid = nlh->nlmsg_pid;
flags = nlh->nlmsg_flags; flags = nlh->nlmsg_flags;
if(pid <= 0 || !(flags & NLM_F_REQUEST) || flags & NLM_F_MULTI) if(pid <= 0 || !(flags & NLM_F_REQUEST) || flags & NLM_F_MULTI)
RCV_SKB_FAIL(-EINVAL); RCV_SKB_FAIL(-EINVAL);
if (flags & MSG_TRUNC) if (flags & MSG_TRUNC)
RCV_SKB_FAIL(-ECOMM); RCV_SKB_FAIL(-ECOMM);
type = nlh->nlmsg_type; type = nlh->nlmsg_type;
if (type < NLMSG_NOOP || type >= IPQM_MAX) if (type < NLMSG_NOOP || type >= IPQM_MAX)
RCV_SKB_FAIL(-EINVAL); RCV_SKB_FAIL(-EINVAL);
if (type <= IPQM_BASE) if (type <= IPQM_BASE)
return; return;
if (security_netlink_recv(skb, CAP_NET_ADMIN)) if (security_netlink_recv(skb, CAP_NET_ADMIN))
RCV_SKB_FAIL(-EPERM); RCV_SKB_FAIL(-EPERM);
write_lock_bh(&queue_lock); write_lock_bh(&queue_lock);
if (peer_pid) { if (peer_pid) {
if (peer_pid != pid) { if (peer_pid != pid) {
write_unlock_bh(&queue_lock); write_unlock_bh(&queue_lock);
@ -520,17 +520,17 @@ ipq_rcv_skb(struct sk_buff *skb)
net_enable_timestamp(); net_enable_timestamp();
peer_pid = pid; peer_pid = pid;
} }
write_unlock_bh(&queue_lock); write_unlock_bh(&queue_lock);
status = ipq_receive_peer(NLMSG_DATA(nlh), type, status = ipq_receive_peer(NLMSG_DATA(nlh), type,
nlmsglen - NLMSG_LENGTH(0)); nlmsglen - NLMSG_LENGTH(0));
if (status < 0) if (status < 0)
RCV_SKB_FAIL(status); RCV_SKB_FAIL(status);
if (flags & NLM_F_ACK) if (flags & NLM_F_ACK)
netlink_ack(skb, nlh, 0); netlink_ack(skb, nlh, 0);
return; return;
} }
static void static void
@ -540,19 +540,19 @@ ipq_rcv_sk(struct sock *sk, int len)
unsigned int qlen; unsigned int qlen;
mutex_lock(&ipqnl_mutex); mutex_lock(&ipqnl_mutex);
for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) { for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue); skb = skb_dequeue(&sk->sk_receive_queue);
ipq_rcv_skb(skb); ipq_rcv_skb(skb);
kfree_skb(skb); kfree_skb(skb);
} }
mutex_unlock(&ipqnl_mutex); mutex_unlock(&ipqnl_mutex);
} }
static int static int
ipq_rcv_dev_event(struct notifier_block *this, ipq_rcv_dev_event(struct notifier_block *this,
unsigned long event, void *ptr) unsigned long event, void *ptr)
{ {
struct net_device *dev = ptr; struct net_device *dev = ptr;
@ -568,7 +568,7 @@ static struct notifier_block ipq_dev_notifier = {
static int static int
ipq_rcv_nl_event(struct notifier_block *this, ipq_rcv_nl_event(struct notifier_block *this,
unsigned long event, void *ptr) unsigned long event, void *ptr)
{ {
struct netlink_notify *n = ptr; struct netlink_notify *n = ptr;
@ -597,7 +597,7 @@ static ctl_table ipq_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec .proc_handler = proc_dointvec
}, },
{ .ctl_name = 0 } { .ctl_name = 0 }
}; };
static ctl_table ipq_dir_table[] = { static ctl_table ipq_dir_table[] = {
@ -627,25 +627,25 @@ ipq_get_info(char *buffer, char **start, off_t offset, int length)
int len; int len;
read_lock_bh(&queue_lock); read_lock_bh(&queue_lock);
len = sprintf(buffer, len = sprintf(buffer,
"Peer PID : %d\n" "Peer PID : %d\n"
"Copy mode : %hu\n" "Copy mode : %hu\n"
"Copy range : %u\n" "Copy range : %u\n"
"Queue length : %u\n" "Queue length : %u\n"
"Queue max. length : %u\n" "Queue max. length : %u\n"
"Queue dropped : %u\n" "Queue dropped : %u\n"
"Netfilter dropped : %u\n", "Netfilter dropped : %u\n",
peer_pid, peer_pid,
copy_mode, copy_mode,
copy_range, copy_range,
queue_total, queue_total,
queue_maxlen, queue_maxlen,
queue_dropped, queue_dropped,
queue_user_dropped); queue_user_dropped);
read_unlock_bh(&queue_lock); read_unlock_bh(&queue_lock);
*start = buffer + offset; *start = buffer + offset;
len -= offset; len -= offset;
if (len > length) if (len > length)
@ -665,10 +665,10 @@ static int __init ip6_queue_init(void)
{ {
int status = -ENOMEM; int status = -ENOMEM;
struct proc_dir_entry *proc; struct proc_dir_entry *proc;
netlink_register_notifier(&ipq_nl_notifier); netlink_register_notifier(&ipq_nl_notifier);
ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk, ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk,
THIS_MODULE); THIS_MODULE);
if (ipqnl == NULL) { if (ipqnl == NULL) {
printk(KERN_ERR "ip6_queue: failed to create netlink socket\n"); printk(KERN_ERR "ip6_queue: failed to create netlink socket\n");
goto cleanup_netlink_notifier; goto cleanup_netlink_notifier;
@ -681,10 +681,10 @@ static int __init ip6_queue_init(void)
printk(KERN_ERR "ip6_queue: failed to create proc entry\n"); printk(KERN_ERR "ip6_queue: failed to create proc entry\n");
goto cleanup_ipqnl; goto cleanup_ipqnl;
} }
register_netdevice_notifier(&ipq_dev_notifier); register_netdevice_notifier(&ipq_dev_notifier);
ipq_sysctl_header = register_sysctl_table(ipq_root_table, 0); ipq_sysctl_header = register_sysctl_table(ipq_root_table, 0);
status = nf_register_queue_handler(PF_INET6, &nfqh); status = nf_register_queue_handler(PF_INET6, &nfqh);
if (status < 0) { if (status < 0) {
printk(KERN_ERR "ip6_queue: failed to register queue handler\n"); printk(KERN_ERR "ip6_queue: failed to register queue handler\n");
@ -696,12 +696,12 @@ cleanup_sysctl:
unregister_sysctl_table(ipq_sysctl_header); unregister_sysctl_table(ipq_sysctl_header);
unregister_netdevice_notifier(&ipq_dev_notifier); unregister_netdevice_notifier(&ipq_dev_notifier);
proc_net_remove(IPQ_PROC_FS_NAME); proc_net_remove(IPQ_PROC_FS_NAME);
cleanup_ipqnl: cleanup_ipqnl:
sock_release(ipqnl->sk_socket); sock_release(ipqnl->sk_socket);
mutex_lock(&ipqnl_mutex); mutex_lock(&ipqnl_mutex);
mutex_unlock(&ipqnl_mutex); mutex_unlock(&ipqnl_mutex);
cleanup_netlink_notifier: cleanup_netlink_notifier:
netlink_unregister_notifier(&ipq_nl_notifier); netlink_unregister_notifier(&ipq_nl_notifier);
return status; return status;

View File

@ -92,16 +92,16 @@ do { \
#endif #endif
/* Check for an extension */ /* Check for an extension */
int int
ip6t_ext_hdr(u8 nexthdr) ip6t_ext_hdr(u8 nexthdr)
{ {
return ( (nexthdr == IPPROTO_HOPOPTS) || return ( (nexthdr == IPPROTO_HOPOPTS) ||
(nexthdr == IPPROTO_ROUTING) || (nexthdr == IPPROTO_ROUTING) ||
(nexthdr == IPPROTO_FRAGMENT) || (nexthdr == IPPROTO_FRAGMENT) ||
(nexthdr == IPPROTO_ESP) || (nexthdr == IPPROTO_ESP) ||
(nexthdr == IPPROTO_AH) || (nexthdr == IPPROTO_AH) ||
(nexthdr == IPPROTO_NONE) || (nexthdr == IPPROTO_NONE) ||
(nexthdr == IPPROTO_DSTOPTS) ); (nexthdr == IPPROTO_DSTOPTS) );
} }
/* Returns whether matches rule or not. */ /* Returns whether matches rule or not. */
@ -120,9 +120,9 @@ ip6_packet_match(const struct sk_buff *skb,
#define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg)) #define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg))
if (FWINV(ipv6_masked_addr_cmp(&ipv6->saddr, &ip6info->smsk, if (FWINV(ipv6_masked_addr_cmp(&ipv6->saddr, &ip6info->smsk,
&ip6info->src), IP6T_INV_SRCIP) &ip6info->src), IP6T_INV_SRCIP)
|| FWINV(ipv6_masked_addr_cmp(&ipv6->daddr, &ip6info->dmsk, || FWINV(ipv6_masked_addr_cmp(&ipv6->daddr, &ip6info->dmsk,
&ip6info->dst), IP6T_INV_DSTIP)) { &ip6info->dst), IP6T_INV_DSTIP)) {
dprintf("Source or dest mismatch.\n"); dprintf("Source or dest mismatch.\n");
/* /*
dprintf("SRC: %u. Mask: %u. Target: %u.%s\n", ip->saddr, dprintf("SRC: %u. Mask: %u. Target: %u.%s\n", ip->saddr,
@ -177,7 +177,7 @@ ip6_packet_match(const struct sk_buff *skb,
*fragoff = _frag_off; *fragoff = _frag_off;
dprintf("Packet protocol %hi ?= %s%hi.\n", dprintf("Packet protocol %hi ?= %s%hi.\n",
protohdr, protohdr,
ip6info->invflags & IP6T_INV_PROTO ? "!":"", ip6info->invflags & IP6T_INV_PROTO ? "!":"",
ip6info->proto); ip6info->proto);
@ -197,7 +197,7 @@ ip6_packet_match(const struct sk_buff *skb,
} }
/* should be ip6 safe */ /* should be ip6 safe */
static inline int static inline int
ip6_checkentry(const struct ip6t_ip6 *ipv6) ip6_checkentry(const struct ip6t_ip6 *ipv6)
{ {
if (ipv6->flags & ~IP6T_F_MASK) { if (ipv6->flags & ~IP6T_F_MASK) {
@ -337,7 +337,7 @@ ip6t_do_table(struct sk_buff **pskb,
e = get_entry(table_base, v); e = get_entry(table_base, v);
} else { } else {
/* Targets which reenter must return /* Targets which reenter must return
abs. verdicts */ abs. verdicts */
#ifdef CONFIG_NETFILTER_DEBUG #ifdef CONFIG_NETFILTER_DEBUG
((struct ip6t_entry *)table_base)->comefrom ((struct ip6t_entry *)table_base)->comefrom
= 0xeeeeeeec; = 0xeeeeeeec;
@ -534,10 +534,10 @@ check_match(struct ip6t_entry_match *m,
int ret; int ret;
match = try_then_request_module(xt_find_match(AF_INET6, m->u.user.name, match = try_then_request_module(xt_find_match(AF_INET6, m->u.user.name,
m->u.user.revision), m->u.user.revision),
"ip6t_%s", m->u.user.name); "ip6t_%s", m->u.user.name);
if (IS_ERR(match) || !match) { if (IS_ERR(match) || !match) {
duprintf("check_match: `%s' not found\n", m->u.user.name); duprintf("check_match: `%s' not found\n", m->u.user.name);
return match ? PTR_ERR(match) : -ENOENT; return match ? PTR_ERR(match) : -ENOENT;
} }
m->u.kernel.match = match; m->u.kernel.match = match;
@ -661,7 +661,7 @@ check_entry_size_and_hooks(struct ip6t_entry *e,
} }
/* FIXME: underflows must be unconditional, standard verdicts /* FIXME: underflows must be unconditional, standard verdicts
< 0 (not IP6T_RETURN). --RR */ < 0 (not IP6T_RETURN). --RR */
/* Clear counters and comefrom */ /* Clear counters and comefrom */
e->counters = ((struct xt_counters) { 0, 0 }); e->counters = ((struct xt_counters) { 0, 0 });
@ -1003,8 +1003,8 @@ do_replace(void __user *user, unsigned int len)
/* Update module usage count based on number of rules */ /* Update module usage count based on number of rules */
duprintf("do_replace: oldnum=%u, initnum=%u, newnum=%u\n", duprintf("do_replace: oldnum=%u, initnum=%u, newnum=%u\n",
oldinfo->number, oldinfo->initial_entries, newinfo->number); oldinfo->number, oldinfo->initial_entries, newinfo->number);
if ((oldinfo->number > oldinfo->initial_entries) || if ((oldinfo->number > oldinfo->initial_entries) ||
(newinfo->number <= oldinfo->initial_entries)) (newinfo->number <= oldinfo->initial_entries))
module_put(t->me); module_put(t->me);
if ((oldinfo->number > oldinfo->initial_entries) && if ((oldinfo->number > oldinfo->initial_entries) &&
(newinfo->number <= oldinfo->initial_entries)) (newinfo->number <= oldinfo->initial_entries))
@ -1492,9 +1492,9 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,
} }
hdrlen = 8; hdrlen = 8;
} else if (nexthdr == NEXTHDR_AUTH) } else if (nexthdr == NEXTHDR_AUTH)
hdrlen = (hp->hdrlen + 2) << 2; hdrlen = (hp->hdrlen + 2) << 2;
else else
hdrlen = ipv6_optlen(hp); hdrlen = ipv6_optlen(hp);
nexthdr = hp->nexthdr; nexthdr = hp->nexthdr;
len -= hdrlen; len -= hdrlen;

View File

@ -1,4 +1,4 @@
/* /*
* Hop Limit modification target for ip6tables * Hop Limit modification target for ip6tables
* Maciej Soltysiak <solt@dns.toxicfilms.tv> * Maciej Soltysiak <solt@dns.toxicfilms.tv>
* Based on HW's TTL module * Based on HW's TTL module
@ -18,7 +18,7 @@ MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>");
MODULE_DESCRIPTION("IP6 tables Hop Limit modification module"); MODULE_DESCRIPTION("IP6 tables Hop Limit modification module");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static unsigned int ip6t_hl_target(struct sk_buff **pskb, static unsigned int ip6t_hl_target(struct sk_buff **pskb,
const struct net_device *in, const struct net_device *in,
const struct net_device *out, const struct net_device *out,
unsigned int hooknum, unsigned int hooknum,
@ -67,7 +67,7 @@ static int ip6t_hl_checkentry(const char *tablename,
struct ip6t_HL_info *info = targinfo; struct ip6t_HL_info *info = targinfo;
if (info->mode > IP6T_HL_MAXMODE) { if (info->mode > IP6T_HL_MAXMODE) {
printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n", printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n",
info->mode); info->mode);
return 0; return 0;
} }
@ -80,12 +80,12 @@ static int ip6t_hl_checkentry(const char *tablename,
} }
static struct xt_target ip6t_HL = { static struct xt_target ip6t_HL = {
.name = "HL", .name = "HL",
.family = AF_INET6, .family = AF_INET6,
.target = ip6t_hl_target, .target = ip6t_hl_target,
.targetsize = sizeof(struct ip6t_HL_info), .targetsize = sizeof(struct ip6t_HL_info),
.table = "mangle", .table = "mangle",
.checkentry = ip6t_hl_checkentry, .checkentry = ip6t_hl_checkentry,
.me = THIS_MODULE .me = THIS_MODULE
}; };

View File

@ -145,7 +145,7 @@ static void dump_packet(const struct nf_loginfo *info,
&_ahdr); &_ahdr);
if (ah == NULL) { if (ah == NULL) {
/* /*
* Max length: 26 "INCOMPLETE [65535 * Max length: 26 "INCOMPLETE [65535
* bytes] )" * bytes] )"
*/ */
printk("INCOMPLETE [%u bytes] )", printk("INCOMPLETE [%u bytes] )",
@ -387,7 +387,7 @@ ip6t_log_packet(unsigned int pf,
loginfo = &default_loginfo; loginfo = &default_loginfo;
spin_lock_bh(&log_lock); spin_lock_bh(&log_lock);
printk("<%d>%sIN=%s OUT=%s ", loginfo->u.log.level, printk("<%d>%sIN=%s OUT=%s ", loginfo->u.log.level,
prefix, prefix,
in ? in->name : "", in ? in->name : "",
out ? out->name : ""); out ? out->name : "");
@ -442,7 +442,7 @@ ip6t_log_target(struct sk_buff **pskb,
li.u.log.logflags = loginfo->logflags; li.u.log.logflags = loginfo->logflags;
ip6t_log_packet(PF_INET6, hooknum, *pskb, in, out, &li, ip6t_log_packet(PF_INET6, hooknum, *pskb, in, out, &li,
loginfo->prefix); loginfo->prefix);
return XT_CONTINUE; return XT_CONTINUE;
} }
@ -470,9 +470,9 @@ static int ip6t_log_checkentry(const char *tablename,
static struct xt_target ip6t_log_reg = { static struct xt_target ip6t_log_reg = {
.name = "LOG", .name = "LOG",
.family = AF_INET6, .family = AF_INET6,
.target = ip6t_log_target, .target = ip6t_log_target,
.targetsize = sizeof(struct ip6t_log_info), .targetsize = sizeof(struct ip6t_log_info),
.checkentry = ip6t_log_checkentry, .checkentry = ip6t_log_checkentry,
.me = THIS_MODULE, .me = THIS_MODULE,
}; };

View File

@ -189,23 +189,23 @@ static unsigned int reject6_target(struct sk_buff **pskb,
/* WARNING: This code causes reentry within ip6tables. /* WARNING: This code causes reentry within ip6tables.
This means that the ip6tables jump stack is now crap. We This means that the ip6tables jump stack is now crap. We
must return an absolute verdict. --RR */ must return an absolute verdict. --RR */
switch (reject->with) { switch (reject->with) {
case IP6T_ICMP6_NO_ROUTE: case IP6T_ICMP6_NO_ROUTE:
send_unreach(*pskb, ICMPV6_NOROUTE, hooknum); send_unreach(*pskb, ICMPV6_NOROUTE, hooknum);
break; break;
case IP6T_ICMP6_ADM_PROHIBITED: case IP6T_ICMP6_ADM_PROHIBITED:
send_unreach(*pskb, ICMPV6_ADM_PROHIBITED, hooknum); send_unreach(*pskb, ICMPV6_ADM_PROHIBITED, hooknum);
break; break;
case IP6T_ICMP6_NOT_NEIGHBOUR: case IP6T_ICMP6_NOT_NEIGHBOUR:
send_unreach(*pskb, ICMPV6_NOT_NEIGHBOUR, hooknum); send_unreach(*pskb, ICMPV6_NOT_NEIGHBOUR, hooknum);
break; break;
case IP6T_ICMP6_ADDR_UNREACH: case IP6T_ICMP6_ADDR_UNREACH:
send_unreach(*pskb, ICMPV6_ADDR_UNREACH, hooknum); send_unreach(*pskb, ICMPV6_ADDR_UNREACH, hooknum);
break; break;
case IP6T_ICMP6_PORT_UNREACH: case IP6T_ICMP6_PORT_UNREACH:
send_unreach(*pskb, ICMPV6_PORT_UNREACH, hooknum); send_unreach(*pskb, ICMPV6_PORT_UNREACH, hooknum);
break; break;
case IP6T_ICMP6_ECHOREPLY: case IP6T_ICMP6_ECHOREPLY:
/* Do nothing */ /* Do nothing */
break; break;
case IP6T_TCP_RESET: case IP6T_TCP_RESET:
@ -226,7 +226,7 @@ static int check(const char *tablename,
void *targinfo, void *targinfo,
unsigned int hook_mask) unsigned int hook_mask)
{ {
const struct ip6t_reject_info *rejinfo = targinfo; const struct ip6t_reject_info *rejinfo = targinfo;
const struct ip6t_entry *e = entry; const struct ip6t_entry *e = entry;
if (rejinfo->with == IP6T_ICMP6_ECHOREPLY) { if (rejinfo->with == IP6T_ICMP6_ECHOREPLY) {

View File

@ -78,13 +78,13 @@ match(const struct sk_buff *skb,
DEBUGP("IPv6 AH spi %02X ", DEBUGP("IPv6 AH spi %02X ",
(spi_match(ahinfo->spis[0], ahinfo->spis[1], (spi_match(ahinfo->spis[0], ahinfo->spis[1],
ntohl(ah->spi), ntohl(ah->spi),
!!(ahinfo->invflags & IP6T_AH_INV_SPI)))); !!(ahinfo->invflags & IP6T_AH_INV_SPI))));
DEBUGP("len %02X %04X %02X ", DEBUGP("len %02X %04X %02X ",
ahinfo->hdrlen, hdrlen, ahinfo->hdrlen, hdrlen,
(!ahinfo->hdrlen || (!ahinfo->hdrlen ||
(ahinfo->hdrlen == hdrlen) ^ (ahinfo->hdrlen == hdrlen) ^
!!(ahinfo->invflags & IP6T_AH_INV_LEN))); !!(ahinfo->invflags & IP6T_AH_INV_LEN)));
DEBUGP("res %02X %04X %02X\n", DEBUGP("res %02X %04X %02X\n",
ahinfo->hdrres, ah->reserved, ahinfo->hdrres, ah->reserved,
!(ahinfo->hdrres && ah->reserved)); !(ahinfo->hdrres && ah->reserved));
@ -92,12 +92,12 @@ match(const struct sk_buff *skb,
return (ah != NULL) return (ah != NULL)
&& &&
(spi_match(ahinfo->spis[0], ahinfo->spis[1], (spi_match(ahinfo->spis[0], ahinfo->spis[1],
ntohl(ah->spi), ntohl(ah->spi),
!!(ahinfo->invflags & IP6T_AH_INV_SPI))) !!(ahinfo->invflags & IP6T_AH_INV_SPI)))
&& &&
(!ahinfo->hdrlen || (!ahinfo->hdrlen ||
(ahinfo->hdrlen == hdrlen) ^ (ahinfo->hdrlen == hdrlen) ^
!!(ahinfo->invflags & IP6T_AH_INV_LEN)) !!(ahinfo->invflags & IP6T_AH_INV_LEN))
&& &&
!(ahinfo->hdrres && ah->reserved); !(ahinfo->hdrres && ah->reserved);
} }
@ -105,10 +105,10 @@ match(const struct sk_buff *skb,
/* Called when user tries to insert an entry of this type. */ /* Called when user tries to insert an entry of this type. */
static int static int
checkentry(const char *tablename, checkentry(const char *tablename,
const void *entry, const void *entry,
const struct xt_match *match, const struct xt_match *match,
void *matchinfo, void *matchinfo,
unsigned int hook_mask) unsigned int hook_mask)
{ {
const struct ip6t_ah *ahinfo = matchinfo; const struct ip6t_ah *ahinfo = matchinfo;

View File

@ -41,7 +41,7 @@ static int match(const struct sk_buff *skb,
return (ip6h->hop_limit > info->hop_limit); return (ip6h->hop_limit > info->hop_limit);
break; break;
default: default:
printk(KERN_WARNING "ip6t_hl: unknown mode %d\n", printk(KERN_WARNING "ip6t_hl: unknown mode %d\n",
info->mode); info->mode);
return 0; return 0;
} }

View File

@ -1,7 +1,7 @@
/* ipv6header match - matches IPv6 packets based /* ipv6header match - matches IPv6 packets based
on whether they contain certain headers */ on whether they contain certain headers */
/* Original idea: Brad Chapman /* Original idea: Brad Chapman
* Rewritten by: Andras Kis-Szabo <kisza@sch.bme.hu> */ * Rewritten by: Andras Kis-Szabo <kisza@sch.bme.hu> */
/* (C) 2001-2002 Andras Kis-Szabo <kisza@sch.bme.hu> /* (C) 2001-2002 Andras Kis-Szabo <kisza@sch.bme.hu>

View File

@ -50,7 +50,7 @@ static struct
0, NULL, { } }, 0, NULL, { } },
{ {
/* PRE_ROUTING */ /* PRE_ROUTING */
{ { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 }, { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
0, 0,
sizeof(struct ip6t_entry), sizeof(struct ip6t_entry),
sizeof(struct ip6t_standard), sizeof(struct ip6t_standard),
@ -58,7 +58,7 @@ static struct
{ { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } }, { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
-NF_ACCEPT - 1 } }, -NF_ACCEPT - 1 } },
/* LOCAL_IN */ /* LOCAL_IN */
{ { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 }, { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
0, 0,
sizeof(struct ip6t_entry), sizeof(struct ip6t_entry),
sizeof(struct ip6t_standard), sizeof(struct ip6t_standard),
@ -66,7 +66,7 @@ static struct
{ { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } }, { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
-NF_ACCEPT - 1 } }, -NF_ACCEPT - 1 } },
/* FORWARD */ /* FORWARD */
{ { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 }, { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
0, 0,
sizeof(struct ip6t_entry), sizeof(struct ip6t_entry),
sizeof(struct ip6t_standard), sizeof(struct ip6t_standard),
@ -74,7 +74,7 @@ static struct
{ { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } }, { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
-NF_ACCEPT - 1 } }, -NF_ACCEPT - 1 } },
/* LOCAL_OUT */ /* LOCAL_OUT */
{ { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 }, { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
0, 0,
sizeof(struct ip6t_entry), sizeof(struct ip6t_entry),
sizeof(struct ip6t_standard), sizeof(struct ip6t_standard),
@ -156,7 +156,7 @@ ip6t_local_hook(unsigned int hook,
ret = ip6t_do_table(pskb, hook, in, out, &packet_mangler); ret = ip6t_do_table(pskb, hook, in, out, &packet_mangler);
if (ret != NF_DROP && ret != NF_STOLEN if (ret != NF_DROP && ret != NF_STOLEN
&& (memcmp(&(*pskb)->nh.ipv6h->saddr, &saddr, sizeof(saddr)) && (memcmp(&(*pskb)->nh.ipv6h->saddr, &saddr, sizeof(saddr))
|| memcmp(&(*pskb)->nh.ipv6h->daddr, &daddr, sizeof(daddr)) || memcmp(&(*pskb)->nh.ipv6h->daddr, &daddr, sizeof(daddr))
|| (*pskb)->mark != mark || (*pskb)->mark != mark

View File

@ -87,10 +87,10 @@ static struct
} }
}; };
static struct xt_table packet_raw = { static struct xt_table packet_raw = {
.name = "raw", .name = "raw",
.valid_hooks = RAW_VALID_HOOKS, .valid_hooks = RAW_VALID_HOOKS,
.lock = RW_LOCK_UNLOCKED, .lock = RW_LOCK_UNLOCKED,
.me = THIS_MODULE, .me = THIS_MODULE,
.af = AF_INET6, .af = AF_INET6,
}; };
@ -106,17 +106,17 @@ ip6t_hook(unsigned int hook,
return ip6t_do_table(pskb, hook, in, out, &packet_raw); return ip6t_do_table(pskb, hook, in, out, &packet_raw);
} }
static struct nf_hook_ops ip6t_ops[] = { static struct nf_hook_ops ip6t_ops[] = {
{ {
.hook = ip6t_hook, .hook = ip6t_hook,
.pf = PF_INET6, .pf = PF_INET6,
.hooknum = NF_IP6_PRE_ROUTING, .hooknum = NF_IP6_PRE_ROUTING,
.priority = NF_IP6_PRI_FIRST, .priority = NF_IP6_PRI_FIRST,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
{ {
.hook = ip6t_hook, .hook = ip6t_hook,
.pf = PF_INET6, .pf = PF_INET6,
.hooknum = NF_IP6_LOCAL_OUT, .hooknum = NF_IP6_LOCAL_OUT,
.priority = NF_IP6_PRI_FIRST, .priority = NF_IP6_PRI_FIRST,
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -349,7 +349,7 @@ static ctl_table nf_ct_ipv6_sysctl_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ .ctl_name = 0 } { .ctl_name = 0 }
}; };
#endif #endif
@ -386,7 +386,7 @@ static int ipv6_nfattr_to_tuple(struct nfattr *tb[],
if (nfattr_bad_size(tb, CTA_IP_MAX, cta_min_ip)) if (nfattr_bad_size(tb, CTA_IP_MAX, cta_min_ip))
return -EINVAL; return -EINVAL;
memcpy(&t->src.u3.ip6, NFA_DATA(tb[CTA_IP_V6_SRC-1]), memcpy(&t->src.u3.ip6, NFA_DATA(tb[CTA_IP_V6_SRC-1]),
sizeof(u_int32_t) * 4); sizeof(u_int32_t) * 4);
memcpy(&t->dst.u3.ip6, NFA_DATA(tb[CTA_IP_V6_DST-1]), memcpy(&t->dst.u3.ip6, NFA_DATA(tb[CTA_IP_V6_DST-1]),
sizeof(u_int32_t) * 4); sizeof(u_int32_t) * 4);

View File

@ -104,9 +104,9 @@ static int icmpv6_packet(struct nf_conn *ct,
unsigned int hooknum) unsigned int hooknum)
{ {
/* Try to delete connection immediately after all replies: /* Try to delete connection immediately after all replies:
won't actually vanish as we still have skb, and del_timer won't actually vanish as we still have skb, and del_timer
means this will only run once even if count hits zero twice means this will only run once even if count hits zero twice
(theoretically possible with SMP) */ (theoretically possible with SMP) */
if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) { if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
if (atomic_dec_and_test(&ct->proto.icmp.count) if (atomic_dec_and_test(&ct->proto.icmp.count)
&& del_timer(&ct->timeout)) && del_timer(&ct->timeout))

View File

@ -311,7 +311,7 @@ static struct nf_ct_frag6_queue *nf_ct_frag6_intern(unsigned int hash,
write_lock(&nf_ct_frag6_lock); write_lock(&nf_ct_frag6_lock);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) { hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) {
if (fq->id == fq_in->id && if (fq->id == fq_in->id &&
ipv6_addr_equal(&fq_in->saddr, &fq->saddr) && ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) { ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
atomic_inc(&fq->refcnt); atomic_inc(&fq->refcnt);
@ -374,7 +374,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
read_lock(&nf_ct_frag6_lock); read_lock(&nf_ct_frag6_lock);
hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) { hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) {
if (fq->id == id && if (fq->id == id &&
ipv6_addr_equal(src, &fq->saddr) && ipv6_addr_equal(src, &fq->saddr) &&
ipv6_addr_equal(dst, &fq->daddr)) { ipv6_addr_equal(dst, &fq->daddr)) {
atomic_inc(&fq->refcnt); atomic_inc(&fq->refcnt);
@ -388,7 +388,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
} }
static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
struct frag_hdr *fhdr, int nhoff) struct frag_hdr *fhdr, int nhoff)
{ {
struct sk_buff *prev, *next; struct sk_buff *prev, *next;
@ -405,12 +405,12 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
if ((unsigned int)end > IPV6_MAXPLEN) { if ((unsigned int)end > IPV6_MAXPLEN) {
DEBUGP("offset is too large.\n"); DEBUGP("offset is too large.\n");
return -1; return -1;
} }
if (skb->ip_summed == CHECKSUM_COMPLETE) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->csum = csum_sub(skb->csum, skb->csum = csum_sub(skb->csum,
csum_partial(skb->nh.raw, csum_partial(skb->nh.raw,
(u8*)(fhdr + 1) - skb->nh.raw, (u8*)(fhdr + 1) - skb->nh.raw,
0)); 0));
@ -625,7 +625,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
/* We have to remove fragment header from datagram and to relocate /* We have to remove fragment header from datagram and to relocate
* header in order to calculate ICV correctly. */ * header in order to calculate ICV correctly. */
head->nh.raw[fq->nhoffset] = head->h.raw[0]; head->nh.raw[fq->nhoffset] = head->h.raw[0];
memmove(head->head + sizeof(struct frag_hdr), head->head, memmove(head->head + sizeof(struct frag_hdr), head->head,
(head->data - head->head) - sizeof(struct frag_hdr)); (head->data - head->head) - sizeof(struct frag_hdr));
head->mac.raw += sizeof(struct frag_hdr); head->mac.raw += sizeof(struct frag_hdr);
head->nh.raw += sizeof(struct frag_hdr); head->nh.raw += sizeof(struct frag_hdr);
@ -701,41 +701,41 @@ out_fail:
static int static int
find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
{ {
u8 nexthdr = skb->nh.ipv6h->nexthdr; u8 nexthdr = skb->nh.ipv6h->nexthdr;
u8 prev_nhoff = (u8 *)&skb->nh.ipv6h->nexthdr - skb->data; u8 prev_nhoff = (u8 *)&skb->nh.ipv6h->nexthdr - skb->data;
int start = (u8 *)(skb->nh.ipv6h+1) - skb->data; int start = (u8 *)(skb->nh.ipv6h+1) - skb->data;
int len = skb->len - start; int len = skb->len - start;
u8 prevhdr = NEXTHDR_IPV6; u8 prevhdr = NEXTHDR_IPV6;
while (nexthdr != NEXTHDR_FRAGMENT) { while (nexthdr != NEXTHDR_FRAGMENT) {
struct ipv6_opt_hdr hdr; struct ipv6_opt_hdr hdr;
int hdrlen; int hdrlen;
if (!ipv6_ext_hdr(nexthdr)) { if (!ipv6_ext_hdr(nexthdr)) {
return -1; return -1;
} }
if (len < (int)sizeof(struct ipv6_opt_hdr)) { if (len < (int)sizeof(struct ipv6_opt_hdr)) {
DEBUGP("too short\n"); DEBUGP("too short\n");
return -1; return -1;
} }
if (nexthdr == NEXTHDR_NONE) { if (nexthdr == NEXTHDR_NONE) {
DEBUGP("next header is none\n"); DEBUGP("next header is none\n");
return -1; return -1;
} }
if (skb_copy_bits(skb, start, &hdr, sizeof(hdr))) if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))
BUG(); BUG();
if (nexthdr == NEXTHDR_AUTH) if (nexthdr == NEXTHDR_AUTH)
hdrlen = (hdr.hdrlen+2)<<2; hdrlen = (hdr.hdrlen+2)<<2;
else else
hdrlen = ipv6_optlen(&hdr); hdrlen = ipv6_optlen(&hdr);
prevhdr = nexthdr; prevhdr = nexthdr;
prev_nhoff = start; prev_nhoff = start;
nexthdr = hdr.nexthdr; nexthdr = hdr.nexthdr;
len -= hdrlen; len -= hdrlen;
start += hdrlen; start += hdrlen;
} }
if (len < 0) if (len < 0)
return -1; return -1;
@ -749,7 +749,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
{ {
struct sk_buff *clone; struct sk_buff *clone;
struct net_device *dev = skb->dev; struct net_device *dev = skb->dev;
struct frag_hdr *fhdr; struct frag_hdr *fhdr;
struct nf_ct_frag6_queue *fq; struct nf_ct_frag6_queue *fq;

View File

@ -50,7 +50,7 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
seq_printf(seq, "UDP6: inuse %d\n", seq_printf(seq, "UDP6: inuse %d\n",
fold_prot_inuse(&udpv6_prot)); fold_prot_inuse(&udpv6_prot));
seq_printf(seq, "UDPLITE6: inuse %d\n", seq_printf(seq, "UDPLITE6: inuse %d\n",
fold_prot_inuse(&udplitev6_prot)); fold_prot_inuse(&udplitev6_prot));
seq_printf(seq, "RAW6: inuse %d\n", seq_printf(seq, "RAW6: inuse %d\n",
fold_prot_inuse(&rawv6_prot)); fold_prot_inuse(&rawv6_prot));
seq_printf(seq, "FRAG6: inuse %d memory %d\n", seq_printf(seq, "FRAG6: inuse %d memory %d\n",
@ -89,7 +89,7 @@ static struct snmp_mib snmp6_icmp6_list[] = {
/* icmpv6 mib according to RFC 2466 /* icmpv6 mib according to RFC 2466
Exceptions: {In|Out}AdminProhibs are removed, because I see Exceptions: {In|Out}AdminProhibs are removed, because I see
no good reasons to account them separately no good reasons to account them separately
of another dest.unreachs. of another dest.unreachs.
OutErrs is zero identically. OutErrs is zero identically.
OutEchos too. OutEchos too.
@ -146,14 +146,14 @@ static struct snmp_mib snmp6_udplite6_list[] = {
static unsigned long static unsigned long
fold_field(void *mib[], int offt) fold_field(void *mib[], int offt)
{ {
unsigned long res = 0; unsigned long res = 0;
int i; int i;
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt); res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt);
res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt); res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt);
} }
return res; return res;
} }
static inline void static inline void
@ -161,7 +161,7 @@ snmp6_seq_show_item(struct seq_file *seq, void **mib, struct snmp_mib *itemlist)
{ {
int i; int i;
for (i=0; itemlist[i].name; i++) for (i=0; itemlist[i].name; i++)
seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
fold_field(mib, itemlist[i].entry)); fold_field(mib, itemlist[i].entry));
} }

View File

@ -64,7 +64,7 @@ int inet6_add_protocol(struct inet6_protocol *prot, unsigned char protocol)
/* /*
* Remove a protocol from the hash tables. * Remove a protocol from the hash tables.
*/ */
int inet6_del_protocol(struct inet6_protocol *prot, unsigned char protocol) int inet6_del_protocol(struct inet6_protocol *prot, unsigned char protocol)
{ {
int ret, hash = protocol & (MAX_INET_PROTOS - 1); int ret, hash = protocol & (MAX_INET_PROTOS - 1);

View File

@ -1,9 +1,9 @@
/* /*
* RAW sockets for IPv6 * RAW sockets for IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* Adapted from linux/net/ipv4/raw.c * Adapted from linux/net/ipv4/raw.c
* *
@ -11,7 +11,7 @@
* *
* Fixes: * Fixes:
* Hideaki YOSHIFUJI : sin6_scope_id support * Hideaki YOSHIFUJI : sin6_scope_id support
* YOSHIFUJI,H.@USAGI : raw checksum (RFC2292(bis) compliance) * YOSHIFUJI,H.@USAGI : raw checksum (RFC2292(bis) compliance)
* Kazunori MIYAZAWA @USAGI: change process style to use ip6_append_data * Kazunori MIYAZAWA @USAGI: change process style to use ip6_append_data
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -71,12 +71,12 @@ static void raw_v6_hash(struct sock *sk)
write_lock_bh(&raw_v6_lock); write_lock_bh(&raw_v6_lock);
sk_add_node(sk, list); sk_add_node(sk, list);
sock_prot_inc_use(sk->sk_prot); sock_prot_inc_use(sk->sk_prot);
write_unlock_bh(&raw_v6_lock); write_unlock_bh(&raw_v6_lock);
} }
static void raw_v6_unhash(struct sock *sk) static void raw_v6_unhash(struct sock *sk)
{ {
write_lock_bh(&raw_v6_lock); write_lock_bh(&raw_v6_lock);
if (sk_del_node_init(sk)) if (sk_del_node_init(sk))
sock_prot_dec_use(sk->sk_prot); sock_prot_dec_use(sk->sk_prot);
write_unlock_bh(&raw_v6_lock); write_unlock_bh(&raw_v6_lock);
@ -250,7 +250,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
*/ */
sk->sk_bound_dev_if = addr->sin6_scope_id; sk->sk_bound_dev_if = addr->sin6_scope_id;
} }
/* Binding to link-local address requires an interface */ /* Binding to link-local address requires an interface */
if (!sk->sk_bound_dev_if) if (!sk->sk_bound_dev_if)
goto out; goto out;
@ -261,7 +261,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
goto out; goto out;
} }
} }
/* ipv4 addr of the socket is invalid. Only the /* ipv4 addr of the socket is invalid. Only the
* unspecified and mapped address have a v4 equivalent. * unspecified and mapped address have a v4 equivalent.
*/ */
@ -324,7 +324,7 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
{ {
if ((raw6_sk(sk)->checksum || sk->sk_filter) && if ((raw6_sk(sk)->checksum || sk->sk_filter) &&
skb_checksum_complete(skb)) { skb_checksum_complete(skb)) {
/* FIXME: increment a raw6 drops counter here */ /* FIXME: increment a raw6 drops counter here */
kfree_skb(skb); kfree_skb(skb);
@ -342,10 +342,10 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
} }
/* /*
* This is next to useless... * This is next to useless...
* if we demultiplex in network layer we don't need the extra call * if we demultiplex in network layer we don't need the extra call
* just to queue the skb... * just to queue the skb...
* maybe we could have the network decide upon a hint if it * maybe we could have the network decide upon a hint if it
* should call raw_rcv for demultiplexing * should call raw_rcv for demultiplexing
*/ */
int rawv6_rcv(struct sock *sk, struct sk_buff *skb) int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
@ -353,17 +353,17 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct raw6_sock *rp = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) { if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
kfree_skb(skb); kfree_skb(skb);
return NET_RX_DROP; return NET_RX_DROP;
} }
if (!rp->checksum) if (!rp->checksum)
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (skb->ip_summed == CHECKSUM_COMPLETE) { if (skb->ip_summed == CHECKSUM_COMPLETE) {
skb_postpull_rcsum(skb, skb->nh.raw, skb_postpull_rcsum(skb, skb->nh.raw,
skb->h.raw - skb->nh.raw); skb->h.raw - skb->nh.raw);
if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr, if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,
&skb->nh.ipv6h->daddr, &skb->nh.ipv6h->daddr,
skb->len, inet->num, skb->csum)) skb->len, inet->num, skb->csum))
@ -404,8 +404,8 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
if (flags & MSG_OOB) if (flags & MSG_OOB)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (addr_len) if (addr_len)
*addr_len=sizeof(*sin6); *addr_len=sizeof(*sin6);
if (flags & MSG_ERRQUEUE) if (flags & MSG_ERRQUEUE)
@ -416,10 +416,10 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
goto out; goto out;
copied = skb->len; copied = skb->len;
if (copied > len) { if (copied > len) {
copied = len; copied = len;
msg->msg_flags |= MSG_TRUNC; msg->msg_flags |= MSG_TRUNC;
} }
if (skb->ip_summed==CHECKSUM_UNNECESSARY) { if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
@ -549,7 +549,7 @@ out:
} }
static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
struct flowi *fl, struct rt6_info *rt, struct flowi *fl, struct rt6_info *rt,
unsigned int flags) unsigned int flags)
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
@ -570,7 +570,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
skb = sock_alloc_send_skb(sk, length+hh_len+15, skb = sock_alloc_send_skb(sk, length+hh_len+15,
flags&MSG_DONTWAIT, &err); flags&MSG_DONTWAIT, &err);
if (skb == NULL) if (skb == NULL)
goto error; goto error;
skb_reserve(skb, hh_len); skb_reserve(skb, hh_len);
skb->priority = sk->sk_priority; skb->priority = sk->sk_priority;
@ -600,7 +600,7 @@ error_fault:
kfree_skb(skb); kfree_skb(skb);
error: error:
IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
return err; return err;
} }
static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
@ -694,19 +694,19 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
return -EMSGSIZE; return -EMSGSIZE;
/* Mirror BSD error message compatibility */ /* Mirror BSD error message compatibility */
if (msg->msg_flags & MSG_OOB) if (msg->msg_flags & MSG_OOB)
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* /*
* Get and verify the address. * Get and verify the address.
*/ */
memset(&fl, 0, sizeof(fl)); memset(&fl, 0, sizeof(fl));
if (sin6) { if (sin6) {
if (addr_len < SIN6_LEN_RFC2133) if (addr_len < SIN6_LEN_RFC2133)
return -EINVAL; return -EINVAL;
if (sin6->sin6_family && sin6->sin6_family != AF_INET6) if (sin6->sin6_family && sin6->sin6_family != AF_INET6)
return(-EAFNOSUPPORT); return(-EAFNOSUPPORT);
/* port is the proto value [0..255] carried in nexthdr */ /* port is the proto value [0..255] carried in nexthdr */
@ -744,17 +744,17 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL) ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL)
fl.oif = sin6->sin6_scope_id; fl.oif = sin6->sin6_scope_id;
} else { } else {
if (sk->sk_state != TCP_ESTABLISHED) if (sk->sk_state != TCP_ESTABLISHED)
return -EDESTADDRREQ; return -EDESTADDRREQ;
proto = inet->num; proto = inet->num;
daddr = &np->daddr; daddr = &np->daddr;
fl.fl6_flowlabel = np->flow_label; fl.fl6_flowlabel = np->flow_label;
} }
if (ipv6_addr_any(daddr)) { if (ipv6_addr_any(daddr)) {
/* /*
* unspecified destination address * unspecified destination address
* treated as error... is this correct ? * treated as error... is this correct ?
*/ */
fl6_sock_release(flowlabel); fl6_sock_release(flowlabel);
@ -792,7 +792,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
err = rawv6_probe_proto_opt(&fl, msg); err = rawv6_probe_proto_opt(&fl, msg);
if (err) if (err)
goto out; goto out;
ipv6_addr_copy(&fl.fl6_dst, daddr); ipv6_addr_copy(&fl.fl6_dst, daddr);
if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
ipv6_addr_copy(&fl.fl6_src, &np->saddr); ipv6_addr_copy(&fl.fl6_src, &np->saddr);
@ -856,7 +856,7 @@ done:
dst_release(dst); dst_release(dst);
if (!inet->hdrincl) if (!inet->hdrincl)
release_sock(sk); release_sock(sk);
out: out:
fl6_sock_release(flowlabel); fl6_sock_release(flowlabel);
return err<0?err:len; return err<0?err:len;
do_confirm: do_confirm:
@ -867,7 +867,7 @@ do_confirm:
goto done; goto done;
} }
static int rawv6_seticmpfilter(struct sock *sk, int level, int optname, static int rawv6_seticmpfilter(struct sock *sk, int level, int optname,
char __user *optval, int optlen) char __user *optval, int optlen)
{ {
switch (optname) { switch (optname) {
@ -884,7 +884,7 @@ static int rawv6_seticmpfilter(struct sock *sk, int level, int optname,
return 0; return 0;
} }
static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, static int rawv6_geticmpfilter(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen) char __user *optval, int __user *optlen)
{ {
int len; int len;
@ -916,7 +916,7 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,
struct raw6_sock *rp = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
int val; int val;
if (get_user(val, (int __user *)optval)) if (get_user(val, (int __user *)optval))
return -EFAULT; return -EFAULT;
switch (optname) { switch (optname) {
@ -1224,7 +1224,7 @@ static void raw6_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
src->s6_addr32[2], src->s6_addr32[3], srcp, src->s6_addr32[2], src->s6_addr32[3], srcp,
dest->s6_addr32[0], dest->s6_addr32[1], dest->s6_addr32[0], dest->s6_addr32[1],
dest->s6_addr32[2], dest->s6_addr32[3], destp, dest->s6_addr32[2], dest->s6_addr32[3], destp,
sp->sk_state, sp->sk_state,
atomic_read(&sp->sk_wmem_alloc), atomic_read(&sp->sk_wmem_alloc),
atomic_read(&sp->sk_rmem_alloc), atomic_read(&sp->sk_rmem_alloc),
0, 0L, 0, 0, 0L, 0,

View File

@ -1,9 +1,9 @@
/* /*
* IPv6 fragment reassembly * IPv6 fragment reassembly
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: reassembly.c,v 1.26 2001/03/07 22:00:57 davem Exp $ * $Id: reassembly.c,v 1.26 2001/03/07 22:00:57 davem Exp $
* *
@ -15,8 +15,8 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
/* /*
* Fixes: * Fixes:
* Andi Kleen Make it work with multiple hosts. * Andi Kleen Make it work with multiple hosts.
* More RFC compliance. * More RFC compliance.
* *
@ -343,7 +343,7 @@ static struct frag_queue *ip6_frag_intern(struct frag_queue *fq_in)
hash = ip6qhashfn(fq_in->id, &fq_in->saddr, &fq_in->daddr); hash = ip6qhashfn(fq_in->id, &fq_in->saddr, &fq_in->daddr);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) { hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
if (fq->id == fq_in->id && if (fq->id == fq_in->id &&
ipv6_addr_equal(&fq_in->saddr, &fq->saddr) && ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) { ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
atomic_inc(&fq->refcnt); atomic_inc(&fq->refcnt);
@ -406,7 +406,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
read_lock(&ip6_frag_lock); read_lock(&ip6_frag_lock);
hash = ip6qhashfn(id, src, dst); hash = ip6qhashfn(id, src, dst);
hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) { hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
if (fq->id == id && if (fq->id == id &&
ipv6_addr_equal(src, &fq->saddr) && ipv6_addr_equal(src, &fq->saddr) &&
ipv6_addr_equal(dst, &fq->daddr)) { ipv6_addr_equal(dst, &fq->daddr)) {
atomic_inc(&fq->refcnt); atomic_inc(&fq->refcnt);
@ -420,7 +420,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
} }
static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
struct frag_hdr *fhdr, int nhoff) struct frag_hdr *fhdr, int nhoff)
{ {
struct sk_buff *prev, *next; struct sk_buff *prev, *next;
@ -436,13 +436,13 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
if ((unsigned int)end > IPV6_MAXPLEN) { if ((unsigned int)end > IPV6_MAXPLEN) {
IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
IPSTATS_MIB_INHDRERRORS); IPSTATS_MIB_INHDRERRORS);
icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw); icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw);
return; return;
} }
if (skb->ip_summed == CHECKSUM_COMPLETE) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->csum = csum_sub(skb->csum, skb->csum = csum_sub(skb->csum,
csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0));
/* Is this the final fragment? */ /* Is this the final fragment? */
if (!(fhdr->frag_off & htons(IP6_MF))) { if (!(fhdr->frag_off & htons(IP6_MF))) {
@ -464,7 +464,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
*/ */
IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
IPSTATS_MIB_INHDRERRORS); IPSTATS_MIB_INHDRERRORS);
icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
offsetof(struct ipv6hdr, payload_len)); offsetof(struct ipv6hdr, payload_len));
return; return;
} }
@ -482,7 +482,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
/* Point into the IP datagram 'data' part. */ /* Point into the IP datagram 'data' part. */
if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data))
goto err; goto err;
if (pskb_trim_rcsum(skb, end - offset)) if (pskb_trim_rcsum(skb, end - offset))
goto err; goto err;
@ -640,7 +640,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
* header in order to calculate ICV correctly. */ * header in order to calculate ICV correctly. */
nhoff = fq->nhoffset; nhoff = fq->nhoffset;
head->nh.raw[nhoff] = head->h.raw[0]; head->nh.raw[nhoff] = head->h.raw[0];
memmove(head->head + sizeof(struct frag_hdr), head->head, memmove(head->head + sizeof(struct frag_hdr), head->head,
(head->data - head->head) - sizeof(struct frag_hdr)); (head->data - head->head) - sizeof(struct frag_hdr));
head->mac.raw += sizeof(struct frag_hdr); head->mac.raw += sizeof(struct frag_hdr);
head->nh.raw += sizeof(struct frag_hdr); head->nh.raw += sizeof(struct frag_hdr);
@ -695,7 +695,7 @@ out_fail:
static int ipv6_frag_rcv(struct sk_buff **skbp) static int ipv6_frag_rcv(struct sk_buff **skbp)
{ {
struct sk_buff *skb = *skbp; struct sk_buff *skb = *skbp;
struct net_device *dev = skb->dev; struct net_device *dev = skb->dev;
struct frag_hdr *fhdr; struct frag_hdr *fhdr;
struct frag_queue *fq; struct frag_queue *fq;

View File

@ -3,7 +3,7 @@
* FIB front-end. * FIB front-end.
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: route.c,v 1.56 2001/10/31 21:55:55 davem Exp $ * $Id: route.c,v 1.56 2001/10/31 21:55:55 davem Exp $
* *
@ -201,7 +201,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)
if (idev != NULL) { if (idev != NULL) {
rt->rt6i_idev = NULL; rt->rt6i_idev = NULL;
in6_dev_put(idev); in6_dev_put(idev);
} }
} }
static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
@ -252,7 +252,7 @@ static __inline__ struct rt6_info *rt6_device_match(struct rt6_info *rt,
sprt->rt6i_idev->dev->ifindex != oif) { sprt->rt6i_idev->dev->ifindex != oif) {
if (strict && oif) if (strict && oif)
continue; continue;
if (local && (!oif || if (local && (!oif ||
local->rt6i_idev->dev->ifindex == oif)) local->rt6i_idev->dev->ifindex == oif))
continue; continue;
} }
@ -350,7 +350,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
int strict) int strict)
{ {
int m, n; int m, n;
m = rt6_check_dev(rt, oif); m = rt6_check_dev(rt, oif);
if (!m && (strict & RT6_LOOKUP_F_IFACE)) if (!m && (strict & RT6_LOOKUP_F_IFACE))
return -1; return -1;
@ -723,7 +723,7 @@ void ip6_route_input(struct sk_buff *skb)
.flowlabel = (* (__be32 *) iph)&IPV6_FLOWINFO_MASK, .flowlabel = (* (__be32 *) iph)&IPV6_FLOWINFO_MASK,
}, },
}, },
.mark = skb->mark, .mark = skb->mark,
.proto = iph->nexthdr, .proto = iph->nexthdr,
}; };
@ -888,9 +888,9 @@ static inline unsigned int ipv6_advmss(unsigned int mtu)
mtu = ip6_rt_min_advmss; mtu = ip6_rt_min_advmss;
/* /*
* Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
* corresponding MSS is IPV6_MAXPLEN - tcp_header_size. * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
* IPV6_MAXPLEN is also valid and means: "any MSS, * IPV6_MAXPLEN is also valid and means: "any MSS,
* rely only on pmtu discovery" * rely only on pmtu discovery"
*/ */
if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr)) if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
@ -901,7 +901,7 @@ static inline unsigned int ipv6_advmss(unsigned int mtu)
static struct dst_entry *ndisc_dst_gc_list; static struct dst_entry *ndisc_dst_gc_list;
static DEFINE_SPINLOCK(ndisc_lock); static DEFINE_SPINLOCK(ndisc_lock);
struct dst_entry *ndisc_dst_alloc(struct net_device *dev, struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
struct neighbour *neigh, struct neighbour *neigh,
struct in6_addr *addr, struct in6_addr *addr,
int (*output)(struct sk_buff *)) int (*output)(struct sk_buff *))
@ -934,8 +934,8 @@ struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
rt->u.dst.output = output; rt->u.dst.output = output;
#if 0 /* there's no chance to use these for ndisc */ #if 0 /* there's no chance to use these for ndisc */
rt->u.dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST rt->u.dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST
? DST_HOST ? DST_HOST
: 0; : 0;
ipv6_addr_copy(&rt->rt6i_dst.addr, addr); ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
rt->rt6i_dst.plen = 128; rt->rt6i_dst.plen = 128;
@ -958,7 +958,7 @@ int ndisc_dst_gc(int *more)
int freed; int freed;
next = NULL; next = NULL;
freed = 0; freed = 0;
spin_lock_bh(&ndisc_lock); spin_lock_bh(&ndisc_lock);
pprev = &ndisc_dst_gc_list; pprev = &ndisc_dst_gc_list;
@ -1276,7 +1276,7 @@ static int ip6_route_del(struct fib6_config *cfg)
fn = fib6_locate(&table->tb6_root, fn = fib6_locate(&table->tb6_root,
&cfg->fc_dst, cfg->fc_dst_len, &cfg->fc_dst, cfg->fc_dst_len,
&cfg->fc_src, cfg->fc_src_len); &cfg->fc_src, cfg->fc_src_len);
if (fn) { if (fn) {
for (rt = fn->leaf; rt; rt = rt->u.next) { for (rt = fn->leaf; rt; rt = rt->u.next) {
if (cfg->fc_ifindex && if (cfg->fc_ifindex &&
@ -1405,7 +1405,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
* We have finally decided to accept it. * We have finally decided to accept it.
*/ */
neigh_update(neigh, lladdr, NUD_STALE, neigh_update(neigh, lladdr, NUD_STALE,
NEIGH_UPDATE_F_WEAK_OVERRIDE| NEIGH_UPDATE_F_WEAK_OVERRIDE|
NEIGH_UPDATE_F_OVERRIDE| NEIGH_UPDATE_F_OVERRIDE|
(on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER| (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
@ -1454,7 +1454,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
} }
out: out:
dst_release(&rt->u.dst); dst_release(&rt->u.dst);
return; return;
} }
@ -1478,7 +1478,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
if (pmtu < IPV6_MIN_MTU) { if (pmtu < IPV6_MIN_MTU) {
/* /*
* According to RFC2460, PMTU is set to the IPv6 Minimum Link * According to RFC2460, PMTU is set to the IPv6 Minimum Link
* MTU (1280) and a fragment header should always be included * MTU (1280) and a fragment header should always be included
* after a node receiving Too Big message reporting PMTU is * after a node receiving Too Big message reporting PMTU is
* less than the IPv6 Minimum Link MTU. * less than the IPv6 Minimum Link MTU.
@ -1632,7 +1632,7 @@ static struct rt6_info *rt6_add_route_info(struct in6_addr *prefix, int prefixle
#endif #endif
struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *dev) struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *dev)
{ {
struct rt6_info *rt; struct rt6_info *rt;
struct fib6_table *table; struct fib6_table *table;
@ -1896,8 +1896,8 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
*/ */
if (rt->rt6i_dev == arg->dev && if (rt->rt6i_dev == arg->dev &&
!dst_metric_locked(&rt->u.dst, RTAX_MTU) && !dst_metric_locked(&rt->u.dst, RTAX_MTU) &&
(dst_mtu(&rt->u.dst) > arg->mtu || (dst_mtu(&rt->u.dst) > arg->mtu ||
(dst_mtu(&rt->u.dst) < arg->mtu && (dst_mtu(&rt->u.dst) < arg->mtu &&
dst_mtu(&rt->u.dst) == idev->cnf.mtu6))) dst_mtu(&rt->u.dst) == idev->cnf.mtu6)))
rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu; rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu;
rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(arg->mtu); rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(arg->mtu);
@ -2083,13 +2083,13 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
if (dst) { if (dst) {
NLA_PUT(skb, RTA_DST, 16, dst); NLA_PUT(skb, RTA_DST, 16, dst);
rtm->rtm_dst_len = 128; rtm->rtm_dst_len = 128;
} else if (rtm->rtm_dst_len) } else if (rtm->rtm_dst_len)
NLA_PUT(skb, RTA_DST, 16, &rt->rt6i_dst.addr); NLA_PUT(skb, RTA_DST, 16, &rt->rt6i_dst.addr);
#ifdef CONFIG_IPV6_SUBTREES #ifdef CONFIG_IPV6_SUBTREES
if (src) { if (src) {
NLA_PUT(skb, RTA_SRC, 16, src); NLA_PUT(skb, RTA_SRC, 16, src);
rtm->rtm_src_len = 128; rtm->rtm_src_len = 128;
} else if (rtm->rtm_src_len) } else if (rtm->rtm_src_len)
NLA_PUT(skb, RTA_SRC, 16, &rt->rt6i_src.addr); NLA_PUT(skb, RTA_SRC, 16, &rt->rt6i_src.addr);
#endif #endif
@ -2299,7 +2299,7 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
arg->len += sprintf(arg->buffer + arg->len, arg->len += sprintf(arg->buffer + arg->len,
" %08x %08x %08x %08x %8s\n", " %08x %08x %08x %08x %8s\n",
rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt), rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt),
rt->u.dst.__use, rt->rt6i_flags, rt->u.dst.__use, rt->rt6i_flags,
rt->rt6i_dev ? rt->rt6i_dev->name : ""); rt->rt6i_dev ? rt->rt6i_dev->name : "");
return 0; return 0;
} }
@ -2371,91 +2371,91 @@ int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write, struct file * filp,
} }
ctl_table ipv6_route_table[] = { ctl_table ipv6_route_table[] = {
{ {
.ctl_name = NET_IPV6_ROUTE_FLUSH, .ctl_name = NET_IPV6_ROUTE_FLUSH,
.procname = "flush", .procname = "flush",
.data = &flush_delay, .data = &flush_delay,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0200, .mode = 0200,
.proc_handler = &ipv6_sysctl_rtcache_flush .proc_handler = &ipv6_sysctl_rtcache_flush
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_THRESH, .ctl_name = NET_IPV6_ROUTE_GC_THRESH,
.procname = "gc_thresh", .procname = "gc_thresh",
.data = &ip6_dst_ops.gc_thresh, .data = &ip6_dst_ops.gc_thresh,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_MAX_SIZE, .ctl_name = NET_IPV6_ROUTE_MAX_SIZE,
.procname = "max_size", .procname = "max_size",
.data = &ip6_rt_max_size, .data = &ip6_rt_max_size,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_MIN_INTERVAL, .ctl_name = NET_IPV6_ROUTE_GC_MIN_INTERVAL,
.procname = "gc_min_interval", .procname = "gc_min_interval",
.data = &ip6_rt_gc_min_interval, .data = &ip6_rt_gc_min_interval,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_TIMEOUT, .ctl_name = NET_IPV6_ROUTE_GC_TIMEOUT,
.procname = "gc_timeout", .procname = "gc_timeout",
.data = &ip6_rt_gc_timeout, .data = &ip6_rt_gc_timeout,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_INTERVAL, .ctl_name = NET_IPV6_ROUTE_GC_INTERVAL,
.procname = "gc_interval", .procname = "gc_interval",
.data = &ip6_rt_gc_interval, .data = &ip6_rt_gc_interval,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_ELASTICITY, .ctl_name = NET_IPV6_ROUTE_GC_ELASTICITY,
.procname = "gc_elasticity", .procname = "gc_elasticity",
.data = &ip6_rt_gc_elasticity, .data = &ip6_rt_gc_elasticity,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_MTU_EXPIRES, .ctl_name = NET_IPV6_ROUTE_MTU_EXPIRES,
.procname = "mtu_expires", .procname = "mtu_expires",
.data = &ip6_rt_mtu_expires, .data = &ip6_rt_mtu_expires,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_MIN_ADVMSS, .ctl_name = NET_IPV6_ROUTE_MIN_ADVMSS,
.procname = "min_adv_mss", .procname = "min_adv_mss",
.data = &ip6_rt_min_advmss, .data = &ip6_rt_min_advmss,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_jiffies, .proc_handler = &proc_dointvec_jiffies,
.strategy = &sysctl_jiffies, .strategy = &sysctl_jiffies,
}, },
{ {
.ctl_name = NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS, .ctl_name = NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS,
.procname = "gc_min_interval_ms", .procname = "gc_min_interval_ms",
.data = &ip6_rt_gc_min_interval, .data = &ip6_rt_gc_min_interval,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec_ms_jiffies, .proc_handler = &proc_dointvec_ms_jiffies,
.strategy = &sysctl_ms_jiffies, .strategy = &sysctl_ms_jiffies,
}, },
{ .ctl_name = 0 } { .ctl_name = 0 }

View File

@ -3,7 +3,7 @@
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
* *
* $Id: sit.c,v 1.53 2001/09/25 05:09:53 davem Exp $ * $Id: sit.c,v 1.53 2001/09/25 05:09:53 davem Exp $
@ -410,7 +410,7 @@ static inline __be32 try_6to4(struct in6_addr *v6dst)
__be32 dst = 0; __be32 dst = 0;
if (v6dst->s6_addr16[0] == htons(0x2002)) { if (v6dst->s6_addr16[0] == htons(0x2002)) {
/* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */ /* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
memcpy(&dst, &v6dst->s6_addr16[1], 4); memcpy(&dst, &v6dst->s6_addr16[1], 4);
} }
return dst; return dst;
@ -434,7 +434,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
int max_headroom; /* The extra header space needed */ int max_headroom; /* The extra header space needed */
__be32 dst = tiph->daddr; __be32 dst = tiph->daddr;
int mtu; int mtu;
struct in6_addr *addr6; struct in6_addr *addr6;
int addr_type; int addr_type;
if (tunnel->recursion++) { if (tunnel->recursion++) {
@ -537,7 +537,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
if (!new_skb) { if (!new_skb) {
ip_rt_put(rt); ip_rt_put(rt);
stats->tx_dropped++; stats->tx_dropped++;
dev_kfree_skb(skb); dev_kfree_skb(skb);
tunnel->recursion--; tunnel->recursion--;
return 0; return 0;
@ -831,7 +831,7 @@ static int __init sit_init(void)
return -EAGAIN; return -EAGAIN;
} }
ipip6_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0", ipip6_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0",
ipip6_tunnel_setup); ipip6_tunnel_setup);
if (!ipip6_fb_tunnel_dev) { if (!ipip6_fb_tunnel_dev) {
err = -ENOMEM; err = -ENOMEM;

View File

@ -92,7 +92,7 @@ static ctl_table ipv6_net_table[] = {
.mode = 0555, .mode = 0555,
.child = ipv6_table .child = ipv6_table
}, },
{ .ctl_name = 0 } { .ctl_name = 0 }
}; };
static ctl_table ipv6_root_table[] = { static ctl_table ipv6_root_table[] = {
@ -102,7 +102,7 @@ static ctl_table ipv6_root_table[] = {
.mode = 0555, .mode = 0555,
.child = ipv6_net_table .child = ipv6_net_table
}, },
{ .ctl_name = 0 } { .ctl_name = 0 }
}; };
void ipv6_sysctl_register(void) void ipv6_sysctl_register(void)

View File

@ -1,13 +1,13 @@
/* /*
* TCP over IPv6 * TCP over IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: tcp_ipv6.c,v 1.144 2002/02/01 22:01:04 davem Exp $ * $Id: tcp_ipv6.c,v 1.144 2002/02/01 22:01:04 davem Exp $
* *
* Based on: * Based on:
* linux/net/ipv4/tcp.c * linux/net/ipv4/tcp.c
* linux/net/ipv4/tcp_input.c * linux/net/ipv4/tcp_input.c
* linux/net/ipv4/tcp_output.c * linux/net/ipv4/tcp_output.c
@ -74,7 +74,7 @@ static struct socket *tcp6_socket;
static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb); static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req); static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req);
static void tcp_v6_send_check(struct sock *sk, int len, static void tcp_v6_send_check(struct sock *sk, int len,
struct sk_buff *skb); struct sk_buff *skb);
static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
@ -106,8 +106,8 @@ static void tcp_v6_hash(struct sock *sk)
} }
static __inline__ __sum16 tcp_v6_check(struct tcphdr *th, int len, static __inline__ __sum16 tcp_v6_check(struct tcphdr *th, int len,
struct in6_addr *saddr, struct in6_addr *saddr,
struct in6_addr *daddr, struct in6_addr *daddr,
__wsum base) __wsum base)
{ {
return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base); return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
@ -121,11 +121,11 @@ static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
skb->h.th->source); skb->h.th->source);
} }
static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
int addr_len) int addr_len)
{ {
struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct inet_connection_sock *icsk = inet_csk(sk); struct inet_connection_sock *icsk = inet_csk(sk);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
@ -135,10 +135,10 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
int addr_type; int addr_type;
int err; int err;
if (addr_len < SIN6_LEN_RFC2133) if (addr_len < SIN6_LEN_RFC2133)
return -EINVAL; return -EINVAL;
if (usin->sin6_family != AF_INET6) if (usin->sin6_family != AF_INET6)
return(-EAFNOSUPPORT); return(-EAFNOSUPPORT);
memset(&fl, 0, sizeof(fl)); memset(&fl, 0, sizeof(fl));
@ -157,11 +157,11 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
} }
/* /*
* connect() to INADDR_ANY means loopback (BSD'ism). * connect() to INADDR_ANY means loopback (BSD'ism).
*/ */
if(ipv6_addr_any(&usin->sin6_addr)) if(ipv6_addr_any(&usin->sin6_addr))
usin->sin6_addr.s6_addr[15] = 0x1; usin->sin6_addr.s6_addr[15] = 0x1;
addr_type = ipv6_addr_type(&usin->sin6_addr); addr_type = ipv6_addr_type(&usin->sin6_addr);
@ -323,7 +323,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
struct ipv6_pinfo *np; struct ipv6_pinfo *np;
struct sock *sk; struct sock *sk;
int err; int err;
struct tcp_sock *tp; struct tcp_sock *tp;
__u32 seq; __u32 seq;
sk = inet6_lookup(&tcp_hashinfo, &hdr->daddr, th->dest, &hdr->saddr, sk = inet6_lookup(&tcp_hashinfo, &hdr->daddr, th->dest, &hdr->saddr,
@ -347,7 +347,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
goto out; goto out;
tp = tcp_sk(sk); tp = tcp_sk(sk);
seq = ntohl(th->seq); seq = ntohl(th->seq);
if (sk->sk_state != TCP_LISTEN && if (sk->sk_state != TCP_LISTEN &&
!between(seq, tp->snd_una, tp->snd_nxt)) { !between(seq, tp->snd_una, tp->snd_nxt)) {
NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS); NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
@ -434,7 +434,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
case TCP_SYN_SENT: case TCP_SYN_SENT:
case TCP_SYN_RECV: /* Cannot happen. case TCP_SYN_RECV: /* Cannot happen.
It can, it SYNs are crossed. --ANK */ It can, it SYNs are crossed. --ANK */
if (!sock_owned_by_user(sk)) { if (!sock_owned_by_user(sk)) {
sk->sk_err = err; sk->sk_err = err;
sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
@ -519,7 +519,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
} }
done: done:
if (opt && opt != np->opt) if (opt && opt != np->opt)
sock_kfree_s(sk, opt, opt->tot_len); sock_kfree_s(sk, opt, opt->tot_len);
dst_release(dst); dst_release(dst);
return err; return err;
@ -950,8 +950,8 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0);
skb->csum_offset = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
} else { } else {
th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,
csum_partial((char *)th, th->doff<<2, csum_partial((char *)th, th->doff<<2,
skb->csum)); skb->csum));
} }
} }
@ -977,7 +977,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb)
static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb) static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
{ {
struct tcphdr *th = skb->h.th, *t1; struct tcphdr *th = skb->h.th, *t1;
struct sk_buff *buff; struct sk_buff *buff;
struct flowi fl; struct flowi fl;
int tot_len = sizeof(*th); int tot_len = sizeof(*th);
@ -989,7 +989,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
return; return;
if (!ipv6_unicast_destination(skb)) if (!ipv6_unicast_destination(skb))
return; return;
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
if (sk) if (sk)
@ -1008,8 +1008,8 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len, buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
GFP_ATOMIC); GFP_ATOMIC);
if (buff == NULL) if (buff == NULL)
return; return;
skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len); skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
@ -1021,9 +1021,9 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
t1->source = th->dest; t1->source = th->dest;
t1->doff = tot_len / 4; t1->doff = tot_len / 4;
t1->rst = 1; t1->rst = 1;
if(th->ack) { if(th->ack) {
t1->seq = th->ack_seq; t1->seq = th->ack_seq;
} else { } else {
t1->ack = 1; t1->ack = 1;
t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin
@ -1128,7 +1128,7 @@ static void tcp_v6_send_ack(struct tcp_timewait_sock *tw,
t1->window = htons(win); t1->window = htons(win);
topt = (__be32 *)(t1 + 1); topt = (__be32 *)(t1 + 1);
if (ts) { if (ts) {
*topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) | *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
(TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP); (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
@ -1243,15 +1243,15 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
return tcp_v4_conn_request(sk, skb); return tcp_v4_conn_request(sk, skb);
if (!ipv6_unicast_destination(skb)) if (!ipv6_unicast_destination(skb))
goto drop; goto drop;
/* /*
* There are no SYN attacks on IPv6, yet... * There are no SYN attacks on IPv6, yet...
*/ */
if (inet_csk_reqsk_queue_is_full(sk) && !isn) { if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_INFO "TCPv6: dropping request, synflood is possible\n"); printk(KERN_INFO "TCPv6: dropping request, synflood is possible\n");
goto drop; goto drop;
} }
if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
@ -1292,7 +1292,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL) ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
treq->iif = inet6_iif(skb); treq->iif = inet6_iif(skb);
if (isn == 0) if (isn == 0)
isn = tcp_v6_init_sequence(skb); isn = tcp_v6_init_sequence(skb);
tcp_rsk(req)->snt_isn = isn; tcp_rsk(req)->snt_isn = isn;
@ -1334,7 +1334,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst); newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
if (newsk == NULL) if (newsk == NULL)
return NULL; return NULL;
newtcp6sk = (struct tcp6_sock *)newsk; newtcp6sk = (struct tcp6_sock *)newsk;
@ -1419,7 +1419,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0) if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
goto out; goto out;
} }
newsk = tcp_create_openreq_child(sk, req, skb); newsk = tcp_create_openreq_child(sk, req, skb);
if (newsk == NULL) if (newsk == NULL)
@ -1448,7 +1448,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr); ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
newsk->sk_bound_dev_if = treq->iif; newsk->sk_bound_dev_if = treq->iif;
/* Now IPv6 options... /* Now IPv6 options...
First: no IPv4 options. First: no IPv4 options.
*/ */
@ -1592,7 +1592,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
looks not very well thought. For now we latch looks not very well thought. For now we latch
options, received in the last packet, enqueued options, received in the last packet, enqueued
by tcp. Feel free to propose better solution. by tcp. Feel free to propose better solution.
--ANK (980728) --ANK (980728)
*/ */
if (np->rxopt.all) if (np->rxopt.all)
opt_skb = skb_clone(skb, GFP_ATOMIC); opt_skb = skb_clone(skb, GFP_ATOMIC);
@ -1610,7 +1610,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb)) if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb))
goto csum_err; goto csum_err;
if (sk->sk_state == TCP_LISTEN) { if (sk->sk_state == TCP_LISTEN) {
struct sock *nsk = tcp_v6_hnd_req(sk, skb); struct sock *nsk = tcp_v6_hnd_req(sk, skb);
if (!nsk) if (!nsk)
goto discard; goto discard;
@ -1620,7 +1620,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
* otherwise we just shortcircuit this and continue with * otherwise we just shortcircuit this and continue with
* the new socket.. * the new socket..
*/ */
if(nsk != sk) { if(nsk != sk) {
if (tcp_child_process(sk, nsk, skb)) if (tcp_child_process(sk, nsk, skb))
goto reset; goto reset;
if (opt_skb) if (opt_skb)
@ -1681,7 +1681,7 @@ ipv6_pktoptions:
static int tcp_v6_rcv(struct sk_buff **pskb) static int tcp_v6_rcv(struct sk_buff **pskb)
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct tcphdr *th; struct tcphdr *th;
struct sock *sk; struct sock *sk;
int ret; int ret;
@ -1739,10 +1739,10 @@ process:
ret = 0; ret = 0;
if (!sock_owned_by_user(sk)) { if (!sock_owned_by_user(sk)) {
#ifdef CONFIG_NET_DMA #ifdef CONFIG_NET_DMA
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
if (tp->ucopy.dma_chan) if (tp->ucopy.dma_chan)
ret = tcp_v6_do_rcv(sk, skb); ret = tcp_v6_do_rcv(sk, skb);
else else
#endif #endif
{ {
if (!tcp_prequeue(sk, skb)) if (!tcp_prequeue(sk, skb))
@ -1945,7 +1945,7 @@ static int tcp_v6_destroy_sock(struct sock *sk)
} }
/* Proc filesystem TCPv6 sock list dumping. */ /* Proc filesystem TCPv6 sock list dumping. */
static void get_openreq6(struct seq_file *seq, static void get_openreq6(struct seq_file *seq,
struct sock *sk, struct request_sock *req, int i, int uid) struct sock *sk, struct request_sock *req, int i, int uid)
{ {
int ttd = req->expires - jiffies; int ttd = req->expires - jiffies;
@ -1967,11 +1967,11 @@ static void get_openreq6(struct seq_file *seq,
ntohs(inet_rsk(req)->rmt_port), ntohs(inet_rsk(req)->rmt_port),
TCP_SYN_RECV, TCP_SYN_RECV,
0,0, /* could print option size, but that is af dependent. */ 0,0, /* could print option size, but that is af dependent. */
1, /* timers active (only the expire timer) */ 1, /* timers active (only the expire timer) */
jiffies_to_clock_t(ttd), jiffies_to_clock_t(ttd),
req->retrans, req->retrans,
uid, uid,
0, /* non standard timer */ 0, /* non standard timer */
0, /* open_requests have no inode */ 0, /* open_requests have no inode */
0, req); 0, req);
} }
@ -2014,7 +2014,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
src->s6_addr32[2], src->s6_addr32[3], srcp, src->s6_addr32[2], src->s6_addr32[3], srcp,
dest->s6_addr32[0], dest->s6_addr32[1], dest->s6_addr32[0], dest->s6_addr32[1],
dest->s6_addr32[2], dest->s6_addr32[3], destp, dest->s6_addr32[2], dest->s6_addr32[3], destp,
sp->sk_state, sp->sk_state,
tp->write_seq-tp->snd_una, tp->write_seq-tp->snd_una,
(sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
timer_active, timer_active,
@ -2031,7 +2031,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
); );
} }
static void get_timewait6_sock(struct seq_file *seq, static void get_timewait6_sock(struct seq_file *seq,
struct inet_timewait_sock *tw, int i) struct inet_timewait_sock *tw, int i)
{ {
struct in6_addr *dest, *src; struct in6_addr *dest, *src;

View File

@ -1,9 +1,9 @@
/* /*
* UDP over IPv6 * UDP over IPv6
* Linux INET6 implementation * Linux INET6 implementation
* *
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* Based on linux/ipv4/udp.c * Based on linux/ipv4/udp.c
* *
@ -67,7 +67,7 @@ static struct sock *__udp6_lib_lookup(struct in6_addr *saddr, __be16 sport,
unsigned short hnum = ntohs(dport); unsigned short hnum = ntohs(dport);
int badness = -1; int badness = -1;
read_lock(&udp_hash_lock); read_lock(&udp_hash_lock);
sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) { sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
@ -105,7 +105,7 @@ static struct sock *__udp6_lib_lookup(struct in6_addr *saddr, __be16 sport,
} }
if (result) if (result)
sock_hold(result); sock_hold(result);
read_unlock(&udp_hash_lock); read_unlock(&udp_hash_lock);
return result; return result;
} }
@ -120,13 +120,13 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct sk_buff *skb; struct sk_buff *skb;
size_t copied; size_t copied;
int err, copy_only, is_udplite = IS_UDPLITE(sk); int err, copy_only, is_udplite = IS_UDPLITE(sk);
if (addr_len) if (addr_len)
*addr_len=sizeof(struct sockaddr_in6); *addr_len=sizeof(struct sockaddr_in6);
if (flags & MSG_ERRQUEUE) if (flags & MSG_ERRQUEUE)
return ipv6_recv_error(sk, msg, len); return ipv6_recv_error(sk, msg, len);
@ -135,11 +135,11 @@ try_again:
if (!skb) if (!skb)
goto out; goto out;
copied = skb->len - sizeof(struct udphdr); copied = skb->len - sizeof(struct udphdr);
if (copied > len) { if (copied > len) {
copied = len; copied = len;
msg->msg_flags |= MSG_TRUNC; msg->msg_flags |= MSG_TRUNC;
} }
/* /*
* Decide whether to checksum and/or copy data. * Decide whether to checksum and/or copy data.
@ -168,7 +168,7 @@ try_again:
/* Copy the address. */ /* Copy the address. */
if (msg->msg_name) { if (msg->msg_name) {
struct sockaddr_in6 *sin6; struct sockaddr_in6 *sin6;
sin6 = (struct sockaddr_in6 *) msg->msg_name; sin6 = (struct sockaddr_in6 *) msg->msg_name;
sin6->sin6_family = AF_INET6; sin6->sin6_family = AF_INET6;
sin6->sin6_port = skb->h.uh->source; sin6->sin6_port = skb->h.uh->source;
@ -191,7 +191,7 @@ try_again:
} else { } else {
if (np->rxopt.all) if (np->rxopt.all)
datagram_recv_ctl(sk, msg, skb); datagram_recv_ctl(sk, msg, skb);
} }
err = copied; err = copied;
if (flags & MSG_TRUNC) if (flags & MSG_TRUNC)
@ -339,7 +339,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
* so we don't need to lock the hashes. * so we don't need to lock the hashes.
*/ */
static int __udp6_lib_mcast_deliver(struct sk_buff *skb, struct in6_addr *saddr, static int __udp6_lib_mcast_deliver(struct sk_buff *skb, struct in6_addr *saddr,
struct in6_addr *daddr, struct hlist_head udptable[]) struct in6_addr *daddr, struct hlist_head udptable[])
{ {
struct sock *sk, *sk2; struct sock *sk, *sk2;
const struct udphdr *uh = skb->h.uh; const struct udphdr *uh = skb->h.uh;
@ -379,7 +379,7 @@ static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh)
} }
if (skb->ip_summed == CHECKSUM_COMPLETE && if (skb->ip_summed == CHECKSUM_COMPLETE &&
!csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr, !csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr,
skb->len, IPPROTO_UDP, skb->csum )) skb->len, IPPROTO_UDP, skb->csum ))
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (skb->ip_summed != CHECKSUM_UNNECESSARY) if (skb->ip_summed != CHECKSUM_UNNECESSARY)
@ -396,7 +396,7 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
{ {
struct sk_buff *skb = *pskb; struct sk_buff *skb = *pskb;
struct sock *sk; struct sock *sk;
struct udphdr *uh; struct udphdr *uh;
struct net_device *dev = skb->dev; struct net_device *dev = skb->dev;
struct in6_addr *saddr, *daddr; struct in6_addr *saddr, *daddr;
u32 ulen = 0; u32 ulen = 0;
@ -437,15 +437,15 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
goto discard; goto discard;
} }
/* /*
* Multicast receive code * Multicast receive code
*/ */
if (ipv6_addr_is_multicast(daddr)) if (ipv6_addr_is_multicast(daddr))
return __udp6_lib_mcast_deliver(skb, saddr, daddr, udptable); return __udp6_lib_mcast_deliver(skb, saddr, daddr, udptable);
/* Unicast */ /* Unicast */
/* /*
* check socket cache ... must talk to Alan about his plans * check socket cache ... must talk to Alan about his plans
* for sock caches... i'll skip this for now. * for sock caches... i'll skip this for now.
*/ */
@ -465,21 +465,21 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
kfree_skb(skb); kfree_skb(skb);
return(0); return(0);
} }
/* deliver */ /* deliver */
udpv6_queue_rcv_skb(sk, skb); udpv6_queue_rcv_skb(sk, skb);
sock_put(sk); sock_put(sk);
return(0); return(0);
short_packet: short_packet:
LIMIT_NETDEBUG(KERN_DEBUG "UDP%sv6: short packet: %d/%u\n", LIMIT_NETDEBUG(KERN_DEBUG "UDP%sv6: short packet: %d/%u\n",
is_udplite? "-Lite" : "", ulen, skb->len); is_udplite? "-Lite" : "", ulen, skb->len);
discard: discard:
UDP6_INC_STATS_BH(UDP_MIB_INERRORS, is_udplite); UDP6_INC_STATS_BH(UDP_MIB_INERRORS, is_udplite);
kfree_skb(skb); kfree_skb(skb);
return(0); return(0);
} }
static __inline__ int udpv6_rcv(struct sk_buff **pskb) static __inline__ int udpv6_rcv(struct sk_buff **pskb)
@ -498,7 +498,7 @@ static void udp_v6_flush_pending_frames(struct sock *sk)
up->len = 0; up->len = 0;
up->pending = 0; up->pending = 0;
ip6_flush_pending_frames(sk); ip6_flush_pending_frames(sk);
} }
} }
/* /*
@ -594,7 +594,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
if (sk->sk_state != TCP_ESTABLISHED) if (sk->sk_state != TCP_ESTABLISHED)
return -EDESTADDRREQ; return -EDESTADDRREQ;
daddr = &np->daddr; daddr = &np->daddr;
} else } else
daddr = NULL; daddr = NULL;
if (daddr) { if (daddr) {
@ -620,7 +620,7 @@ do_udp_sendmsg:
*/ */
if (len > INT_MAX - sizeof(struct udphdr)) if (len > INT_MAX - sizeof(struct udphdr))
return -EMSGSIZE; return -EMSGSIZE;
if (up->pending) { if (up->pending) {
/* /*
* There are pending frames. * There are pending frames.
@ -713,7 +713,7 @@ do_udp_sendmsg:
if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
ipv6_addr_copy(&fl.fl6_src, &np->saddr); ipv6_addr_copy(&fl.fl6_src, &np->saddr);
fl.fl_ip_sport = inet->sport; fl.fl_ip_sport = inet->sport;
/* merge ip6_build_xmit from ip6_output */ /* merge ip6_build_xmit from ip6_output */
if (opt && opt->srcrt) { if (opt && opt->srcrt) {
struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
@ -911,7 +911,7 @@ static void udp6_sock_seq_show(struct seq_file *seq, struct sock *sp, int bucket
src->s6_addr32[2], src->s6_addr32[3], srcp, src->s6_addr32[2], src->s6_addr32[3], srcp,
dest->s6_addr32[0], dest->s6_addr32[1], dest->s6_addr32[0], dest->s6_addr32[1],
dest->s6_addr32[2], dest->s6_addr32[3], destp, dest->s6_addr32[2], dest->s6_addr32[3], destp,
sp->sk_state, sp->sk_state,
atomic_read(&sp->sk_wmem_alloc), atomic_read(&sp->sk_wmem_alloc),
atomic_read(&sp->sk_rmem_alloc), atomic_read(&sp->sk_rmem_alloc),
0, 0L, 0, 0, 0L, 0,

View File

@ -11,9 +11,9 @@ extern void __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *,
int , int , int , __be32 , struct hlist_head []); int , int , int , __be32 , struct hlist_head []);
extern int udpv6_getsockopt(struct sock *sk, int level, int optname, extern int udpv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
extern int udpv6_setsockopt(struct sock *sk, int level, int optname, extern int udpv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int optlen); char __user *optval, int optlen);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
extern int compat_udpv6_setsockopt(struct sock *sk, int level, int optname, extern int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int optlen); char __user *optval, int optlen);
@ -24,7 +24,7 @@ extern int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
struct msghdr *msg, size_t len); struct msghdr *msg, size_t len);
extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
struct msghdr *msg, size_t len, struct msghdr *msg, size_t len,
int noblock, int flags, int *addr_len); int noblock, int flags, int *addr_len);
extern int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb); extern int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
extern int udpv6_destroy_sock(struct sock *sk); extern int udpv6_destroy_sock(struct sock *sk);

View File

@ -33,7 +33,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
seq = 0; seq = 0;
if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0)
goto drop; goto drop;
do { do {
struct ipv6hdr *iph = skb->nh.ipv6h; struct ipv6hdr *iph = skb->nh.ipv6h;
@ -115,7 +115,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
__skb_push(skb, skb->data - skb->nh.raw); __skb_push(skb, skb->data - skb->nh.raw);
NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL, NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL,
ip6_rcv_finish); ip6_rcv_finish);
return -1; return -1;
#else #else
return 1; return 1;
@ -142,12 +142,12 @@ int xfrm6_rcv(struct sk_buff **pskb)
int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
xfrm_address_t *saddr, u8 proto) xfrm_address_t *saddr, u8 proto)
{ {
struct xfrm_state *x = NULL; struct xfrm_state *x = NULL;
int wildcard = 0; int wildcard = 0;
struct in6_addr any; struct in6_addr any;
xfrm_address_t *xany; xfrm_address_t *xany;
struct xfrm_state *xfrm_vec_one = NULL; struct xfrm_state *xfrm_vec_one = NULL;
int nh = 0; int nh = 0;
int i = 0; int i = 0;
ipv6_addr_set(&any, 0, 0, 0, 0); ipv6_addr_set(&any, 0, 0, 0, 0);
@ -168,12 +168,12 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
break; break;
case 2: case 2:
default: default:
/* lookup state with wild-card addresses */ /* lookup state with wild-card addresses */
wildcard = 1; /* XXX */ wildcard = 1; /* XXX */
dst = xany; dst = xany;
src = xany; src = xany;
break; break;
} }
x = xfrm_state_lookup_byaddr(dst, src, proto, AF_INET6); x = xfrm_state_lookup_byaddr(dst, src, proto, AF_INET6);
if (!x) if (!x)
@ -193,8 +193,8 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
if (unlikely(x->km.state != XFRM_STATE_VALID)) { if (unlikely(x->km.state != XFRM_STATE_VALID)) {
spin_unlock(&x->lock); spin_unlock(&x->lock);
xfrm_state_put(x); xfrm_state_put(x);
x = NULL; x = NULL;
continue; continue;
} }
if (xfrm_state_check_expire(x)) { if (xfrm_state_check_expire(x)) {
spin_unlock(&x->lock); spin_unlock(&x->lock);

View File

@ -2,7 +2,7 @@
* xfrm6_output.c - Common IPsec encapsulation code for IPv6. * xfrm6_output.c - Common IPsec encapsulation code for IPv6.
* Copyright (C) 2002 USAGI/WIDE Project * Copyright (C) 2002 USAGI/WIDE Project
* Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au> * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version * as published by the Free Software Foundation; either version
@ -46,7 +46,7 @@ static int xfrm6_output_one(struct sk_buff *skb)
struct dst_entry *dst = skb->dst; struct dst_entry *dst = skb->dst;
struct xfrm_state *x = dst->xfrm; struct xfrm_state *x = dst->xfrm;
int err; int err;
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
err = skb_checksum_help(skb); err = skb_checksum_help(skb);
if (err) if (err)
@ -81,7 +81,7 @@ static int xfrm6_output_one(struct sk_buff *skb)
spin_unlock_bh(&x->lock); spin_unlock_bh(&x->lock);
skb->nh.raw = skb->data; skb->nh.raw = skb->data;
if (!(skb->dst = dst_pop(dst))) { if (!(skb->dst = dst_pop(dst))) {
err = -EHOSTUNREACH; err = -EHOSTUNREACH;
goto error_nolock; goto error_nolock;
@ -108,7 +108,7 @@ static int xfrm6_output_finish2(struct sk_buff *skb)
while (likely((err = xfrm6_output_one(skb)) == 0)) { while (likely((err = xfrm6_output_one(skb)) == 0)) {
nf_reset(skb); nf_reset(skb);
err = nf_hook(PF_INET6, NF_IP6_LOCAL_OUT, &skb, NULL, err = nf_hook(PF_INET6, NF_IP6_LOCAL_OUT, &skb, NULL,
skb->dst->dev, dst_output); skb->dst->dev, dst_output);
if (unlikely(err != 1)) if (unlikely(err != 1))

View File

@ -8,7 +8,7 @@
* IPv6 support * IPv6 support
* YOSHIFUJI Hideaki * YOSHIFUJI Hideaki
* Split up af-specific portion * Split up af-specific portion
* *
*/ */
#include <linux/compiler.h> #include <linux/compiler.h>
@ -247,9 +247,9 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
x->u.rt6.rt6i_metric = rt0->rt6i_metric; x->u.rt6.rt6i_metric = rt0->rt6i_metric;
x->u.rt6.rt6i_node = rt0->rt6i_node; x->u.rt6.rt6i_node = rt0->rt6i_node;
x->u.rt6.rt6i_gateway = rt0->rt6i_gateway; x->u.rt6.rt6i_gateway = rt0->rt6i_gateway;
memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway)); memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway));
x->u.rt6.rt6i_dst = rt0->rt6i_dst; x->u.rt6.rt6i_dst = rt0->rt6i_dst;
x->u.rt6.rt6i_src = rt0->rt6i_src; x->u.rt6.rt6i_src = rt0->rt6i_src;
x->u.rt6.rt6i_idev = rt0->rt6i_idev; x->u.rt6.rt6i_idev = rt0->rt6i_idev;
in6_dev_hold(rt0->rt6i_idev); in6_dev_hold(rt0->rt6i_idev);
__xfrm6_bundle_len_dec(&header_len, &nfheader_len, x->u.dst.xfrm); __xfrm6_bundle_len_dec(&header_len, &nfheader_len, x->u.dst.xfrm);

View File

@ -8,7 +8,7 @@
* IPv6 support * IPv6 support
* YOSHIFUJI Hideaki @USAGI * YOSHIFUJI Hideaki @USAGI
* Split up af-specific portion * Split up af-specific portion
* *
*/ */
#include <net/xfrm.h> #include <net/xfrm.h>

View File

@ -5,12 +5,12 @@
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -32,7 +32,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
/* /*
* xfrm_tunnel_spi things are for allocating unique id ("spi") * xfrm_tunnel_spi things are for allocating unique id ("spi")
* per xfrm_address_t. * per xfrm_address_t.
*/ */
struct xfrm6_tunnel_spi { struct xfrm6_tunnel_spi {
@ -155,8 +155,8 @@ static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr)
for (spi = xfrm6_tunnel_spi; spi <= XFRM6_TUNNEL_SPI_MAX; spi++) { for (spi = xfrm6_tunnel_spi; spi <= XFRM6_TUNNEL_SPI_MAX; spi++) {
index = xfrm6_tunnel_spi_hash_byspi(spi); index = xfrm6_tunnel_spi_hash_byspi(spi);
hlist_for_each_entry(x6spi, pos, hlist_for_each_entry(x6spi, pos,
&xfrm6_tunnel_spi_byspi[index], &xfrm6_tunnel_spi_byspi[index],
list_byspi) { list_byspi) {
if (x6spi->spi == spi) if (x6spi->spi == spi)
goto try_next_1; goto try_next_1;
@ -167,8 +167,8 @@ try_next_1:;
} }
for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tunnel_spi; spi++) { for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tunnel_spi; spi++) {
index = xfrm6_tunnel_spi_hash_byspi(spi); index = xfrm6_tunnel_spi_hash_byspi(spi);
hlist_for_each_entry(x6spi, pos, hlist_for_each_entry(x6spi, pos,
&xfrm6_tunnel_spi_byspi[index], &xfrm6_tunnel_spi_byspi[index],
list_byspi) { list_byspi) {
if (x6spi->spi == spi) if (x6spi->spi == spi)
goto try_next_2; goto try_next_2;
@ -222,7 +222,7 @@ void xfrm6_tunnel_free_spi(xfrm_address_t *saddr)
write_lock_bh(&xfrm6_tunnel_spi_lock); write_lock_bh(&xfrm6_tunnel_spi_lock);
hlist_for_each_entry_safe(x6spi, pos, n, hlist_for_each_entry_safe(x6spi, pos, n,
&xfrm6_tunnel_spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)], &xfrm6_tunnel_spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)],
list_byaddr) list_byaddr)
{ {
@ -269,9 +269,9 @@ static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
{ {
/* xfrm6_tunnel native err handling */ /* xfrm6_tunnel native err handling */
switch (type) { switch (type) {
case ICMPV6_DEST_UNREACH: case ICMPV6_DEST_UNREACH:
switch (code) { switch (code) {
case ICMPV6_NOROUTE: case ICMPV6_NOROUTE:
case ICMPV6_ADM_PROHIBITED: case ICMPV6_ADM_PROHIBITED:
case ICMPV6_NOT_NEIGHBOUR: case ICMPV6_NOT_NEIGHBOUR:
case ICMPV6_ADDR_UNREACH: case ICMPV6_ADDR_UNREACH:
@ -287,7 +287,7 @@ static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
case ICMPV6_EXC_HOPLIMIT: case ICMPV6_EXC_HOPLIMIT:
break; break;
case ICMPV6_EXC_FRAGTIME: case ICMPV6_EXC_FRAGTIME:
default: default:
break; break;
} }
break; break;