Home | History | Annotate | Download | only in ip
      1 /* iplink_vrf.c	VRF device support
      2  *
      3  *              This program is free software; you can redistribute it and/or
      4  *              modify it under the terms of the GNU General Public License
      5  *              as published by the Free Software Foundation; either version
      6  *              2 of the License, or (at your option) any later version.
      7  *
      8  * Authors:     Shrijeet Mukherjee <shm (at) cumulusnetworks.com>
      9  */
     10 
     11 #include <stdio.h>
     12 #include <stdlib.h>
     13 #include <string.h>
     14 #include <sys/socket.h>
     15 #include <linux/if_link.h>
     16 
     17 #include "rt_names.h"
     18 #include "utils.h"
     19 #include "ip_common.h"
     20 
     21 static void vrf_explain(FILE *f)
     22 {
     23 	fprintf(f, "Usage: ... vrf table TABLEID \n");
     24 }
     25 
     26 static void explain(void)
     27 {
     28 	vrf_explain(stderr);
     29 }
     30 
     31 static int vrf_parse_opt(struct link_util *lu, int argc, char **argv,
     32 			    struct nlmsghdr *n)
     33 {
     34 	while (argc > 0) {
     35 		if (matches(*argv, "table") == 0) {
     36 			__u32 table;
     37 
     38 			NEXT_ARG();
     39 
     40 			if (rtnl_rttable_a2n(&table, *argv))
     41 				invarg("invalid table ID\n", *argv);
     42 			addattr32(n, 1024, IFLA_VRF_TABLE, table);
     43 		} else if (matches(*argv, "help") == 0) {
     44 			explain();
     45 			return -1;
     46 		} else {
     47 			fprintf(stderr, "vrf: unknown option \"%s\"?\n",
     48 				*argv);
     49 			explain();
     50 			return -1;
     51 		}
     52 		argc--, argv++;
     53 	}
     54 
     55 	return 0;
     56 }
     57 
     58 static void vrf_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
     59 {
     60 	if (!tb)
     61 		return;
     62 
     63 	if (tb[IFLA_VRF_TABLE])
     64 		fprintf(f, "table %u ", rta_getattr_u32(tb[IFLA_VRF_TABLE]));
     65 }
     66 
     67 static void vrf_print_help(struct link_util *lu, int argc, char **argv,
     68 			      FILE *f)
     69 {
     70 	vrf_explain(f);
     71 }
     72 
     73 struct link_util vrf_link_util = {
     74 	.id		= "vrf",
     75 	.maxattr	= IFLA_VRF_MAX,
     76 	.parse_opt	= vrf_parse_opt,
     77 	.print_opt	= vrf_print_opt,
     78 	.print_help	= vrf_print_help,
     79 };
     80