nl-route-add.c revision 10cf5a586c149fdb7e2639000dbfae5e6f8522a5
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/* 2535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf * src/nl-route-add.c Route addition utility 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * This library is free software; you can redistribute it and/or 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * modify it under the terms of the GNU Lesser General Public 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * License as published by the Free Software Foundation version 2.1 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * of the License. 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 9535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 12535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf#include "route-utils.h" 13535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 14a948e082ea1d9457057296f65e5d72708cd5e768Thomas Grafstatic int quiet = 0; 15535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Grafstatic struct nl_cache *link_cache, *route_cache; 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf 1744d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void print_usage(void) 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf printf( 20a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf "Usage: nl-route-add [OPTION]... [ROUTE]\n" 21a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf "\n" 22a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf "Options\n" 23a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " -q, --quiet Do not print informal notifications\n" 24a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " -h, --help Show this help\n" 25a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " -v, --version Show versioning information\n" 26535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf "\n" 27a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf "Route Options\n" 28535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " -d, --dst=ADDR destination prefix, e.g. 10.10.0.0/16\n" 29a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " -n, --nexthop=NH nexthop configuration:\n" 30535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " dev=DEV route via device\n" 31535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " weight=WEIGHT weight of nexthop\n" 32535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " flags=FLAGS\n" 33535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " via=GATEWAY route via other node\n" 34535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " realms=REALMS\n" 35535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf " e.g. dev=eth0,via=192.168.1.12\n" 36a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " -t, --table=TABLE Routing table\n" 37a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --family=FAMILY Address family\n" 38a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --src=ADDR Source prefix\n" 39a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --iif=DEV Incomming interface\n" 40a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --pref-src=ADDR Preferred source address\n" 41a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --metrics=OPTS Metrics configurations\n" 42a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --priority=NUM Priotity\n" 43a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --scope=SCOPE Scope\n" 44a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --protocol=PROTO Protocol\n" 45a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf " --type=TYPE { unicast | local | broadcast | multicast }\n" 46a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ); 47a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf exit(0); 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf 5044d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[]) 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 5210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf struct nl_handle *sock; 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtnl_route *route; 54a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf struct nl_dump_params dp = { 55a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf .dp_type = NL_DUMP_ONELINE, 56a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf .dp_fd = stdout, 57a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf }; 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf int err = 1; 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf 6010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf sock = nlt_alloc_socket(); 6110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf nlt_connect(sock, NETLINK_ROUTE); 6210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf link_cache = nlt_alloc_link_cache(sock); 6310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf route_cache = nlt_alloc_route_cache(sock, 0); 6410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf route = nlt_alloc_route(); 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf 66535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf for (;;) { 67535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf int c, optidx = 0; 68a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf enum { 69a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_FAMILY = 257, 70a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_SRC = 258, 71a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_IIF, 72a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_PREF_SRC, 73a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_METRICS, 74a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_PRIORITY, 75a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_SCOPE, 76a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_PROTOCOL, 77a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf ARG_TYPE, 78a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf }; 79535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf static struct option long_opts[] = { 80a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "quiet", 0, 0, 'q' }, 81a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "help", 0, 0, 'h' }, 82a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "version", 0, 0, 'v' }, 83535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf { "dst", 1, 0, 'd' }, 84a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "nexthop", 1, 0, 'n' }, 85535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf { "table", 1, 0, 't' }, 86a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "family", 1, 0, ARG_FAMILY }, 87a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "src", 1, 0, ARG_SRC }, 88a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "iif", 1, 0, ARG_IIF }, 89a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "pref-src", 1, 0, ARG_PREF_SRC }, 90a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "metrics", 1, 0, ARG_METRICS }, 91a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "priority", 1, 0, ARG_PRIORITY }, 92a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "scope", 1, 0, ARG_SCOPE }, 93a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "protocol", 1, 0, ARG_PROTOCOL }, 94a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf { "type", 1, 0, ARG_TYPE }, 95535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf { 0, 0, 0, 0 } 96535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf }; 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf 98a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf c = getopt_long(argc, argv, "qhvd:n:t:", long_opts, &optidx); 99535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf if (c == -1) 100535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf break; 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf 102535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf switch (c) { 103a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case 'q': quiet = 1; break; 104a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case 'h': print_usage(); break; 10510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf case 'v': nlt_print_version(); break; 106535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf case 'd': parse_dst(route, optarg); break; 107535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf case 'n': parse_nexthop(route, optarg, link_cache); break; 108535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf case 't': parse_table(route, optarg); break; 109a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_FAMILY: parse_family(route, optarg); break; 110a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_SRC: parse_src(route, optarg); break; 111a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_IIF: parse_iif(route, optarg, link_cache); break; 112a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_PREF_SRC: parse_pref_src(route, optarg); break; 113a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_METRICS: parse_metric(route, optarg); break; 114a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_PRIORITY: parse_prio(route, optarg); break; 115a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_SCOPE: parse_scope(route, optarg); break; 116a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_PROTOCOL: parse_protocol(route, optarg); break; 117a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf case ARG_TYPE: parse_type(route, optarg); break; 118535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf } 119535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf } 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf 12110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf if ((err = rtnl_route_add(sock, route, 0)) < 0) 12210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf fatal(err, "Unable to add route: %s", nl_geterror(err)); 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf 124a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf if (!quiet) { 125a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf printf("Added "); 126a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf nl_object_dump(OBJ_CAST(route), &dp); 127a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf } 128a948e082ea1d9457057296f65e5d72708cd5e768Thomas Graf 12910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf return 0; 13044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 131