busybox/networking/ip.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   4 *
   5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
   6 *
   7 * Changes:
   8 * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
   9 * Bernhard Reutner-Fischer rewrote to use index_in_substr_array
  10 */
  11
  12/* would need to make the " | " optional depending on more than one selected: */
  13//usage:#define ip_trivial_usage
  14//usage:       "[OPTIONS] {"
  15//usage:        IF_FEATURE_IP_ADDRESS("address | ")
  16//usage:        IF_FEATURE_IP_ROUTE("route | ")
  17//usage:        IF_FEATURE_IP_LINK("link | ")
  18//usage:        IF_FEATURE_IP_TUNNEL("tunnel | ")
  19//usage:        IF_FEATURE_IP_RULE("rule")
  20//usage:       "} {COMMAND}"
  21//usage:#define ip_full_usage "\n\n"
  22//usage:       "ip [OPTIONS] OBJECT {COMMAND}\n"
  23//usage:       "where OBJECT := {"
  24//usage:        IF_FEATURE_IP_ADDRESS("address | ")
  25//usage:        IF_FEATURE_IP_ROUTE("route | ")
  26//usage:        IF_FEATURE_IP_LINK("link | ")
  27//usage:        IF_FEATURE_IP_TUNNEL("tunnel | ")
  28//usage:        IF_FEATURE_IP_RULE("rule")
  29//usage:       "}\n"
  30//usage:       "OPTIONS := { -f[amily] { inet | inet6 | link } | -o[neline] }"
  31//usage:
  32//usage:#define ipaddr_trivial_usage
  33//usage:       "{ {add|del} IFADDR dev STRING | {show|flush}\n"
  34//usage:       "                [dev STRING] [to PREFIX] }"
  35//usage:#define ipaddr_full_usage "\n\n"
  36//usage:       "ipaddr {add|change|replace|delete} IFADDR dev STRING\n"
  37//usage:       "ipaddr {show|flush} [dev STRING] [scope SCOPE-ID]\n"
  38//usage:       "        [to PREFIX] [label PATTERN]\n"
  39//usage:       "        IFADDR := PREFIX | ADDR peer PREFIX\n"
  40//usage:       "        [broadcast ADDR] [anycast ADDR]\n"
  41//usage:       "        [label STRING] [scope SCOPE-ID]\n"
  42//usage:       "        SCOPE-ID := [host | link | global | NUMBER]"
  43//usage:
  44//usage:#define iplink_trivial_usage
  45//usage:       "{ set DEVICE { up | down | arp { on | off } | show [DEVICE] }"
  46//usage:#define iplink_full_usage "\n\n"
  47//usage:       "iplink set DEVICE { up | down | arp | multicast { on | off } |\n"
  48//usage:       "                        dynamic { on | off } |\n"
  49//usage:       "                        mtu MTU }\n"
  50//usage:       "iplink show [DEVICE]"
  51//usage:
  52//usage:#define iproute_trivial_usage
  53//usage:       "{ list | flush | add | del | change | append |\n"
  54//usage:       "                replace | test } ROUTE"
  55//usage:#define iproute_full_usage "\n\n"
  56//usage:       "iproute { list | flush } SELECTOR\n"
  57//usage:       "iproute get ADDRESS [from ADDRESS iif STRING]\n"
  58//usage:       "        [oif STRING] [tos TOS]\n"
  59//usage:       "iproute { add | del | change | append | replace | test } ROUTE\n"
  60//usage:       "        SELECTOR := [root PREFIX] [match PREFIX] [proto RTPROTO]\n"
  61//usage:       "        ROUTE := [TYPE] PREFIX [tos TOS] [proto RTPROTO] [metric METRIC]"
  62//usage:
  63//usage:#define iprule_trivial_usage
  64//usage:       "{[list | add | del] RULE}"
  65//usage:#define iprule_full_usage "\n\n"
  66//usage:       "iprule [list | add | del] SELECTOR ACTION\n"
  67//usage:       "        SELECTOR := [from PREFIX] [to PREFIX] [tos TOS] [fwmark FWMARK]\n"
  68//usage:       "                        [dev STRING] [pref NUMBER]\n"
  69//usage:       "        ACTION := [table TABLE_ID] [nat ADDRESS]\n"
  70//usage:       "                        [prohibit | reject | unreachable]\n"
  71//usage:       "                        [realms [SRCREALM/]DSTREALM]\n"
  72//usage:       "        TABLE_ID := [local | main | default | NUMBER]"
  73//usage:
  74//usage:#define iptunnel_trivial_usage
  75//usage:       "{ add | change | del | show } [NAME]\n"
  76//usage:       "        [mode { ipip | gre | sit }]\n"
  77//usage:       "        [remote ADDR] [local ADDR] [ttl TTL]"
  78//usage:#define iptunnel_full_usage "\n\n"
  79//usage:       "iptunnel { add | change | del | show } [NAME]\n"
  80//usage:       "        [mode { ipip | gre | sit }] [remote ADDR] [local ADDR]\n"
  81//usage:       "        [[i|o]seq] [[i|o]key KEY] [[i|o]csum]\n"
  82//usage:       "        [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]"
  83
  84#include "libbb.h"
  85
  86#include "libiproute/utils.h"
  87#include "libiproute/ip_common.h"
  88
  89#if ENABLE_FEATURE_IP_ADDRESS \
  90 || ENABLE_FEATURE_IP_ROUTE \
  91 || ENABLE_FEATURE_IP_LINK \
  92 || ENABLE_FEATURE_IP_TUNNEL \
  93 || ENABLE_FEATURE_IP_RULE
  94
  95static int FAST_FUNC ip_print_help(char **argv UNUSED_PARAM)
  96{
  97        bb_show_usage();
  98}
  99
 100typedef int FAST_FUNC (*ip_func_ptr_t)(char**);
 101
 102static int ip_do(ip_func_ptr_t ip_func, char **argv)
 103{
 104        argv = ip_parse_common_args(argv + 1);
 105        return ip_func(argv);
 106}
 107
 108#if ENABLE_FEATURE_IP_ADDRESS
 109int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 110int ipaddr_main(int argc UNUSED_PARAM, char **argv)
 111{
 112        return ip_do(do_ipaddr, argv);
 113}
 114#endif
 115#if ENABLE_FEATURE_IP_LINK
 116int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 117int iplink_main(int argc UNUSED_PARAM, char **argv)
 118{
 119        return ip_do(do_iplink, argv);
 120}
 121#endif
 122#if ENABLE_FEATURE_IP_ROUTE
 123int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 124int iproute_main(int argc UNUSED_PARAM, char **argv)
 125{
 126        return ip_do(do_iproute, argv);
 127}
 128#endif
 129#if ENABLE_FEATURE_IP_RULE
 130int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 131int iprule_main(int argc UNUSED_PARAM, char **argv)
 132{
 133        return ip_do(do_iprule, argv);
 134}
 135#endif
 136#if ENABLE_FEATURE_IP_TUNNEL
 137int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 138int iptunnel_main(int argc UNUSED_PARAM, char **argv)
 139{
 140        return ip_do(do_iptunnel, argv);
 141}
 142#endif
 143
 144
 145int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 146int ip_main(int argc UNUSED_PARAM, char **argv)
 147{
 148        static const char keywords[] ALIGN1 =
 149                IF_FEATURE_IP_ADDRESS("address\0")
 150                IF_FEATURE_IP_ROUTE("route\0")
 151                IF_FEATURE_IP_ROUTE("r\0")
 152                IF_FEATURE_IP_LINK("link\0")
 153                IF_FEATURE_IP_TUNNEL("tunnel\0")
 154                IF_FEATURE_IP_TUNNEL("tunl\0")
 155                IF_FEATURE_IP_RULE("rule\0")
 156                ;
 157        static const ip_func_ptr_t ip_func_ptrs[] = {
 158                ip_print_help,
 159                IF_FEATURE_IP_ADDRESS(do_ipaddr,)
 160                IF_FEATURE_IP_ROUTE(do_iproute,)
 161                IF_FEATURE_IP_ROUTE(do_iproute,)
 162                IF_FEATURE_IP_LINK(do_iplink,)
 163                IF_FEATURE_IP_TUNNEL(do_iptunnel,)
 164                IF_FEATURE_IP_TUNNEL(do_iptunnel,)
 165                IF_FEATURE_IP_RULE(do_iprule,)
 166        };
 167        ip_func_ptr_t ip_func;
 168        int key;
 169
 170        argv = ip_parse_common_args(argv + 1);
 171        key = *argv ? index_in_substrings(keywords, *argv++) : -1;
 172        ip_func = ip_func_ptrs[key + 1];
 173
 174        return ip_func(argv);
 175}
 176
 177#endif /* any of ENABLE_FEATURE_IP_xxx is 1 */
 178