}
extern int genl_resolve_family(struct rtnl_handle *grth, const char *family);
+extern int genl_init_handle(struct rtnl_handle *grth, const char *family,
+ int *genl_family);
#endif /* __LIBGENL_H__ */
int do_ipfou(int argc, char **argv)
{
- if (genl_family < 0) {
- if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) {
- fprintf(stderr, "Cannot open generic netlink socket\n");
- exit(1);
- }
-
- genl_family = genl_resolve_family(&genl_rth, FOU_GENL_NAME);
- if (genl_family < 0)
- exit(1);
- }
+ if (genl_init_handle(&genl_rth, FOU_GENL_NAME, &genl_family))
+ exit(1);
if (argc < 1)
usage();
int do_ipila(int argc, char **argv)
{
- if (genl_family < 0) {
- if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) {
- fprintf(stderr, "Cannot open generic netlink socket\n");
- exit(1);
- }
-
- genl_family = genl_resolve_family(&genl_rth, ILA_GENL_NAME);
- if (genl_family < 0)
- exit(1);
- }
+ if (genl_init_handle(&genl_rth, ILA_GENL_NAME, &genl_family))
+ exit(1);
if (argc < 1)
usage();
if (argc < 1 || !matches(*argv, "help"))
usage();
- if (genl_family < 0) {
- if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) {
- fprintf(stderr, "Cannot open generic netlink socket\n");
- exit(1);
- }
-
- genl_family = genl_resolve_family(&genl_rth, L2TP_GENL_NAME);
- if (genl_family < 0)
- exit(1);
- }
+ if (genl_init_handle(&genl_rth, L2TP_GENL_NAME, &genl_family))
+ exit(1);
if (matches(*argv, "add") == 0)
return do_add(argc-1, argv+1);
_cmd, _flags)
-static void init_genl(void)
-{
- if (genl_family >= 0)
- return;
-
- if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) {
- fprintf(stderr, "Cannot open generic netlink socket\n");
- exit(1);
- }
-
- genl_family = genl_resolve_family(&genl_rth, MACSEC_GENL_NAME);
- if (genl_family < 0)
- exit(1);
-}
-
static void ipmacsec_usage(void)
{
fprintf(stderr, "Usage: ip macsec add DEV tx sa { 0..3 } [ OPTS ] key ID KEY\n");
int do_ipmacsec(int argc, char **argv)
{
- init_genl();
+ if (genl_init_handle(&genl_rth, MACSEC_GENL_NAME, &genl_family))
+ exit(1);
if (argc < 1)
ipmacsec_usage();
ack = 0;
}
- if (genl_family < 0) {
- if (rtnl_open_byproto(&grth, 0, NETLINK_GENERIC) < 0) {
- fprintf(stderr, "Cannot open generic netlink socket\n");
- exit(1);
- }
- genl_family = genl_resolve_family(&grth,
- TCP_METRICS_GENL_NAME);
- if (genl_family < 0)
- exit(1);
- req.n.nlmsg_type = genl_family;
- }
+ if (genl_init_handle(&grth, TCP_METRICS_GENL_NAME, &genl_family))
+ exit(1);
+ req.n.nlmsg_type = genl_family;
if (!(cmd & CMD_FLUSH) && (atype >= 0 || (cmd & CMD_DEL))) {
if (ack)
return genl_parse_getfamily(&req.n);
}
+
+int genl_init_handle(struct rtnl_handle *grth, const char *family,
+ int *genl_family)
+{
+ if (*genl_family >= 0)
+ return 0;
+
+ if (rtnl_open_byproto(grth, 0, NETLINK_GENERIC) < 0) {
+ fprintf(stderr, "Cannot open generic netlink socket\n");
+ return -1;
+ }
+
+ *genl_family = genl_resolve_family(grth, family);
+ if (*genl_family < 0)
+ return -1;
+
+ return 0;
+}