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//config:config IP
  12//config:       bool "ip (34 kb)"
  13//config:       default y
  14//config:       select PLATFORM_LINUX
  15//config:       help
  16//config:       The "ip" applet is a TCP/IP interface configuration and routing
  17//config:       utility.
  18//config:       Short forms (enabled below) are busybox-specific extensions.
  19//config:       The standard "ip" utility does not provide them. If you are
  20//config:       trying to be portable, it's better to use "ip CMD" forms.
  21//config:
  22//config:config IPADDR
  23//config:       bool "ipaddr (14 kb)"
  24//config:       default y
  25//config:       select FEATURE_IP_ADDRESS
  26//config:       select PLATFORM_LINUX
  27//config:       help
  28//config:       Short form of "ip addr"
  29//config:
  30//config:config IPLINK
  31//config:       bool "iplink (16 kb)"
  32//config:       default y
  33//config:       select FEATURE_IP_LINK
  34//config:       select PLATFORM_LINUX
  35//config:       help
  36//config:       Short form of "ip link"
  37//config:
  38//config:config IPROUTE
  39//config:       bool "iproute (15 kb)"
  40//config:       default y
  41//config:       select FEATURE_IP_ROUTE
  42//config:       select PLATFORM_LINUX
  43//config:       help
  44//config:       Short form of "ip route"
  45//config:
  46//config:config IPTUNNEL
  47//config:       bool "iptunnel (9.6 kb)"
  48//config:       default y
  49//config:       select FEATURE_IP_TUNNEL
  50//config:       select PLATFORM_LINUX
  51//config:       help
  52//config:       Short form of "ip tunnel"
  53//config:
  54//config:config IPRULE
  55//config:       bool "iprule (10 kb)"
  56//config:       default y
  57//config:       select FEATURE_IP_RULE
  58//config:       select PLATFORM_LINUX
  59//config:       help
  60//config:       Short form of "ip rule"
  61//config:
  62//config:config IPNEIGH
  63//config:       bool "ipneigh (8.3 kb)"
  64//config:       default y
  65//config:       select FEATURE_IP_NEIGH
  66//config:       select PLATFORM_LINUX
  67//config:       help
  68//config:       Short form of "ip neigh"
  69//config:
  70//config:config FEATURE_IP_ADDRESS
  71//config:       bool "ip address"
  72//config:       default y
  73//config:       depends on IP || IPADDR
  74//config:       help
  75//config:       Address manipulation support for the "ip" applet.
  76//config:
  77//config:config FEATURE_IP_LINK
  78//config:       bool "ip link"
  79//config:       default y
  80//config:       depends on IP || IPLINK
  81//config:       help
  82//config:       Configure network devices with "ip".
  83//config:
  84//config:config FEATURE_IP_ROUTE
  85//config:       bool "ip route"
  86//config:       default y
  87//config:       depends on IP || IPROUTE
  88//config:       help
  89//config:       Add support for routing table management to "ip".
  90//config:
  91//config:config FEATURE_IP_ROUTE_DIR
  92//config:       string "ip route configuration directory"
  93//config:       default "/etc/iproute2"
  94//config:       depends on FEATURE_IP_ROUTE
  95//config:       help
  96//config:       Location of the "ip" applet routing configuration.
  97//config:
  98//config:config FEATURE_IP_TUNNEL
  99//config:       bool "ip tunnel"
 100//config:       default y
 101//config:       depends on IP || IPTUNNEL
 102//config:       help
 103//config:       Add support for tunneling commands to "ip".
 104//config:
 105//config:config FEATURE_IP_RULE
 106//config:       bool "ip rule"
 107//config:       default y
 108//config:       depends on IP || IPRULE
 109//config:       help
 110//config:       Add support for rule commands to "ip".
 111//config:
 112//config:config FEATURE_IP_NEIGH
 113//config:       bool "ip neighbor"
 114//config:       default y
 115//config:       depends on IP || IPNEIGH
 116//config:       help
 117//config:       Add support for neighbor commands to "ip".
 118//config:
 119//config:config FEATURE_IP_RARE_PROTOCOLS
 120//config:       bool "Support displaying rarely used link types"
 121//config:       default n
 122//config:       depends on IP || IPADDR || IPLINK || IPROUTE || IPTUNNEL || IPRULE || IPNEIGH
 123//config:       help
 124//config:       If you are not going to use links of type "frad", "econet",
 125//config:       "bif" etc, you probably don't need to enable this.
 126//config:       Ethernet, wireless, infrared, ppp/slip, ip tunnelling
 127//config:       link types are supported without this option selected.
 128
 129//applet:IF_IP(      APPLET_NOEXEC(ip      , ip      , BB_DIR_SBIN, BB_SUID_DROP, ip      ))
 130//applet:IF_IPADDR(  APPLET_NOEXEC(ipaddr  , ipaddr  , BB_DIR_SBIN, BB_SUID_DROP, ipaddr  ))
 131//applet:IF_IPLINK(  APPLET_NOEXEC(iplink  , iplink  , BB_DIR_SBIN, BB_SUID_DROP, iplink  ))
 132//applet:IF_IPROUTE( APPLET_NOEXEC(iproute , iproute , BB_DIR_SBIN, BB_SUID_DROP, iproute ))
 133//applet:IF_IPRULE(  APPLET_NOEXEC(iprule  , iprule  , BB_DIR_SBIN, BB_SUID_DROP, iprule  ))
 134//applet:IF_IPTUNNEL(APPLET_NOEXEC(iptunnel, iptunnel, BB_DIR_SBIN, BB_SUID_DROP, iptunnel))
 135//applet:IF_IPNEIGH( APPLET_NOEXEC(ipneigh , ipneigh , BB_DIR_SBIN, BB_SUID_DROP, ipneigh ))
 136
 137//kbuild:lib-$(CONFIG_IP) += ip.o
 138//kbuild:lib-$(CONFIG_IPADDR) += ip.o
 139//kbuild:lib-$(CONFIG_IPLINK) += ip.o
 140//kbuild:lib-$(CONFIG_IPROUTE) += ip.o
 141//kbuild:lib-$(CONFIG_IPRULE) += ip.o
 142//kbuild:lib-$(CONFIG_IPTUNNEL) += ip.o
 143//kbuild:lib-$(CONFIG_IPNEIGH) += ip.o
 144
 145//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
 146//usage:#define ipaddr_trivial_usage
 147//usage:       "add|del IFADDR dev IFACE | show|flush [dev IFACE] [to PREFIX]"
 148//usage:#define ipaddr_full_usage "\n\n"
 149//usage:       "ipaddr add|change|replace|delete dev IFACE IFADDR\n"
 150//usage:       "        IFADDR := PREFIX | ADDR peer PREFIX [broadcast ADDR|+|-]\n"
 151//usage:       "                [anycast ADDR] [label STRING] [scope SCOPE]\n"
 152//usage:       "        PREFIX := ADDR[/MASK]\n"
 153//usage:       "        SCOPE := [host|link|global|NUMBER]\n"
 154//usage:       "ipaddr show|flush [dev IFACE] [scope SCOPE] [to PREFIX] [label PATTERN]"
 155//usage:
 156//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
 157//usage:#define iplink_trivial_usage
 158//usage:       /*Usage:iplink*/"set IFACE [up|down] [arp on|off] [multicast on|off]\n"
 159//usage:       "        [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n"
 160//usage:       "        [master IFACE | nomaster]"
 161// * short help shows only "set" command, long help continues (with just one "\n")
 162// * and shows all other commands:
 163//usage:#define iplink_full_usage "\n"
 164//usage:       "iplink add [link IFACE] IFACE [address MAC] type TYPE [ARGS]\n"
 165//usage:       "iplink delete IFACE type TYPE [ARGS]\n"
 166//usage:       "        TYPE ARGS := vlan VLANARGS | vrf table NUM\n"
 167//usage:       "        VLANARGS := id VLANID [protocol 802.1q|802.1ad] [reorder_hdr on|off]\n"
 168//usage:       "                [gvrp on|off] [mvrp on|off] [loose_binding on|off]\n"
 169//usage:       "iplink show [IFACE]"
 170//upstream man ip-link:
 171//=====================
 172//ip link add [link DEV] [ name ] NAME
 173//                   [ txqueuelen PACKETS ]
 174//                   [ address LLADDR ]
 175//                   [ broadcast LLADDR ]
 176//                   [ mtu MTU ] [index IDX ]
 177//                   [ numtxqueues QUEUE_COUNT ]
 178//                   [ numrxqueues QUEUE_COUNT ]
 179//                   type TYPE [ ARGS ]
 180//       ip link delete { DEVICE | dev DEVICE | group DEVGROUP } type TYPE [ ARGS ]
 181//       ip link set { DEVICE | dev DEVICE | group DEVGROUP } [ { up | down } ]
 182//                      [ arp { on | off } ]
 183//                      [ dynamic { on | off } ]
 184//                      [ multicast { on | off } ]
 185//                      [ allmulticast { on | off } ]
 186//                      [ promisc { on | off } ]
 187//                      [ trailers { on | off } ]
 188//                      [ txqueuelen PACKETS ]
 189//                      [ name NEWNAME ]
 190//                      [ address LLADDR ]
 191//                      [ broadcast LLADDR ]
 192//                      [ mtu MTU ]
 193//                      [ netns { PID | NAME } ]
 194//                      [ link-netnsid ID ]
 195//            [ alias NAME ]
 196//                      [ vf NUM [ mac LLADDR ]
 197//                 [ vlan VLANID [ qos VLAN-QOS ] ]
 198//                 [ rate TXRATE ]
 199//                 [ spoofchk { on | off} ]
 200//                 [ query_rss { on | off} ]
 201//                 [ state { auto | enable | disable} ] ]
 202//                 [ trust { on | off} ] ]
 203//            [ master DEVICE ]
 204//            [ nomaster ]
 205//            [ addrgenmode { eui64 | none | stable_secret | random } ]
 206//                      [ protodown { on | off } ]
 207//       ip link show [ DEVICE | group GROUP ] [up] [master DEV] [type TYPE]
 208//       ip link help [ TYPE ]
 209//TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
 210//          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
 211//          gre | gretap | ip6gre | ip6gretap | vti | nlmon |
 212//          bond_slave | ipvlan | geneve | bridge_slave | vrf }
 213//usage:
 214//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
 215//usage:#define iproute_trivial_usage
 216//usage:       "list|flush|add|del|change|append|replace|test ROUTE"
 217//usage:#define iproute_full_usage "\n\n"
 218//usage:       "iproute list|flush SELECTOR\n"
 219//usage:       "        SELECTOR := [root PREFIX] [match PREFIX] [proto RTPROTO]\n"
 220//usage:       "        PREFIX := default|ADDR[/MASK]\n"
 221//usage:       "iproute get ADDR [from ADDR iif IFACE]\n"
 222//usage:       "        [oif IFACE] [tos TOS]\n"
 223//usage:       "iproute add|del|change|append|replace|test ROUTE\n"
 224//usage:       "        ROUTE := NODE_SPEC [INFO_SPEC]\n"
 225//usage:       "        NODE_SPEC := PREFIX"IF_FEATURE_IP_RULE(" [table TABLE_ID]")" [proto RTPROTO] [scope SCOPE] [metric METRIC]\n"
 226//usage:       "        INFO_SPEC := NH OPTIONS\n"
 227//usage:       "        NH := [via [inet|inet6] ADDR] [dev IFACE] [src ADDR] [onlink]\n"
 228//usage:       "        OPTIONS := [mtu [lock] NUM] [advmss [lock] NUM]"
 229//upstream man ip-route:
 230//======================
 231//ip route { show | flush } SELECTOR
 232//ip route save SELECTOR
 233//ip route restore
 234//ip route get ADDRESS [ from ADDRESS iif STRING  ] [ oif STRING ] [ tos TOS ]
 235//ip route { add | del | change | append | replace } ROUTE
 236//SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ]
 237//ROUTE := NODE_SPEC [ INFO_SPEC ]
 238//NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ]
 239//INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ] ...
 240//NH := [ encap ENCAP ] [ via [ FAMILY ] ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
 241// ..............................................................^ I guess [src ADDRESS] should be here
 242//FAMILY := [ inet | inet6 | ipx | dnet | mpls | bridge | link ]
 243//OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ] rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ] [ window NUMBER ] [ cwnd NUMBER ] [ ssthresh REALM ] [ realms REALM ]
 244//        [ rto_min TIME ] [ initcwnd NUMBER ] [ initrwnd NUMBER ] [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ] [ pref PREF ] [ expires TIME ]
 245//TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ]
 246//TABLE_ID := [ local | main | default | all | NUMBER ]
 247//SCOPE := [ host | link | global | NUMBER ]
 248//NHFLAGS := [ onlink | pervasive ]
 249//RTPROTO := [ kernel | boot | static | NUMBER ]
 250//FEATURES := [ ecn | ]
 251//PREF := [ low | medium | high ]
 252//ENCAP := [ MPLS | IP ]
 253//ENCAP_MPLS := mpls [ LABEL ]
 254//ENCAP_IP := ip id TUNNEL_ID dst REMOTE_IP [ tos TOS ] [ ttl TTL ]
 255//usage:
 256//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
 257//usage:#define iprule_trivial_usage
 258//usage:       "[list] | add|del SELECTOR ACTION"
 259//usage:#define iprule_full_usage "\n\n"
 260//usage:       "        SELECTOR := [from PREFIX] [to PREFIX] [tos TOS] [fwmark FWMARK]\n"
 261//usage:       "                        [dev IFACE] [pref NUMBER]\n"
 262//usage:       "        ACTION := [table TABLE_ID] [nat ADDR]\n"
 263//usage:       "                        [prohibit|reject|unreachable]\n"
 264//usage:       "                        [realms [SRCREALM/]DSTREALM]\n"
 265//usage:       "        TABLE_ID := [local|main|default|NUMBER]"
 266//usage:
 267//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
 268//usage:#define iptunnel_trivial_usage
 269//usage:       "add|change|del|show [NAME]\n"
 270//usage:       "        [mode ipip|gre|sit]\n"
 271//usage:       "        [remote ADDR] [local ADDR] [ttl TTL]"
 272//usage:#define iptunnel_full_usage "\n\n"
 273//usage:       "iptunnel add|change|del|show [NAME]\n"
 274//usage:       "        [mode ipip|gre|sit] [remote ADDR] [local ADDR]\n"
 275//usage:       "        [[i|o]seq] [[i|o]key KEY] [[i|o]csum]\n"
 276//usage:       "        [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]"
 277//usage:
 278//usage:#define ipneigh_trivial_usage
 279//usage:       "show|flush [to PREFIX] [dev DEV] [nud STATE]"
 280//usage:#define ipneigh_full_usage ""
 281//usage:
 282//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE
 283//usage:# define IP_BAR_LINK   "|"
 284//usage:#else
 285//usage:# define IP_BAR_LINK   ""
 286//usage:#endif
 287//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK
 288//usage:# define IP_BAR_TUNNEL "|"
 289//usage:#else
 290//usage:# define IP_BAR_TUNNEL ""
 291//usage:#endif
 292//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || ENABLE_FEATURE_IP_TUNNEL
 293//usage:# define IP_BAR_NEIGH  "|"
 294//usage:#else
 295//usage:# define IP_BAR_NEIGH  ""
 296//usage:#endif
 297//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || ENABLE_FEATURE_IP_TUNNEL || ENABLE_FEATURE_IP_NEIGH
 298//usage:# define IP_BAR_RULE   "|"
 299//usage:#else
 300//usage:# define IP_BAR_RULE   ""
 301//usage:#endif
 302//usage:
 303//usage:#define ip_trivial_usage
 304//usage:       "[OPTIONS] "
 305//usage:        IF_FEATURE_IP_ADDRESS("address")
 306//usage:        IF_FEATURE_IP_ROUTE(  IF_FEATURE_IP_ADDRESS("|")"route")
 307//usage:        IF_FEATURE_IP_LINK(   IP_BAR_LINK  "link")
 308//usage:        IF_FEATURE_IP_TUNNEL( IP_BAR_TUNNEL"tunnel")
 309//usage:        IF_FEATURE_IP_NEIGH(  IP_BAR_NEIGH "neigh")
 310//usage:        IF_FEATURE_IP_RULE(   IP_BAR_RULE  "rule")
 311//usage:       " [COMMAND]"
 312//usage:#define ip_full_usage "\n\n"
 313//usage:       "OPTIONS := -f[amily] inet|inet6|link | -o[neline]\n"
 314//usage:       "COMMAND :="
 315//usage:        IF_FEATURE_IP_ADDRESS("\n"
 316//usage:        "ip addr "ipaddr_trivial_usage)
 317//usage:        IF_FEATURE_IP_ROUTE("\n"
 318//usage:        "ip route "iproute_trivial_usage)
 319//usage:        IF_FEATURE_IP_LINK("\n"
 320//usage:        "ip link "iplink_trivial_usage)
 321//usage:        IF_FEATURE_IP_TUNNEL("\n"
 322//usage:        "ip tunnel "iptunnel_trivial_usage)
 323//usage:        IF_FEATURE_IP_NEIGH("\n"
 324//usage:        "ip neigh "ipneigh_trivial_usage)
 325//usage:        IF_FEATURE_IP_RULE("\n"
 326//usage:        "ip rule "iprule_trivial_usage)
 327
 328#include "libbb.h"
 329
 330#include "libiproute/utils.h"
 331#include "libiproute/ip_common.h"
 332
 333typedef int FAST_FUNC (*ip_func_ptr_t)(char**);
 334
 335#if ENABLE_IPADDR \
 336 || ENABLE_IPLINK \
 337 || ENABLE_IPROUTE \
 338 || ENABLE_IPRULE \
 339 || ENABLE_IPTUNNEL \
 340 || ENABLE_IPNEIGH
 341static int ip_do(ip_func_ptr_t ip_func, char **argv)
 342{
 343        argv = ip_parse_common_args(argv + 1);
 344        return ip_func(argv);
 345}
 346#endif
 347
 348#if ENABLE_IPADDR
 349int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 350int ipaddr_main(int argc UNUSED_PARAM, char **argv)
 351{
 352        return ip_do(do_ipaddr, argv);
 353}
 354#endif
 355#if ENABLE_IPLINK
 356int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 357int iplink_main(int argc UNUSED_PARAM, char **argv)
 358{
 359        return ip_do(do_iplink, argv);
 360}
 361#endif
 362#if ENABLE_IPROUTE
 363int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 364int iproute_main(int argc UNUSED_PARAM, char **argv)
 365{
 366        return ip_do(do_iproute, argv);
 367}
 368#endif
 369#if ENABLE_IPRULE
 370int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 371int iprule_main(int argc UNUSED_PARAM, char **argv)
 372{
 373        return ip_do(do_iprule, argv);
 374}
 375#endif
 376#if ENABLE_IPTUNNEL
 377int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 378int iptunnel_main(int argc UNUSED_PARAM, char **argv)
 379{
 380        return ip_do(do_iptunnel, argv);
 381}
 382#endif
 383#if ENABLE_IPNEIGH
 384int ipneigh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 385int ipneigh_main(int argc UNUSED_PARAM, char **argv)
 386{
 387        return ip_do(do_ipneigh, argv);
 388}
 389#endif
 390
 391#if ENABLE_IP
 392static int FAST_FUNC ip_print_help(char **argv UNUSED_PARAM)
 393{
 394        bb_show_usage();
 395}
 396
 397int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 398int ip_main(int argc UNUSED_PARAM, char **argv)
 399{
 400        static const char keywords[] ALIGN1 = ""
 401                IF_FEATURE_IP_ADDRESS("address\0")
 402                IF_FEATURE_IP_ROUTE("route\0")
 403                IF_FEATURE_IP_ROUTE("r\0")
 404                IF_FEATURE_IP_LINK("link\0")
 405                IF_FEATURE_IP_TUNNEL("tunnel\0")
 406                IF_FEATURE_IP_TUNNEL("tunl\0")
 407                IF_FEATURE_IP_RULE("rule\0")
 408                IF_FEATURE_IP_NEIGH("neigh\0")
 409                ;
 410        static const ip_func_ptr_t ip_func_ptrs[] = {
 411                ip_print_help,
 412                IF_FEATURE_IP_ADDRESS(do_ipaddr,)
 413                IF_FEATURE_IP_ROUTE(do_iproute,)
 414                IF_FEATURE_IP_ROUTE(do_iproute,)
 415                IF_FEATURE_IP_LINK(do_iplink,)
 416                IF_FEATURE_IP_TUNNEL(do_iptunnel,)
 417                IF_FEATURE_IP_TUNNEL(do_iptunnel,)
 418                IF_FEATURE_IP_RULE(do_iprule,)
 419                IF_FEATURE_IP_NEIGH(do_ipneigh,)
 420        };
 421        ip_func_ptr_t ip_func;
 422        int key;
 423
 424        argv = ip_parse_common_args(argv + 1);
 425        if (ARRAY_SIZE(ip_func_ptrs) > 1 && *argv)
 426                key = index_in_substrings(keywords, *argv++);
 427        else
 428                key = -1;
 429        ip_func = ip_func_ptrs[key + 1];
 430
 431        return ip_func(argv);
 432}
 433#endif
 434