Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
5e50115d
Commit
5e50115d
authored
Apr 25, 2003
by
Randy Dunlap
Committed by
Hideaki Yoshifuji
Apr 25, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[IPV6]: Per-interfave icmpv6 statistics support.
parent
4b3c7f8a
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
100 additions
and
26 deletions
+100
-26
include/net/if_inet6.h
include/net/if_inet6.h
+3
-0
include/net/ipv6.h
include/net/ipv6.h
+25
-5
net/ipv6/icmp.c
net/ipv6/icmp.c
+23
-8
net/ipv6/mcast.c
net/ipv6/mcast.c
+13
-4
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+28
-8
net/ipv6/proc.c
net/ipv6/proc.c
+7
-0
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+1
-1
No files found.
include/net/if_inet6.h
View file @
5e50115d
...
...
@@ -15,6 +15,8 @@
#ifndef _NET_IF_INET6_H
#define _NET_IF_INET6_H
#include <net/snmp.h>
#define IF_RA_RCVD 0x20
#define IF_RS_SENT 0x10
...
...
@@ -154,6 +156,7 @@ struct ipv6_devconf
struct
ipv6_devstat
{
struct
proc_dir_entry
*
proc_dir_entry
;
DEFINE_SNMP_STAT
(
struct
icmpv6_mib
,
icmpv6
);
};
struct
inet6_dev
...
...
include/net/ipv6.h
View file @
5e50115d
...
...
@@ -112,11 +112,31 @@ DECLARE_SNMP_STAT(struct ipv6_mib, ipv6_statistics);
#define IP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(ipv6_statistics, field)
#define IP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(ipv6_statistics, field)
DECLARE_SNMP_STAT
(
struct
icmpv6_mib
,
icmpv6_statistics
);
#define ICMP6_INC_STATS(field) SNMP_INC_STATS(icmpv6_statistics, field)
#define ICMP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(icmpv6_statistics, field)
#define ICMP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(icmpv6_statistics, field)
#define ICMP6_INC_STATS_OFFSET_BH(field, offset) \
SNMP_INC_STATS_OFFSET_BH(icmpv6_statistics, field, offset)
#define ICMP6_INC_STATS(idev, field) ({ \
struct inet6_dev *_idev = (idev); \
if (likely(_idev != NULL)) \
SNMP_INC_STATS(idev->stats.icmpv6, field); \
SNMP_INC_STATS(icmpv6_statistics, field); \
})
#define ICMP6_INC_STATS_BH(idev, field) ({ \
struct inet6_dev *_idev = (idev); \
if (likely(_idev != NULL)) \
SNMP_INC_STATS_BH((_idev)->stats.icmpv6, field); \
SNMP_INC_STATS_BH(icmpv6_statistics, field); \
})
#define ICMP6_INC_STATS_USER(idev, field) ({ \
struct inet6_dev *_idev = (idev); \
if (likely(_idev != NULL)) \
SNMP_INC_STATS_USER(_idev->stats.icmpv6, field); \
SNMP_INC_STATS_USER(icmpv6_statistics, field); \
})
#define ICMP6_INC_STATS_OFFSET_BH(idev, field, offset) ({ \
struct inet6_dev *_idev = idev; \
__typeof__(offset) _offset = (offset); \
if (likely(_idev != NULL)) \
SNMP_INC_STATS_OFFSET_BH(_idev->stats.icmpv6, field, _offset); \
SNMP_INC_STATS_OFFSET_BH(icmpv6_statistics, field, _offset); \
})
DECLARE_SNMP_STAT
(
struct
udp_mib
,
udp_stats_in6
);
#define UDP6_INC_STATS(field) SNMP_INC_STATS(udp_stats_in6, field)
#define UDP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_stats_in6, field)
...
...
net/ipv6/icmp.c
View file @
5e50115d
...
...
@@ -26,6 +26,8 @@
* yoshfuji : ensure to sent parameter problem for
* fragments.
* YOSHIFUJI Hideaki @USAGI: added sysctl for icmp rate limit.
* Randy Dunlap and
* YOSHIFUJI Hideaki @USAGI: Per-interface statistics support
*/
#include <linux/module.h>
...
...
@@ -247,6 +249,7 @@ static __inline__ int opt_unrec(struct sk_buff *skb, __u32 offset)
void
icmpv6_send
(
struct
sk_buff
*
skb
,
int
type
,
int
code
,
__u32
info
,
struct
net_device
*
dev
)
{
struct
inet6_dev
*
idev
;
struct
ipv6hdr
*
hdr
=
skb
->
nh
.
ipv6h
;
struct
sock
*
sk
=
icmpv6_socket
->
sk
;
struct
in6_addr
*
saddr
=
NULL
;
...
...
@@ -351,11 +354,16 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
msg
.
len
=
len
;
idev
=
in6_dev_get
(
skb
->
dev
);
ip6_build_xmit
(
sk
,
icmpv6_getfrag
,
&
msg
,
&
fl
,
len
,
NULL
,
-
1
,
MSG_DONTWAIT
);
if
(
type
>=
ICMPV6_DEST_UNREACH
&&
type
<=
ICMPV6_PARAMPROB
)
ICMP6_INC_STATS_OFFSET_BH
(
Icmp6OutDestUnreachs
,
type
-
ICMPV6_DEST_UNREACH
);
ICMP6_INC_STATS_BH
(
Icmp6OutMsgs
);
ICMP6_INC_STATS_OFFSET_BH
(
idev
,
Icmp6OutDestUnreachs
,
type
-
ICMPV6_DEST_UNREACH
);
ICMP6_INC_STATS_BH
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
out:
icmpv6_xmit_unlock
();
}
...
...
@@ -363,6 +371,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
static
void
icmpv6_echo_reply
(
struct
sk_buff
*
skb
)
{
struct
sock
*
sk
=
icmpv6_socket
->
sk
;
struct
inet6_dev
*
idev
;
struct
icmp6hdr
*
icmph
=
(
struct
icmp6hdr
*
)
skb
->
h
.
raw
;
struct
in6_addr
*
saddr
;
struct
icmpv6_msg
msg
;
...
...
@@ -394,14 +403,19 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
fl
.
fl_icmp_type
=
ICMPV6_ECHO_REPLY
;
fl
.
fl_icmp_code
=
0
;
idev
=
in6_dev_get
(
skb
->
dev
);
icmpv6_xmit_lock
();
ip6_build_xmit
(
sk
,
icmpv6_getfrag
,
&
msg
,
&
fl
,
msg
.
len
,
NULL
,
-
1
,
MSG_DONTWAIT
);
ICMP6_INC_STATS_BH
(
Icmp6OutEchoReplies
);
ICMP6_INC_STATS_BH
(
Icmp6OutMsgs
);
ICMP6_INC_STATS_BH
(
idev
,
Icmp6OutEchoReplies
);
ICMP6_INC_STATS_BH
(
idev
,
Icmp6OutMsgs
);
icmpv6_xmit_unlock
();
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
static
void
icmpv6_notify
(
struct
sk_buff
*
skb
,
int
type
,
int
code
,
u32
info
)
...
...
@@ -464,12 +478,13 @@ static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
{
struct
sk_buff
*
skb
=
*
pskb
;
struct
net_device
*
dev
=
skb
->
dev
;
struct
inet6_dev
*
idev
=
__in6_dev_get
(
dev
);
struct
in6_addr
*
saddr
,
*
daddr
;
struct
ipv6hdr
*
orig_hdr
;
struct
icmp6hdr
*
hdr
;
int
type
;
ICMP6_INC_STATS_BH
(
Icmp6InMsgs
);
ICMP6_INC_STATS_BH
(
idev
,
Icmp6InMsgs
);
saddr
=
&
skb
->
nh
.
ipv6h
->
saddr
;
daddr
=
&
skb
->
nh
.
ipv6h
->
daddr
;
...
...
@@ -517,9 +532,9 @@ static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
type
=
hdr
->
icmp6_type
;
if
(
type
>=
ICMPV6_DEST_UNREACH
&&
type
<=
ICMPV6_PARAMPROB
)
ICMP6_INC_STATS_OFFSET_BH
(
Icmp6InDestUnreachs
,
type
-
ICMPV6_DEST_UNREACH
);
ICMP6_INC_STATS_OFFSET_BH
(
idev
,
Icmp6InDestUnreachs
,
type
-
ICMPV6_DEST_UNREACH
);
else
if
(
type
>=
ICMPV6_ECHO_REQUEST
&&
type
<=
NDISC_REDIRECT
)
ICMP6_INC_STATS_OFFSET_BH
(
Icmp6InEchos
,
type
-
ICMPV6_ECHO_REQUEST
);
ICMP6_INC_STATS_OFFSET_BH
(
idev
,
Icmp6InEchos
,
type
-
ICMPV6_ECHO_REQUEST
);
switch
(
type
)
{
case
ICMPV6_ECHO_REQUEST
:
...
...
@@ -597,7 +612,7 @@ static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
return
0
;
discard_it:
ICMP6_INC_STATS_BH
(
Icmp6InErrors
);
ICMP6_INC_STATS_BH
(
idev
,
Icmp6InErrors
);
kfree_skb
(
skb
);
return
0
;
}
...
...
net/ipv6/mcast.c
View file @
5e50115d
...
...
@@ -1253,6 +1253,7 @@ static void mld_sendpack(struct sk_buff *skb)
struct
ipv6hdr
*
pip6
=
skb
->
nh
.
ipv6h
;
struct
mld2_report
*
pmr
=
(
struct
mld2_report
*
)
skb
->
h
.
raw
;
int
payload_len
,
mldlen
;
struct
inet6_dev
*
idev
=
in6_dev_get
(
skb
->
dev
);
payload_len
=
skb
->
tail
-
(
unsigned
char
*
)
skb
->
nh
.
ipv6h
-
sizeof
(
struct
ipv6hdr
);
...
...
@@ -1262,7 +1263,9 @@ static void mld_sendpack(struct sk_buff *skb)
pmr
->
csum
=
csum_ipv6_magic
(
&
pip6
->
saddr
,
&
pip6
->
daddr
,
mldlen
,
IPPROTO_ICMPV6
,
csum_partial
(
skb
->
h
.
raw
,
mldlen
,
0
));
dev_queue_xmit
(
skb
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
static
int
grec_size
(
struct
ifmcaddr6
*
pmc
,
int
type
,
int
gdel
,
int
sdel
)
...
...
@@ -1520,6 +1523,7 @@ static void mld_send_cr(struct inet6_dev *idev)
static
void
igmp6_send
(
struct
in6_addr
*
addr
,
struct
net_device
*
dev
,
int
type
)
{
struct
sock
*
sk
=
igmp6_socket
->
sk
;
struct
inet6_dev
*
idev
;
struct
sk_buff
*
skb
;
struct
icmp6hdr
*
hdr
;
struct
in6_addr
*
snd_addr
;
...
...
@@ -1577,12 +1581,17 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
IPPROTO_ICMPV6
,
csum_partial
((
__u8
*
)
hdr
,
len
,
0
));
idev
=
in6_dev_get
(
skb
->
dev
);
dev_queue_xmit
(
skb
);
if
(
type
==
ICMPV6_MGM_REDUCTION
)
ICMP6_INC_STATS
(
Icmp6OutGroupMembReductions
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutGroupMembReductions
);
else
ICMP6_INC_STATS
(
Icmp6OutGroupMembResponses
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutGroupMembResponses
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
return
;
out:
...
...
net/ipv6/ndisc.c
View file @
5e50115d
...
...
@@ -415,6 +415,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
{
static
struct
in6_addr
tmpaddr
;
struct
inet6_ifaddr
*
ifp
;
struct
inet6_dev
*
idev
;
struct
flowi
fl
;
struct
rt6_info
*
rt
=
NULL
;
struct
dst_entry
*
dst
;
...
...
@@ -497,10 +498,14 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
dst_clone
(
dst
);
skb
->
dst
=
dst
;
idev
=
in6_dev_get
(
dst
->
dev
);
dst_output
(
skb
);
ICMP6_INC_STATS
(
Icmp6OutNeighborAdvertisements
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutNeighborAdvertisements
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
void
ndisc_send_ns
(
struct
net_device
*
dev
,
struct
neighbour
*
neigh
,
...
...
@@ -510,6 +515,7 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
struct
flowi
fl
;
struct
rt6_info
*
rt
=
NULL
;
struct
dst_entry
*
dst
;
struct
inet6_dev
*
idev
;
struct
sock
*
sk
=
ndisc_socket
->
sk
;
struct
sk_buff
*
skb
;
struct
nd_msg
*
msg
;
...
...
@@ -576,10 +582,14 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
/* send it! */
dst_clone
(
dst
);
skb
->
dst
=
dst
;
idev
=
in6_dev_get
(
dst
->
dev
);
dst_output
(
skb
);
ICMP6_INC_STATS
(
Icmp6OutNeighborSolicits
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutNeighborSolicits
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
void
ndisc_send_rs
(
struct
net_device
*
dev
,
struct
in6_addr
*
saddr
,
...
...
@@ -588,6 +598,7 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
struct
flowi
fl
;
struct
rt6_info
*
rt
=
NULL
;
struct
dst_entry
*
dst
;
struct
inet6_dev
*
idev
;
struct
sock
*
sk
=
ndisc_socket
->
sk
;
struct
sk_buff
*
skb
;
struct
icmp6hdr
*
hdr
;
...
...
@@ -644,10 +655,14 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
/* send it! */
dst_clone
(
dst
);
skb
->
dst
=
dst
;
idev
=
in6_dev_get
(
dst
->
dev
);
dst_output
(
skb
);
ICMP6_INC_STATS
(
Icmp6OutRouterSolicits
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutRouterSolicits
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
...
...
@@ -1271,6 +1286,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
struct
net_device
*
dev
;
struct
rt6_info
*
rt
;
struct
dst_entry
*
dst
;
struct
inet6_dev
*
idev
;
struct
flowi
fl
;
u8
*
opt
;
int
rd_len
;
...
...
@@ -1379,10 +1395,14 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
csum_partial
((
u8
*
)
icmph
,
len
,
0
));
skb
->
dst
=
dst
;
idev
=
in6_dev_get
(
dst
->
dev
);
dst_output
(
skb
);
ICMP6_INC_STATS
(
Icmp6OutRedirects
);
ICMP6_INC_STATS
(
Icmp6OutMsgs
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutRedirects
);
ICMP6_INC_STATS
(
idev
,
Icmp6OutMsgs
);
if
(
likely
(
idev
!=
NULL
))
in6_dev_put
(
idev
);
}
static
void
pndisc_redo
(
struct
sk_buff
*
skb
)
...
...
net/ipv6/proc.c
View file @
5e50115d
...
...
@@ -183,6 +183,7 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
if
(
idev
)
{
seq_printf
(
seq
,
"%-32s
\t
%u
\n
"
,
"ifIndex"
,
idev
->
dev
->
ifindex
);
snmp6_seq_show_item
(
seq
,
(
void
**
)
idev
->
stats
.
icmpv6
,
snmp6_icmp6_list
);
}
else
{
snmp6_seq_show_item
(
seq
,
(
void
**
)
ipv6_statistics
,
snmp6_ipv6_list
);
snmp6_seq_show_item
(
seq
,
(
void
**
)
icmpv6_statistics
,
snmp6_icmp6_list
);
...
...
@@ -225,6 +226,9 @@ int snmp6_register_dev(struct inet6_dev *idev)
if
(
!
idev
||
!
idev
->
dev
)
return
-
EINVAL
;
if
(
snmp6_mib_init
((
void
**
)
idev
->
stats
.
icmpv6
,
sizeof
(
struct
icmpv6_mib
))
<
0
)
goto
err_icmp
;
#ifdef CONFIG_PROC_FS
if
(
!
proc_net_devsnmp6
)
{
err
=
-
ENOENT
;
...
...
@@ -242,7 +246,9 @@ int snmp6_register_dev(struct inet6_dev *idev)
#ifdef CONFIG_PROC_FS
err_proc:
snmp6_mib_free
((
void
**
)
idev
->
stats
.
icmpv6
);
#endif
err_icmp:
return
err
;
}
...
...
@@ -256,6 +262,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
remove_proc_entry
(
idev
->
stats
.
proc_dir_entry
->
name
,
proc_net_devsnmp6
);
#endif
snmp6_mib_free
((
void
**
)
idev
->
stats
.
icmpv6
);
return
0
;
}
...
...
net/ipv6/tcp_ipv6.c
View file @
5e50115d
...
...
@@ -751,7 +751,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
sk
=
tcp_v6_lookup
(
&
hdr
->
daddr
,
th
->
dest
,
&
hdr
->
saddr
,
th
->
source
,
skb
->
dev
->
ifindex
);
if
(
sk
==
NULL
)
{
ICMP6_INC_STATS_BH
(
Icmp6InErrors
);
ICMP6_INC_STATS_BH
(
__in6_dev_get
(
skb
->
dev
),
Icmp6InErrors
);
return
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment