]>
git.proxmox.com Git - mirror_iproute2.git/blob - ip/xfrm_monitor.c
b4fda02a875aa5f99e369f33b5901a7708a067f3
4 * Copyright (C)2005 USAGI/WIDE Project
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * based on ipmonitor.c
25 * Masahide NAKAMURA @USAGI
31 #include <linux/xfrm.h>
34 #include "ip_common.h"
36 static void usage(void) __attribute__((noreturn
));
38 static void usage(void)
40 fprintf(stderr
, "Usage: ip xfrm monitor [ all | LISTofOBJECTS ]\n");
44 static int xfrm_acquire_print(const struct sockaddr_nl
*who
,
45 struct nlmsghdr
*n
, void *arg
)
47 FILE *fp
= (FILE*)arg
;
48 struct xfrm_user_acquire
*xacq
= NLMSG_DATA(n
);
49 int len
= n
->nlmsg_len
;
50 struct rtattr
* tb
[XFRMA_MAX
+1];
53 if (n
->nlmsg_type
!= XFRM_MSG_ACQUIRE
) {
54 fprintf(stderr
, "Not an acquire: %08x %08x %08x\n",
55 n
->nlmsg_len
, n
->nlmsg_type
, n
->nlmsg_flags
);
59 len
-= NLMSG_LENGTH(sizeof(*xacq
));
61 fprintf(stderr
, "BUG: wrong nlmsg len %d\n", len
);
65 parse_rtattr(tb
, XFRMA_MAX
, XFRMACQ_RTA(xacq
), len
);
67 family
= xacq
->sel
.family
;
68 if (family
== AF_UNSPEC
)
69 family
= xacq
->policy
.sel
.family
;
70 if (family
== AF_UNSPEC
)
71 family
= preferred_family
;
73 fprintf(fp
, "acquire ");
75 fprintf(fp
, "proto %s ", strxf_xfrmproto(xacq
->id
.proto
));
76 if (show_stats
> 0 || xacq
->id
.spi
) {
77 __u32 spi
= ntohl(xacq
->id
.spi
);
78 fprintf(fp
, "spi 0x%08x", spi
);
80 fprintf(fp
, "(%u)", spi
);
83 fprintf(fp
, "%s", _SL_
);
85 xfrm_selector_print(&xacq
->sel
, family
, fp
, " sel ");
87 xfrm_policy_info_print(&xacq
->policy
, tb
, fp
, " ", " policy ");
90 fprintf(fp
, " seq 0x%08u ", xacq
->seq
);
92 fprintf(fp
, "%s-mask %s ",
93 strxf_algotype(XFRMA_ALG_CRYPT
),
94 strxf_mask32(xacq
->ealgos
));
95 fprintf(fp
, "%s-mask %s ",
96 strxf_algotype(XFRMA_ALG_AUTH
),
97 strxf_mask32(xacq
->aalgos
));
98 fprintf(fp
, "%s-mask %s",
99 strxf_algotype(XFRMA_ALG_COMP
),
100 strxf_mask32(xacq
->calgos
));
102 fprintf(fp
, "%s", _SL_
);
111 static int xfrm_report_print(const struct sockaddr_nl
*who
,
112 struct nlmsghdr
*n
, void *arg
)
114 FILE *fp
= (FILE*)arg
;
115 struct xfrm_user_report
*xrep
= NLMSG_DATA(n
);
116 int len
= n
->nlmsg_len
;
117 struct rtattr
* tb
[XFRMA_MAX
+1];
120 if (n
->nlmsg_type
!= XFRM_MSG_REPORT
) {
121 fprintf(stderr
, "Not a report: %08x %08x %08x\n",
122 n
->nlmsg_len
, n
->nlmsg_type
, n
->nlmsg_flags
);
126 len
-= NLMSG_LENGTH(sizeof(*xrep
));
128 fprintf(stderr
, "BUG: wrong nlmsg len %d\n", len
);
132 family
= xrep
->sel
.family
;
133 if (family
== AF_UNSPEC
)
134 family
= preferred_family
;
136 fprintf(fp
, "report ");
138 fprintf(fp
, "proto %s ", strxf_xfrmproto(xrep
->proto
));
139 fprintf(fp
, "%s", _SL_
);
141 xfrm_selector_print(&xrep
->sel
, family
, fp
, " sel ");
143 parse_rtattr(tb
, XFRMA_MAX
, XFRMREP_RTA(xrep
), len
);
145 xfrm_xfrma_print(tb
, family
, fp
, " ");
153 static int xfrm_accept_msg(const struct sockaddr_nl
*who
,
154 struct nlmsghdr
*n
, void *arg
)
156 FILE *fp
= (FILE*)arg
;
161 if (n
->nlmsg_type
== XFRM_MSG_NEWSA
||
162 n
->nlmsg_type
== XFRM_MSG_DELSA
||
163 n
->nlmsg_type
== XFRM_MSG_UPDSA
||
164 n
->nlmsg_type
== XFRM_MSG_EXPIRE
) {
165 xfrm_state_print(who
, n
, arg
);
168 if (n
->nlmsg_type
== XFRM_MSG_NEWPOLICY
||
169 n
->nlmsg_type
== XFRM_MSG_DELPOLICY
||
170 n
->nlmsg_type
== XFRM_MSG_UPDPOLICY
||
171 n
->nlmsg_type
== XFRM_MSG_POLEXPIRE
) {
172 xfrm_policy_print(who
, n
, arg
);
176 if (n
->nlmsg_type
== XFRM_MSG_ACQUIRE
) {
177 xfrm_acquire_print(who
, n
, arg
);
180 if (n
->nlmsg_type
== XFRM_MSG_FLUSHSA
) {
181 /* XXX: Todo: show proto in xfrm_usersa_flush */
182 fprintf(fp
, "Flushed state\n");
185 if (n
->nlmsg_type
== XFRM_MSG_FLUSHPOLICY
) {
186 fprintf(fp
, "Flushed policy\n");
189 if (n
->nlmsg_type
== XFRM_MSG_REPORT
) {
190 xfrm_report_print(who
, n
, arg
);
193 if (n
->nlmsg_type
!= NLMSG_ERROR
&& n
->nlmsg_type
!= NLMSG_NOOP
&&
194 n
->nlmsg_type
!= NLMSG_DONE
) {
195 fprintf(fp
, "Unknown message: %08d 0x%08x 0x%08x\n",
196 n
->nlmsg_len
, n
->nlmsg_type
, n
->nlmsg_flags
);
201 extern struct rtnl_handle rth
;
203 int do_xfrm_monitor(int argc
, char **argv
)
206 unsigned groups
= ~((unsigned)0); /* XXX */
216 if (matches(*argv
, "file") == 0) {
219 } else if (matches(*argv
, "acquire") == 0) {
222 } else if (matches(*argv
, "expire") == 0) {
225 } else if (matches(*argv
, "SA") == 0) {
228 } else if (matches(*argv
, "policy") == 0) {
231 } else if (matches(*argv
, "report") == 0) {
234 } else if (matches(*argv
, "help") == 0) {
237 fprintf(stderr
, "Argument \"%s\" is unknown, try \"ip xfrm monitor help\".\n", *argv
);
244 groups
|= XFRMGRP_ACQUIRE
;
246 groups
|= XFRMGRP_EXPIRE
;
248 groups
|= XFRMGRP_SA
;
250 groups
|= XFRMGRP_POLICY
;
252 groups
|= XFRMGRP_REPORT
;
256 fp
= fopen(file
, "r");
258 perror("Cannot fopen");
261 return rtnl_from_file(fp
, xfrm_accept_msg
, (void*)stdout
);
266 if (rtnl_open_byproto(&rth
, groups
, NETLINK_XFRM
) < 0)
269 if (rtnl_listen(&rth
, xfrm_accept_msg
, (void*)stdout
) < 0)