Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
iproute2
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
iproute2
Commits
effdfc9e
Commit
effdfc9e
authored
Dec 20, 2014
by
Stephen Hemminger
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into net-next
parents
2ea49a38
8a4025f6
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
134 additions
and
165 deletions
+134
-165
include/libnetlink.h
include/libnetlink.h
+1
-0
include/linux/in6.h
include/linux/in6.h
+2
-1
include/linux/libc-compat.h
include/linux/libc-compat.h
+3
-0
ip/iplink_can.c
ip/iplink_can.c
+6
-0
ip/ipmonitor.c
ip/ipmonitor.c
+13
-10
lib/libnetlink.c
lib/libnetlink.c
+5
-0
lib/rt_names.c
lib/rt_names.c
+41
-31
misc/nstat.c
misc/nstat.c
+16
-2
misc/ss.c
misc/ss.c
+47
-121
No files found.
include/libnetlink.h
View file @
effdfc9e
...
...
@@ -18,6 +18,7 @@ struct rtnl_handle
struct
sockaddr_nl
peer
;
__u32
seq
;
__u32
dump
;
int
proto
;
};
extern
int
rcvbuf
;
...
...
include/linux/in6.h
View file @
effdfc9e
...
...
@@ -149,7 +149,7 @@ struct in6_flowlabel_req {
/*
* IPV6 socket options
*/
#if __UAPI_DEF_IPV6_OPTIONS
#define IPV6_ADDRFORM 1
#define IPV6_2292PKTINFO 2
#define IPV6_2292HOPOPTS 3
...
...
@@ -196,6 +196,7 @@ struct in6_flowlabel_req {
#define IPV6_IPSEC_POLICY 34
#define IPV6_XFRM_POLICY 35
#endif
/*
* Multicast:
...
...
include/linux/libc-compat.h
View file @
effdfc9e
...
...
@@ -69,6 +69,7 @@
#define __UAPI_DEF_SOCKADDR_IN6 0
#define __UAPI_DEF_IPV6_MREQ 0
#define __UAPI_DEF_IPPROTO_V6 0
#define __UAPI_DEF_IPV6_OPTIONS 0
#else
...
...
@@ -82,6 +83,7 @@
#define __UAPI_DEF_SOCKADDR_IN6 1
#define __UAPI_DEF_IPV6_MREQ 1
#define __UAPI_DEF_IPPROTO_V6 1
#define __UAPI_DEF_IPV6_OPTIONS 1
#endif
/* _NETINET_IN_H */
...
...
@@ -103,6 +105,7 @@
#define __UAPI_DEF_SOCKADDR_IN6 1
#define __UAPI_DEF_IPV6_MREQ 1
#define __UAPI_DEF_IPPROTO_V6 1
#define __UAPI_DEF_IPV6_OPTIONS 1
/* Definitions for xattr.h */
#define __UAPI_DEF_XATTR 1
...
...
ip/iplink_can.c
View file @
effdfc9e
...
...
@@ -37,6 +37,7 @@ static void print_usage(FILE *f)
"
\t
[ one-shot { on | off } ]
\n
"
"
\t
[ berr-reporting { on | off } ]
\n
"
"
\t
[ fd { on | off } ]
\n
"
"
\t
[ presume-ack { on | off } ]
\n
"
"
\n
"
"
\t
[ restart-ms TIME-MS ]
\n
"
"
\t
[ restart ]
\n
"
...
...
@@ -99,6 +100,7 @@ static void print_ctrlmode(FILE *f, __u32 cm)
_PF
(
CAN_CTRLMODE_ONE_SHOT
,
"ONE-SHOT"
);
_PF
(
CAN_CTRLMODE_BERR_REPORTING
,
"BERR-REPORTING"
);
_PF
(
CAN_CTRLMODE_FD
,
"FD"
);
_PF
(
CAN_CTRLMODE_PRESUME_ACK
,
"PRESUME-ACK"
);
#undef _PF
if
(
cm
)
fprintf
(
f
,
"%x"
,
cm
);
...
...
@@ -201,6 +203,10 @@ static int can_parse_opt(struct link_util *lu, int argc, char **argv,
NEXT_ARG
();
set_ctrlmode
(
"fd"
,
*
argv
,
&
cm
,
CAN_CTRLMODE_FD
);
}
else
if
(
matches
(
*
argv
,
"presume-ack"
)
==
0
)
{
NEXT_ARG
();
set_ctrlmode
(
"presume-ack"
,
*
argv
,
&
cm
,
CAN_CTRLMODE_PRESUME_ACK
);
}
else
if
(
matches
(
*
argv
,
"restart"
)
==
0
)
{
__u32
val
=
1
;
...
...
ip/ipmonitor.c
View file @
effdfc9e
...
...
@@ -134,14 +134,6 @@ static int accept_msg(const struct sockaddr_nl *who,
fprintf
(
fp
,
"Timestamp: %s %lu us
\n
"
,
tstr
,
usecs
);
return
0
;
}
if
(
n
->
nlmsg_type
==
RTM_NEWQDISC
||
n
->
nlmsg_type
==
RTM_DELQDISC
||
n
->
nlmsg_type
==
RTM_NEWTCLASS
||
n
->
nlmsg_type
==
RTM_DELTCLASS
||
n
->
nlmsg_type
==
RTM_NEWTFILTER
||
n
->
nlmsg_type
==
RTM_DELTFILTER
||
n
->
nlmsg_type
==
RTM_NEWNDUSEROPT
)
return
0
;
if
(
n
->
nlmsg_type
!=
NLMSG_ERROR
&&
n
->
nlmsg_type
!=
NLMSG_NOOP
&&
n
->
nlmsg_type
!=
NLMSG_DONE
)
{
fprintf
(
fp
,
"Unknown message: type=0x%08x(%d) flags=0x%08x(%d)"
...
...
@@ -155,7 +147,7 @@ static int accept_msg(const struct sockaddr_nl *who,
int
do_ipmonitor
(
int
argc
,
char
**
argv
)
{
char
*
file
=
NULL
;
unsigned
groups
=
~
RTMGRP_TC
;
unsigned
groups
=
0
;
int
llink
=
0
;
int
laddr
=
0
;
int
lroute
=
0
;
...
...
@@ -165,6 +157,18 @@ int do_ipmonitor(int argc, char **argv)
int
lnetconf
=
0
;
int
ifindex
=
0
;
groups
|=
nl_mgrp
(
RTNLGRP_LINK
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV4_IFADDR
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV6_IFADDR
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV4_ROUTE
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV6_ROUTE
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV4_MROUTE
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV6_MROUTE
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV6_PREFIX
);
groups
|=
nl_mgrp
(
RTNLGRP_NEIGH
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV4_NETCONF
);
groups
|=
nl_mgrp
(
RTNLGRP_IPV6_NETCONF
);
rtnl_close
(
&
rth
);
while
(
argc
>
0
)
{
...
...
@@ -195,7 +199,6 @@ int do_ipmonitor(int argc, char **argv)
lnetconf
=
1
;
groups
=
0
;
}
else
if
(
strcmp
(
*
argv
,
"all"
)
==
0
)
{
groups
=
~
RTMGRP_TC
;
prefix_banner
=
1
;
}
else
if
(
matches
(
*
argv
,
"help"
)
==
0
)
{
usage
();
...
...
lib/libnetlink.c
View file @
effdfc9e
...
...
@@ -43,6 +43,7 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions,
memset
(
rth
,
0
,
sizeof
(
*
rth
));
rth
->
proto
=
protocol
;
rth
->
fd
=
socket
(
AF_NETLINK
,
SOCK_RAW
|
SOCK_CLOEXEC
,
protocol
);
if
(
rth
->
fd
<
0
)
{
perror
(
"Cannot open netlink socket"
);
...
...
@@ -245,6 +246,10 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
"ERROR truncated
\n
"
);
}
else
{
errno
=
-
err
->
error
;
if
(
rth
->
proto
==
NETLINK_SOCK_DIAG
&&
errno
==
ENOENT
)
return
-
1
;
perror
(
"RTNETLINK answers"
);
}
return
-
1
;
...
...
lib/rt_names.c
View file @
effdfc9e
...
...
@@ -27,43 +27,63 @@
#define CONFDIR "/etc/iproute2"
#endif
#define NAME_MAX_LEN 512
struct
rtnl_hash_entry
{
struct
rtnl_hash_entry
*
next
;
const
char
*
name
;
unsigned
int
id
;
};
static
int
fread_id_name
(
FILE
*
fp
,
int
*
id
,
char
*
namebuf
)
{
char
buf
[
NAME_MAX_LEN
];
while
(
fgets
(
buf
,
sizeof
(
buf
),
fp
))
{
char
*
p
=
buf
;
while
(
*
p
==
' '
||
*
p
==
'\t'
)
p
++
;
if
(
*
p
==
'#'
||
*
p
==
'\n'
||
*
p
==
0
)
continue
;
if
(
sscanf
(
p
,
"0x%x %s
\n
"
,
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"0x%x %s #"
,
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s
\n
"
,
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s #"
,
id
,
namebuf
)
!=
2
)
{
strcpy
(
namebuf
,
p
);
return
-
1
;
}
return
1
;
}
return
0
;
}
static
void
rtnl_hash_initialize
(
const
char
*
file
,
struct
rtnl_hash_entry
**
hash
,
int
size
)
{
struct
rtnl_hash_entry
*
entry
;
char
buf
[
512
];
FILE
*
fp
;
int
id
;
char
namebuf
[
NAME_MAX_LEN
]
=
{
0
};
int
ret
;
fp
=
fopen
(
file
,
"r"
);
if
(
!
fp
)
return
;
while
(
fgets
(
buf
,
sizeof
(
buf
),
fp
))
{
char
*
p
=
buf
;
int
id
;
char
namebuf
[
512
];
while
(
*
p
==
' '
||
*
p
==
'\t'
)
p
++
;
if
(
*
p
==
'#'
||
*
p
==
'\n'
||
*
p
==
0
)
continue
;
if
(
sscanf
(
p
,
"0x%x %s
\n
"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"0x%x %s #"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s
\n
"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s #"
,
&
id
,
namebuf
)
!=
2
)
{
while
((
ret
=
fread_id_name
(
fp
,
&
id
,
&
namebuf
[
0
])))
{
if
(
ret
==
-
1
)
{
fprintf
(
stderr
,
"Database %s is corrupted at %s
\n
"
,
file
,
p
);
file
,
namebuf
);
fclose
(
fp
);
return
;
}
if
(
id
<
0
)
continue
;
entry
=
malloc
(
sizeof
(
*
entry
));
entry
->
id
=
id
;
entry
->
name
=
strdup
(
namebuf
);
...
...
@@ -75,31 +95,22 @@ rtnl_hash_initialize(const char *file, struct rtnl_hash_entry **hash, int size)
static
void
rtnl_tab_initialize
(
const
char
*
file
,
char
**
tab
,
int
size
)
{
char
buf
[
512
];
FILE
*
fp
;
int
id
;
char
namebuf
[
NAME_MAX_LEN
]
=
{
0
};
int
ret
;
fp
=
fopen
(
file
,
"r"
);
if
(
!
fp
)
return
;
while
(
fgets
(
buf
,
sizeof
(
buf
),
fp
))
{
char
*
p
=
buf
;
int
id
;
char
namebuf
[
512
];
while
(
*
p
==
' '
||
*
p
==
'\t'
)
p
++
;
if
(
*
p
==
'#'
||
*
p
==
'\n'
||
*
p
==
0
)
continue
;
if
(
sscanf
(
p
,
"0x%x %s
\n
"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"0x%x %s #"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s
\n
"
,
&
id
,
namebuf
)
!=
2
&&
sscanf
(
p
,
"%d %s #"
,
&
id
,
namebuf
)
!=
2
)
{
while
((
ret
=
fread_id_name
(
fp
,
&
id
,
&
namebuf
[
0
])))
{
if
(
ret
==
-
1
)
{
fprintf
(
stderr
,
"Database %s is corrupted at %s
\n
"
,
file
,
p
);
file
,
namebuf
);
fclose
(
fp
);
return
;
}
if
(
id
<
0
||
id
>
size
)
continue
;
...
...
@@ -185,7 +196,6 @@ int rtnl_rtprot_a2n(__u32 *id, const char *arg)
return
0
;
}
static
char
*
rtnl_rtscope_tab
[
256
]
=
{
"global"
,
};
...
...
@@ -469,7 +479,7 @@ static int rtnl_group_init;
static
void
rtnl_group_initialize
(
void
)
{
rtnl_group_init
=
1
;
rtnl_hash_initialize
(
"/etc/iproute2
/group"
,
rtnl_hash_initialize
(
CONFDIR
"
/group"
,
rtnl_group_hash
,
256
);
}
...
...
misc/nstat.c
View file @
effdfc9e
...
...
@@ -156,6 +156,15 @@ static void load_good_table(FILE *fp)
}
}
static
int
count_spaces
(
const
char
*
line
)
{
int
count
=
0
;
char
c
;
while
((
c
=
*
line
++
)
!=
0
)
count
+=
c
==
' '
||
c
==
'\n'
;
return
count
;
}
static
void
load_ugly_table
(
FILE
*
fp
)
{
...
...
@@ -167,10 +176,12 @@ static void load_ugly_table(FILE *fp)
char
idbuf
[
sizeof
(
buf
)];
int
off
;
char
*
p
;
int
count1
,
count2
,
skip
=
0
;
p
=
strchr
(
buf
,
':'
);
if
(
!
p
)
abort
();
count1
=
count_spaces
(
buf
);
*
p
=
0
;
idbuf
[
0
]
=
0
;
strncat
(
idbuf
,
buf
,
sizeof
(
idbuf
)
-
1
);
...
...
@@ -199,6 +210,9 @@ static void load_ugly_table(FILE *fp)
n
=
db
;
if
(
fgets
(
buf
,
sizeof
(
buf
),
fp
)
==
NULL
)
abort
();
count2
=
count_spaces
(
buf
);
if
(
count2
>
count1
)
skip
=
count2
-
count1
;
do
{
p
=
strrchr
(
buf
,
' '
);
if
(
!
p
)
...
...
@@ -207,8 +221,8 @@ static void load_ugly_table(FILE *fp)
if
(
sscanf
(
p
+
1
,
"%llu"
,
&
n
->
val
)
!=
1
)
abort
();
/* Trick to skip "dummy" trailing ICMP MIB in 2.4 */
if
(
s
trcmp
(
idbuf
,
"IcmpOutAddrMaskReps"
)
==
0
)
idbuf
[
5
]
=
0
;
if
(
s
kip
)
skip
--
;
else
n
=
n
->
next
;
}
while
(
p
>
buf
+
off
+
2
);
...
...
misc/ss.c
View file @
effdfc9e
...
...
@@ -41,6 +41,8 @@
#include <linux/packet_diag.h>
#include <linux/netlink_diag.h>
#define MAGIC_SEQ 123456
#define DIAG_REQUEST(_req, _r) \
struct { \
struct nlmsghdr nlh; \
...
...
@@ -49,7 +51,7 @@
.nlh = { \
.nlmsg_type = SOCK_DIAG_BY_FAMILY, \
.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST,\
.nlmsg_seq =
123456
, \
.nlmsg_seq =
MAGIC_SEQ
, \
.nlmsg_len = sizeof(_req), \
}, \
}
...
...
@@ -101,8 +103,6 @@ int state_width;
int
addrp_width
;
int
addr_width
;
int
serv_width
;
int
paddr_width
;
int
pserv_width
;
int
screen_width
;
static
const
char
*
TCP_PROTO
=
"tcp"
;
...
...
@@ -1231,16 +1231,8 @@ void *parse_hostcond(char *addr)
}
if
(
addr
[
0
]
&&
strcmp
(
addr
,
"*"
))
{
a
.
addr
.
bitlen
=
32
;
if
(
get_u32
(
a
.
addr
.
data
,
addr
,
0
))
{
if
(
strcmp
(
addr
,
"rtnl"
)
==
0
)
a
.
addr
.
data
[
0
]
=
0
;
else
if
(
strcmp
(
addr
,
"fw"
)
==
0
)
a
.
addr
.
data
[
0
]
=
3
;
else
if
(
strcmp
(
addr
,
"tcpdiag"
)
==
0
)
a
.
addr
.
data
[
0
]
=
4
;
else
return
NULL
;
}
if
(
nl_proto_a2n
(
&
a
.
addr
.
data
[
0
],
addr
)
==
-
1
)
return
NULL
;
}
goto
out
;
}
...
...
@@ -1777,7 +1769,7 @@ static int tcpdiag_send(int fd, int protocol, struct filter *f)
req
.
nlh
.
nlmsg_type
=
DCCPDIAG_GETSOCK
;
req
.
nlh
.
nlmsg_flags
=
NLM_F_ROOT
|
NLM_F_MATCH
|
NLM_F_REQUEST
;
req
.
nlh
.
nlmsg_pid
=
0
;
req
.
nlh
.
nlmsg_seq
=
123456
;
req
.
nlh
.
nlmsg_seq
=
MAGIC_SEQ
;
memset
(
&
req
.
r
,
0
,
sizeof
(
req
.
r
));
req
.
r
.
idiag_family
=
AF_INET
;
req
.
r
.
idiag_states
=
f
->
states
;
...
...
@@ -1937,7 +1929,7 @@ again:
struct
inet_diag_msg
*
r
=
NLMSG_DATA
(
h
);
if
(
/*h->nlmsg_pid != rth->local.nl_pid ||*/
h
->
nlmsg_seq
!=
123456
)
h
->
nlmsg_seq
!=
MAGIC_SEQ
)
goto
skip_it
;
if
(
h
->
nlmsg_type
==
NLMSG_DONE
)
...
...
@@ -2422,8 +2414,10 @@ static void unix_list_print(struct unixstat *list, struct filter *f)
}
}
static
int
unix_show_sock
(
struct
nlmsghdr
*
nlh
,
struct
filter
*
f
)
static
int
unix_show_sock
(
const
struct
sockaddr_nl
*
addr
,
struct
nlmsghdr
*
nlh
,
void
*
arg
)
{
struct
filter
*
f
=
(
struct
filter
*
)
arg
;
struct
unix_diag_msg
*
r
=
NLMSG_DATA
(
nlh
);
struct
rtattr
*
tb
[
UNIX_DIAG_MAX
+
1
];
char
name
[
128
];
...
...
@@ -2512,90 +2506,30 @@ static int unix_show_sock(struct nlmsghdr *nlh, struct filter *f)
return
0
;
}
static
int
handle_netlink_request
(
struct
filter
*
f
,
FILE
*
dump_fp
,
struct
nlmsghdr
*
req
,
size_t
size
,
int
(
*
show_one_sock
)(
struct
nlmsghdr
*
nlh
,
struct
filter
*
f
))
static
int
handle_netlink_request
(
struct
filter
*
f
,
struct
nlmsghdr
*
req
,
size_t
size
,
rtnl_filter_t
show_one_sock
)
{
int
fd
;
char
buf
[
16384
]
;
int
ret
=
-
1
;
struct
rtnl_handle
rth
;
if
(
(
fd
=
socket
(
AF_NETLINK
,
SOCK_RAW
,
NETLINK_INET_DIAG
))
<
0
)
if
(
rtnl_open_byproto
(
&
rth
,
0
,
NETLINK_SOCK_DIAG
)
)
return
-
1
;
if
(
send
(
fd
,
req
,
size
,
0
)
<
0
)
{
close
(
fd
);
return
-
1
;
}
while
(
1
)
{
ssize_t
status
;
struct
nlmsghdr
*
h
;
struct
sockaddr_nl
nladdr
;
socklen_t
slen
=
sizeof
(
nladdr
);
status
=
recvfrom
(
fd
,
buf
,
sizeof
(
buf
),
0
,
(
struct
sockaddr
*
)
&
nladdr
,
&
slen
);
if
(
status
<
0
)
{
if
(
errno
==
EINTR
)
continue
;
perror
(
"OVERRUN"
);
continue
;
}
if
(
status
==
0
)
{
fprintf
(
stderr
,
"EOF on netlink
\n
"
);
goto
close_it
;
}
if
(
dump_fp
)
fwrite
(
buf
,
1
,
NLMSG_ALIGN
(
status
),
dump_fp
);
rth
.
dump
=
MAGIC_SEQ
;
h
=
(
struct
nlmsghdr
*
)
buf
;
while
(
NLMSG_OK
(
h
,
status
))
{
int
err
;
if
(
/*h->nlmsg_pid != rth->local.nl_pid ||*/
h
->
nlmsg_seq
!=
123456
)
goto
skip_it
;
if
(
rtnl_send
(
&
rth
,
req
,
size
)
<
0
)
goto
Exit
;
if
(
h
->
nlmsg_type
==
NLMSG_DONE
)
goto
close_
it
;
if
(
rtnl_dump_filter
(
&
rth
,
show_one_sock
,
f
)
)
goto
Ex
it
;
if
(
h
->
nlmsg_type
==
NLMSG_ERROR
)
{
struct
nlmsgerr
*
err
=
(
struct
nlmsgerr
*
)
NLMSG_DATA
(
h
);
if
(
h
->
nlmsg_len
<
NLMSG_LENGTH
(
sizeof
(
struct
nlmsgerr
)))
{
fprintf
(
stderr
,
"ERROR truncated
\n
"
);
}
else
{
errno
=
-
err
->
error
;
if
(
errno
!=
ENOENT
)
fprintf
(
stderr
,
"DIAG answers %d
\n
"
,
errno
);
}
close
(
fd
);
return
-
1
;
}
if
(
!
dump_fp
)
{
err
=
show_one_sock
(
h
,
f
);
if
(
err
<
0
)
{
close
(
fd
);
return
err
;
}
}
skip_it:
h
=
NLMSG_NEXT
(
h
,
status
);
}
if
(
status
)
{
fprintf
(
stderr
,
"!!!Remnant of size %zd
\n
"
,
status
);
exit
(
1
);
}
}
close_it:
close
(
fd
);
return
0
;
ret
=
0
;
Exit:
rtnl_close
(
&
rth
);
return
ret
;
}
static
int
unix_show_netlink
(
struct
filter
*
f
,
FILE
*
dump_fp
)
static
int
unix_show_netlink
(
struct
filter
*
f
)
{
DIAG_REQUEST
(
req
,
struct
unix_diag_req
r
);
...
...
@@ -2605,8 +2539,7 @@ static int unix_show_netlink(struct filter *f, FILE *dump_fp)
if
(
show_mem
)
req
.
r
.
udiag_show
|=
UDIAG_SHOW_MEMINFO
;
return
handle_netlink_request
(
f
,
dump_fp
,
&
req
.
nlh
,
sizeof
(
req
),
unix_show_sock
);
return
handle_netlink_request
(
f
,
&
req
.
nlh
,
sizeof
(
req
),
unix_show_sock
);
}
static
int
unix_show
(
struct
filter
*
f
)
...
...
@@ -2619,7 +2552,7 @@ static int unix_show(struct filter *f)
struct
unixstat
*
list
=
NULL
;
if
(
!
getenv
(
"PROC_NET_UNIX"
)
&&
!
getenv
(
"PROC_ROOT"
)
&&
unix_show_netlink
(
f
,
NULL
)
==
0
)
&&
unix_show_netlink
(
f
)
==
0
)
return
0
;
if
((
fp
=
net_unix_open
())
==
NULL
)
...
...
@@ -2693,7 +2626,8 @@ static int unix_show(struct filter *f)
return
0
;
}
static
int
packet_show_sock
(
struct
nlmsghdr
*
nlh
,
struct
filter
*
f
)
static
int
packet_show_sock
(
const
struct
sockaddr_nl
*
addr
,
struct
nlmsghdr
*
nlh
,
void
*
arg
)
{
struct
packet_diag_msg
*
r
=
NLMSG_DATA
(
nlh
);
struct
rtattr
*
tb
[
PACKET_DIAG_MAX
+
1
];
...
...
@@ -2786,15 +2720,14 @@ static int packet_show_sock(struct nlmsghdr *nlh, struct filter *f)
return
0
;
}
static
int
packet_show_netlink
(
struct
filter
*
f
,
FILE
*
dump_fp
)
static
int
packet_show_netlink
(
struct
filter
*
f
)
{
DIAG_REQUEST
(
req
,
struct
packet_diag_req
r
);
req
.
r
.
sdiag_family
=
AF_PACKET
;
req
.
r
.
pdiag_show
=
PACKET_SHOW_INFO
|
PACKET_SHOW_MEMINFO
|
PACKET_SHOW_FILTER
;
return
handle_netlink_request
(
f
,
dump_fp
,
&
req
.
nlh
,
sizeof
(
req
),
packet_show_sock
);
return
handle_netlink_request
(
f
,
&
req
.
nlh
,
sizeof
(
req
),
packet_show_sock
);
}
...
...
@@ -2811,7 +2744,7 @@ static int packet_show(struct filter *f)
int
ino
;
unsigned
long
long
sk
;
if
(
packet_show_netlink
(
f
,
NULL
)
==
0
)
if
(
packet_show_netlink
(
f
)
==
0
)
return
0
;
if
((
fp
=
net_packet_open
())
==
NULL
)
...
...
@@ -2912,10 +2845,11 @@ static void netlink_show_one(struct filter *f,
printf
(
"%-*s "
,
state_width
,
"UNCONN"
);
printf
(
"%-6d %-6d "
,
rq
,
wq
);
if
(
resolve_services
)
{
if
(
resolve_services
)
{
printf
(
"%*s:"
,
addr_width
,
nl_proto_n2a
(
prot
,
prot_name
,
sizeof
(
prot_name
)));
}
else
{
printf
(
"%*d:"
,
addr_width
,
prot
);
}
if
(
pid
==
-
1
)
{
...
...
@@ -2947,10 +2881,10 @@ static void netlink_show_one(struct filter *f,
if
(
state
==
NETLINK_CONNECTED
)
{
printf
(
"%*d:%-*d"
,
paddr_width
,
dst_group
,
p
serv_width
,
dst_pid
);
addr_width
,
dst_group
,
serv_width
,
dst_pid
);
}
else
{
printf
(
"%*s*%-*s"
,
paddr_width
,
""
,
p
serv_width
,
""
);
addr_width
,
""
,
serv_width
,
""
);
}
char
*
pid_context
=
NULL
;
...
...
@@ -2982,8 +2916,10 @@ static void netlink_show_one(struct filter *f,
return
;
}
static
int
netlink_show_sock
(
struct
nlmsghdr
*
nlh
,
struct
filter
*
f
)
static
int
netlink_show_sock
(
const
struct
sockaddr_nl
*
addr
,
struct
nlmsghdr
*
nlh
,
void
*
arg
)
{
struct
filter
*
f
=
(
struct
filter
*
)
arg
;
struct
netlink_diag_msg
*
r
=
NLMSG_DATA
(
nlh
);
struct
rtattr
*
tb
[
NETLINK_DIAG_MAX
+
1
];
int
rq
=
0
,
wq
=
0
;
...
...
@@ -3016,7 +2952,7 @@ static int netlink_show_sock(struct nlmsghdr *nlh, struct filter *f)
return
0
;
}
static
int
netlink_show_netlink
(
struct
filter
*
f
,
FILE
*
dump_fp
)
static
int
netlink_show_netlink
(
struct
filter
*
f
)
{
DIAG_REQUEST
(
req
,
struct
netlink_diag_req
r
);
...
...
@@ -3024,8 +2960,7 @@ static int netlink_show_netlink(struct filter *f, FILE *dump_fp)
req
.
r
.
sdiag_protocol
=
NDIAG_PROTO_ALL
;
req
.
r
.
ndiag_show
=
NDIAG_SHOW_GROUPS
|
NDIAG_SHOW_MEMINFO
;
return
handle_netlink_request
(
f
,
dump_fp
,
&
req
.
nlh
,
sizeof
(
req
),
netlink_show_sock
);
return
handle_netlink_request
(
f
,
&
req
.
nlh
,
sizeof
(
req
),
netlink_show_sock
);
}
static
int
netlink_show
(
struct
filter
*
f
)
...
...
@@ -3038,7 +2973,7 @@ static int netlink_show(struct filter *f)
unsigned
long
long
sk
,
cb
;
if
(
!
getenv
(
"PROC_NET_NETLINK"
)
&&
!
getenv
(
"PROC_ROOT"
)
&&
netlink_show_netlink
(
f
,
NULL
)
==
0
)
netlink_show_netlink
(
f
)
==
0
)
return
0
;
if
((
fp
=
net_netlink_open
())
==
NULL
)
...
...
@@ -3684,22 +3619,13 @@ int main(int argc, char *argv[])
printf
(
"%-*s "
,
state_width
,
"State"
);
printf
(
"%-6s %-6s "
,
"Recv-Q"
,
"Send-Q"
);
paddr_width
=
addr_width
;
pserv_width
=
serv_width
;
/* Netlink service column can be resolved as process name/pid thus it
* can be much wider than address column which is just a
* protocol name/id.
*/
if
(
current_filter
.
dbs
&
(
1
<<
NETLINK_DB
))
{
serv_width
=
addr_width
-
10
;
paddr_width
=
13
;
pserv_width
=
13
;
}
/* Make enough space for the local/remote port field */
addr_width
-=
13
;
serv_width
+=
13
;
printf
(
"%*s:%-*s %*s:%-*s
\n
"
,
addr_width
,
"Local Address"
,
serv_width
,
"Port"
,
paddr_width
,
"Peer Address"
,
p
serv_width
,
"Port"
);
addr_width
,
"Peer Address"
,
serv_width
,
"Port"
);
fflush
(
stdout
);
...
...
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