projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[powerpc.git]
/
net
/
ipv6
/
icmp.c
diff --git
a/net/ipv6/icmp.c
b/net/ipv6/icmp.c
index
3dcc4b7
..
e9bcce9
100644
(file)
--- a/
net/ipv6/icmp.c
+++ b/
net/ipv6/icmp.c
@@
-37,7
+37,6
@@
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
-#include <linux/sched.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <linux/skbuff.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <linux/skbuff.h>
@@
-69,6
+68,7
@@
#include <asm/system.h>
DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics) __read_mostly;
#include <asm/system.h>
DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics) __read_mostly;
+EXPORT_SYMBOL(icmpv6_statistics);
/*
* The ICMP socket(s). This is the most convenient way to flow control
/*
* The ICMP socket(s). This is the most convenient way to flow control
@@
-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.
*/
void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
* Slightly more convenient version of icmpv6_send.
*/
void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
@@
-129,9
+129,9
@@
void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
static int is_ineligible(struct sk_buff *skb)
{
static int is_ineligible(struct sk_buff *skb)
{
- int ptr = (u8
*)(skb->nh.ipv6h+
1) - skb->data;
+ int ptr = (u8
*)(ipv6_hdr(skb) +
1) - skb->data;
int len = skb->len - ptr;
int len = skb->len - ptr;
- __u8 nexthdr =
skb->nh.ipv6h
->nexthdr;
+ __u8 nexthdr =
ipv6_hdr(skb)
->nexthdr;
if (len < 0)
return 1;
if (len < 0)
return 1;
@@
-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,
struct flowi *fl)
*/
static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
struct flowi *fl)
@@
-170,7
+170,7
@@
static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
if (type == ICMPV6_PKT_TOOBIG)
return 1;
if (type == ICMPV6_PKT_TOOBIG)
return 1;
- /*
+ /*
* Look up the output route.
* XXX: perhaps the expire for routing entries cloned by
* this lookup should be more aggressive (not longer than timeout).
* Look up the output route.
* XXX: perhaps the expire for routing entries cloned by
* 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
* checks if parameter problem report is caused by an
/*
* an inline helper for the "simple" if statement below
* 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
*/
@@
-206,7
+206,7
@@
static __inline__ int opt_unrec(struct sk_buff *skb, __u32 offset)
{
u8 _optval, *op;
{
u8 _optval, *op;
- offset += skb
->nh.raw - skb->data
;
+ offset += skb
_network_offset(skb)
;
op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
if (op == NULL)
return 1;
op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval);
if (op == NULL)
return 1;
@@
-222,7
+222,7
@@
static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct
if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
goto out;
if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
goto out;
- icmp6h =
(struct icmp6hdr*) skb->h.raw
;
+ icmp6h =
icmp6_hdr(skb)
;
memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
icmp6h->icmp6_cksum = 0;
memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
icmp6h->icmp6_cksum = 0;
@@
-275,7
+275,7
@@
static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, st
#ifdef CONFIG_IPV6_MIP6
static void mip6_addr_swap(struct sk_buff *skb)
{
#ifdef CONFIG_IPV6_MIP6
static void mip6_addr_swap(struct sk_buff *skb)
{
- struct ipv6hdr *iph =
skb->nh.ipv6h
;
+ struct ipv6hdr *iph =
ipv6_hdr(skb)
;
struct inet6_skb_parm *opt = IP6CB(skb);
struct ipv6_destopt_hao *hao;
struct in6_addr tmp;
struct inet6_skb_parm *opt = IP6CB(skb);
struct ipv6_destopt_hao *hao;
struct in6_addr tmp;
@@
-284,7
+284,8
@@
static void mip6_addr_swap(struct sk_buff *skb)
if (opt->dsthao) {
off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
if (likely(off >= 0)) {
if (opt->dsthao) {
off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
if (likely(off >= 0)) {
- hao = (struct ipv6_destopt_hao *)(skb->nh.raw + off);
+ hao = (struct ipv6_destopt_hao *)
+ (skb_network_header(skb) + off);
ipv6_addr_copy(&tmp, &iph->saddr);
ipv6_addr_copy(&iph->saddr, &hao->addr);
ipv6_addr_copy(&hao->addr, &tmp);
ipv6_addr_copy(&tmp, &iph->saddr);
ipv6_addr_copy(&iph->saddr, &hao->addr);
ipv6_addr_copy(&hao->addr, &tmp);
@@
-298,11
+299,11
@@
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 inet6_dev *idev = NULL;
struct net_device *dev)
{
struct inet6_dev *idev = NULL;
- struct ipv6hdr *hdr =
skb->nh.ipv6h
;
+ struct ipv6hdr *hdr =
ipv6_hdr(skb)
;
struct sock *sk;
struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL;
struct sock *sk;
struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL;
@@
-316,11
+317,12
@@
void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
int hlimit, tclass;
int err = 0;
int hlimit, tclass;
int err = 0;
- if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail)
+ if ((u8 *)hdr < skb->head ||
+ (skb->network_header + sizeof(*hdr)) > skb->tail)
return;
/*
return;
/*
- * Make sure we respect the rules
+ * Make sure we respect the rules
* i.e. RFC 1885 2.4(e)
* Rule (e.1) is enforced by not using icmpv6_send
* in any code that processes icmp errors.
* i.e. RFC 1885 2.4(e)
* Rule (e.1) is enforced by not using icmpv6_send
* in any code that processes icmp errors.
@@
-336,8
+338,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 (type != ICMPV6_PKT_TOOBIG &&
if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
if (type != ICMPV6_PKT_TOOBIG &&
- !(type == ICMPV6_PARAMPROB &&
- code == ICMPV6_UNK_OPTION &&
+ !(type == ICMPV6_PARAMPROB &&
+ code == ICMPV6_UNK_OPTION &&
(opt_unrec(skb, info))))
return;
(opt_unrec(skb, info))))
return;
@@
-364,7
+366,7
@@
void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
return;
}
return;
}
- /*
+ /*
* Never answer to a ICMP packet.
*/
if (is_ineligible(skb)) {
* Never answer to a ICMP packet.
*/
if (is_ineligible(skb)) {
@@
-431,7
+433,7
@@
void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
tclass = 0;
msg.skb = skb;
tclass = 0;
msg.skb = skb;
- msg.offset = skb
->nh.raw - skb->data
;
+ msg.offset = skb
_network_offset(skb)
;
msg.type = type;
len = skb->len - msg.offset;
msg.type = type;
len = skb->len - msg.offset;
@@
-467,13
+469,15
@@
out:
icmpv6_xmit_unlock();
}
icmpv6_xmit_unlock();
}
+EXPORT_SYMBOL(icmpv6_send);
+
static void icmpv6_echo_reply(struct sk_buff *skb)
{
struct sock *sk;
struct inet6_dev *idev;
struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL;
static void icmpv6_echo_reply(struct sk_buff *skb)
{
struct sock *sk;
struct inet6_dev *idev;
struct ipv6_pinfo *np;
struct in6_addr *saddr = NULL;
- struct icmp6hdr *icmph =
(struct icmp6hdr *) skb->h.raw
;
+ struct icmp6hdr *icmph =
icmp6_hdr(skb)
;
struct icmp6hdr tmp_hdr;
struct flowi fl;
struct icmpv6_msg msg;
struct icmp6hdr tmp_hdr;
struct flowi fl;
struct icmpv6_msg msg;
@@
-482,7
+486,7
@@
static void icmpv6_echo_reply(struct sk_buff *skb)
int hlimit;
int tclass;
int hlimit;
int tclass;
- saddr = &
skb->nh.ipv6h
->daddr;
+ saddr = &
ipv6_hdr(skb)
->daddr;
if (!ipv6_unicast_destination(skb))
saddr = NULL;
if (!ipv6_unicast_destination(skb))
saddr = NULL;
@@
-492,7
+496,7
@@
static void icmpv6_echo_reply(struct sk_buff *skb)
memset(&fl, 0, sizeof(fl));
fl.proto = IPPROTO_ICMPV6;
memset(&fl, 0, sizeof(fl));
fl.proto = IPPROTO_ICMPV6;
- ipv6_addr_copy(&fl.fl6_dst, &
skb->nh.ipv6h
->saddr);
+ ipv6_addr_copy(&fl.fl6_dst, &
ipv6_hdr(skb)
->saddr);
if (saddr)
ipv6_addr_copy(&fl.fl6_src, saddr);
fl.oif = skb->dev->ifindex;
if (saddr)
ipv6_addr_copy(&fl.fl6_src, saddr);
fl.oif = skb->dev->ifindex;
@@
-543,14
+547,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_OUTMSGS);
+ ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTECHOREPLIES);
+ ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS);
-out_put:
+out_put:
if (likely(idev != NULL))
in6_dev_put(idev);
dst_release(dst);
if (likely(idev != NULL))
in6_dev_put(idev);
dst_release(dst);
-out:
+out:
icmpv6_xmit_unlock();
}
icmpv6_xmit_unlock();
}
@@
-580,8
+584,8
@@
static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info)
if (!pskb_may_pull(skb, inner_offset+8))
return;
if (!pskb_may_pull(skb, inner_offset+8))
return;
- saddr = &
skb->nh.ipv6h
->saddr;
- daddr = &
skb->nh.ipv6h
->daddr;
+ saddr = &
ipv6_hdr(skb)
->saddr;
+ daddr = &
ipv6_hdr(skb)
->daddr;
/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
Without this we will not able f.e. to make source routed
/* BUGGG_FUTURE: we should try to parse exthdrs in this packet.
Without this we will not able f.e. to make source routed
@@
-608,7
+612,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
*/
@@
-625,8
+629,8
@@
static int icmpv6_rcv(struct sk_buff **pskb)
ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INMSGS);
ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INMSGS);
- saddr = &
skb->nh.ipv6h
->saddr;
- daddr = &
skb->nh.ipv6h
->daddr;
+ saddr = &
ipv6_hdr(skb)
->saddr;
+ daddr = &
ipv6_hdr(skb)
->daddr;
/* Perform checksum. */
switch (skb->ip_summed) {
/* Perform checksum. */
switch (skb->ip_summed) {
@@
-648,7
+652,7
@@
static int icmpv6_rcv(struct sk_buff **pskb)
if (!pskb_pull(skb, sizeof(struct icmp6hdr)))
goto discard_it;
if (!pskb_pull(skb, sizeof(struct icmp6hdr)))
goto discard_it;
- hdr =
(struct icmp6hdr *) skb->h.raw
;
+ hdr =
icmp6_hdr(skb)
;
type = hdr->icmp6_type;
type = hdr->icmp6_type;
@@
-674,7
+678,7
@@
static int icmpv6_rcv(struct sk_buff **pskb)
*/
if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
goto discard_it;
*/
if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
goto discard_it;
- hdr =
(struct icmp6hdr *) skb->h.raw
;
+ hdr =
icmp6_hdr(skb)
;
orig_hdr = (struct ipv6hdr *) (hdr + 1);
rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,
ntohl(hdr->icmp6_mtu));
orig_hdr = (struct ipv6hdr *) (hdr + 1);
rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,
ntohl(hdr->icmp6_mtu));
@@
-722,13
+726,14
@@
static int icmpv6_rcv(struct sk_buff **pskb)
if (type & ICMPV6_INFOMSG_MASK)
break;
if (type & ICMPV6_INFOMSG_MASK)
break;
- /*
- * error of unknown type.
- * must pass to upper level
+ /*
+ * error of unknown type.
+ * 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);
- };
+ }
+
kfree_skb(skb);
return 0;
kfree_skb(skb);
return 0;
@@
-852,7
+857,7
@@
int icmpv6_err_convert(int type, int code, int *err)
case ICMPV6_PKT_TOOBIG:
*err = EMSGSIZE;
break;
case ICMPV6_PKT_TOOBIG:
*err = EMSGSIZE;
break;
-
+
case ICMPV6_PARAMPROB:
*err = EPROTO;
fatal = 1;
case ICMPV6_PARAMPROB:
*err = EPROTO;
fatal = 1;
@@
-861,11
+866,13
@@
int icmpv6_err_convert(int type, int code, int *err)
case ICMPV6_TIME_EXCEED:
*err = EHOSTUNREACH;
break;
case ICMPV6_TIME_EXCEED:
*err = EHOSTUNREACH;
break;
- }
;
+ }
return fatal;
}
return fatal;
}
+EXPORT_SYMBOL(icmpv6_err_convert);
+
#ifdef CONFIG_SYSCTL
ctl_table ipv6_icmp_table[] = {
{
#ifdef CONFIG_SYSCTL
ctl_table ipv6_icmp_table[] = {
{