iproute2/ip/link_xfrm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * link_xfrm.c  Virtual XFRM Interface driver module
   4 *
   5 * Authors:     Matt Ellison <matt@arroyo.io>
   6 */
   7
   8#include <string.h>
   9#include <linux/if_link.h>
  10
  11#include "rt_names.h"
  12#include "utils.h"
  13#include "ip_common.h"
  14#include "tunnel.h"
  15
  16static void xfrm_print_help(struct link_util *lu, int argc, char **argv,
  17                            FILE *f)
  18{
  19        fprintf(f,
  20                "Usage: ... %-4s dev [ PHYS_DEV ] [ if_id IF-ID ]\n"
  21                "\n"
  22                "Where: IF-ID := { 0x0..0xffffffff }\n",
  23                lu->id);
  24}
  25
  26static int xfrm_parse_opt(struct link_util *lu, int argc, char **argv,
  27                          struct nlmsghdr *n)
  28{
  29        unsigned int link = 0;
  30        __u32 if_id = 0;
  31
  32        while (argc > 0) {
  33                if (!matches(*argv, "dev")) {
  34                        NEXT_ARG();
  35                        link = ll_name_to_index(*argv);
  36                        if (!link)
  37                                exit(nodev(*argv));
  38                } else if (!matches(*argv, "if_id")) {
  39                        NEXT_ARG();
  40                        if (get_u32(&if_id, *argv, 0))
  41                                invarg("if_id value is invalid", *argv);
  42                        else
  43                                addattr32(n, 1024, IFLA_XFRM_IF_ID, if_id);
  44                } else {
  45                        xfrm_print_help(lu, argc, argv, stderr);
  46                        return -1;
  47                }
  48                argc--; argv++;
  49        }
  50
  51        if (link)
  52                addattr32(n, 1024, IFLA_XFRM_LINK, link);
  53
  54        return 0;
  55}
  56
  57static void xfrm_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
  58{
  59
  60        if (!tb)
  61                return;
  62
  63        if (tb[IFLA_XFRM_IF_ID]) {
  64                __u32 id = rta_getattr_u32(tb[IFLA_XFRM_IF_ID]);
  65
  66                print_0xhex(PRINT_ANY, "if_id", "if_id %#llx ", id);
  67
  68        }
  69
  70}
  71
  72struct link_util xfrm_link_util = {
  73        .id = "xfrm",
  74        .maxattr = IFLA_XFRM_MAX,
  75        .parse_opt = xfrm_parse_opt,
  76        .print_opt = xfrm_print_opt,
  77        .print_help = xfrm_print_help,
  78};
  79