blob: 0bc0edc57e486651b2e964733c42e06bdff8c3ea [file] [log] [blame]
"Robert P. J. Day"63fc1a92006-07-02 19:47:05 +00001/* vi: set sw=4 ts=4: */
Glenn L McGrath9a2d2722002-11-10 01:33:55 +00002/*
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +02003 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
Glenn L McGrath9a2d2722002-11-10 01:33:55 +00004 *
Denys Vlasenkoe0a62202010-07-24 23:26:58 +02005 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
Glenn L McGrath9a2d2722002-11-10 01:33:55 +00006 *
7 * Changes:
Denys Vlasenkofb132e42010-10-29 11:46:52 +02008 * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
Bernhard Reutner-Fischer6c4dade2008-09-25 12:13:34 +00009 * Bernhard Reutner-Fischer rewrote to use index_in_substr_array
Glenn L McGrath9a2d2722002-11-10 01:33:55 +000010 */
Denys Vlasenko47367e12016-11-23 09:05:14 +010011//config:config IP
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020012//config: bool "ip (34 kb)"
Denys Vlasenko47367e12016-11-23 09:05:14 +010013//config: default y
14//config: select PLATFORM_LINUX
15//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020016//config: The "ip" applet is a TCP/IP interface configuration and routing
Denys Vlasenko68b653b2017-07-27 10:53:09 +020017//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.
Denys Vlasenko47367e12016-11-23 09:05:14 +010021//config:
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010022//config:config IPADDR
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020023//config: bool "ipaddr (14 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010024//config: default y
25//config: select FEATURE_IP_ADDRESS
26//config: select PLATFORM_LINUX
27//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020028//config: Short form of "ip addr"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010029//config:
30//config:config IPLINK
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020031//config: bool "iplink (16 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010032//config: default y
33//config: select FEATURE_IP_LINK
34//config: select PLATFORM_LINUX
35//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020036//config: Short form of "ip link"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010037//config:
38//config:config IPROUTE
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020039//config: bool "iproute (15 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010040//config: default y
41//config: select FEATURE_IP_ROUTE
42//config: select PLATFORM_LINUX
43//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020044//config: Short form of "ip route"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010045//config:
46//config:config IPTUNNEL
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020047//config: bool "iptunnel (9.6 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010048//config: default y
49//config: select FEATURE_IP_TUNNEL
50//config: select PLATFORM_LINUX
51//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020052//config: Short form of "ip tunnel"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010053//config:
54//config:config IPRULE
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020055//config: bool "iprule (10 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010056//config: default y
57//config: select FEATURE_IP_RULE
58//config: select PLATFORM_LINUX
59//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020060//config: Short form of "ip rule"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010061//config:
62//config:config IPNEIGH
Denys Vlasenko4eed2c62017-07-18 22:01:24 +020063//config: bool "ipneigh (8.3 kb)"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010064//config: default y
65//config: select FEATURE_IP_NEIGH
66//config: select PLATFORM_LINUX
67//config: help
Denys Vlasenko68b653b2017-07-27 10:53:09 +020068//config: Short form of "ip neigh"
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010069//config:
Denys Vlasenko47367e12016-11-23 09:05:14 +010070//config:config FEATURE_IP_ADDRESS
71//config: bool "ip address"
72//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010073//config: depends on IP || IPADDR
Denys Vlasenko47367e12016-11-23 09:05:14 +010074//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020075//config: Address manipulation support for the "ip" applet.
Denys Vlasenko47367e12016-11-23 09:05:14 +010076//config:
77//config:config FEATURE_IP_LINK
78//config: bool "ip link"
79//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010080//config: depends on IP || IPLINK
Denys Vlasenko47367e12016-11-23 09:05:14 +010081//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020082//config: Configure network devices with "ip".
Denys Vlasenko47367e12016-11-23 09:05:14 +010083//config:
84//config:config FEATURE_IP_ROUTE
85//config: bool "ip route"
86//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +010087//config: depends on IP || IPROUTE
Denys Vlasenko47367e12016-11-23 09:05:14 +010088//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020089//config: Add support for routing table management to "ip".
Denys Vlasenko47367e12016-11-23 09:05:14 +010090//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
Denys Vlasenko72089cf2017-07-21 09:50:55 +020096//config: Location of the "ip" applet routing configuration.
Denys Vlasenko47367e12016-11-23 09:05:14 +010097//config:
98//config:config FEATURE_IP_TUNNEL
99//config: bool "ip tunnel"
100//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100101//config: depends on IP || IPTUNNEL
Denys Vlasenko47367e12016-11-23 09:05:14 +0100102//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +0200103//config: Add support for tunneling commands to "ip".
Denys Vlasenko47367e12016-11-23 09:05:14 +0100104//config:
105//config:config FEATURE_IP_RULE
106//config: bool "ip rule"
107//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100108//config: depends on IP || IPRULE
Denys Vlasenko47367e12016-11-23 09:05:14 +0100109//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +0200110//config: Add support for rule commands to "ip".
Denys Vlasenko47367e12016-11-23 09:05:14 +0100111//config:
112//config:config FEATURE_IP_NEIGH
113//config: bool "ip neighbor"
114//config: default y
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100115//config: depends on IP || IPNEIGH
Denys Vlasenko47367e12016-11-23 09:05:14 +0100116//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +0200117//config: Add support for neighbor commands to "ip".
Denys Vlasenko47367e12016-11-23 09:05:14 +0100118//config:
Denys Vlasenko47367e12016-11-23 09:05:14 +0100119//config:config FEATURE_IP_RARE_PROTOCOLS
120//config: bool "Support displaying rarely used link types"
121//config: default n
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100122//config: depends on IP || IPADDR || IPLINK || IPROUTE || IPTUNNEL || IPRULE || IPNEIGH
Denys Vlasenko47367e12016-11-23 09:05:14 +0100123//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +0200124//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.
Denys Vlasenko47367e12016-11-23 09:05:14 +0100128
Denys Vlasenkob63afea2017-09-18 15:45:13 +0200129//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 ))
Denys Vlasenko47367e12016-11-23 09:05:14 +0100136
137//kbuild:lib-$(CONFIG_IP) += ip.o
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100138//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
Glenn L McGrath9a2d2722002-11-10 01:33:55 +0000144
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200145//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
Pere Orga5bc8c002011-04-11 03:29:49 +0200146//usage:#define ipaddr_trivial_usage
Denys Vlasenko12389882017-01-21 14:27:07 +0100147//usage: "add|del IFADDR dev IFACE | show|flush [dev IFACE] [to PREFIX]"
Pere Orga5bc8c002011-04-11 03:29:49 +0200148//usage:#define ipaddr_full_usage "\n\n"
Denys Vlasenko7121bb82017-04-07 18:22:41 +0200149//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]"
Pere Orga5bc8c002011-04-11 03:29:49 +0200155//usage:
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200156//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
Pere Orga5bc8c002011-04-11 03:29:49 +0200157//usage:#define iplink_trivial_usage
Denys Vlasenko12389882017-01-21 14:27:07 +0100158//usage: "set IFACE [up|down] [arp on|off] | show [IFACE]"
Pere Orga5bc8c002011-04-11 03:29:49 +0200159//usage:#define iplink_full_usage "\n\n"
Denys Vlasenko2d4823b2017-04-06 16:06:04 +0200160//usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [promisc on|off]\n"
161//usage: " [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n"
Denys Vlasenko12389882017-01-21 14:27:07 +0100162//usage: "iplink show [IFACE]"
Pere Orga5bc8c002011-04-11 03:29:49 +0200163//usage:
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200164//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
Pere Orga5bc8c002011-04-11 03:29:49 +0200165//usage:#define iproute_trivial_usage
Denys Vlasenkof3d705f2017-01-21 03:46:35 +0100166//usage: "list|flush|add|del|change|append|replace|test ROUTE"
Pere Orga5bc8c002011-04-11 03:29:49 +0200167//usage:#define iproute_full_usage "\n\n"
Denys Vlasenkof3d705f2017-01-21 03:46:35 +0100168//usage: "iproute list|flush SELECTOR\n"
Denys Vlasenko53782d92011-12-06 18:59:55 +0100169//usage: " SELECTOR := [root PREFIX] [match PREFIX] [proto RTPROTO]\n"
Denys Vlasenko7121bb82017-04-07 18:22:41 +0200170//usage: " PREFIX := default|ADDR[/MASK]\n"
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200171//usage: "iproute get ADDR [from ADDR iif IFACE]\n"
Denys Vlasenko1140bf32017-04-06 17:54:38 +0200172//usage: " [oif IFACE] [tos TOS]\n"
173//usage: "iproute add|del|change|append|replace|test ROUTE\n"
174//usage: " ROUTE := NODE_SPEC [INFO_SPEC]\n"
175//usage: " NODE_SPEC := PREFIX"IF_FEATURE_IP_RULE(" [table TABLE_ID]")" [proto RTPROTO] [scope SCOPE] [metric METRIC]\n"
176//usage: " INFO_SPEC := NH OPTIONS\n"
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200177//usage: " NH := [via [inet|inet6] ADDR] [dev IFACE] [src ADDR] [onlink]\n"
Denys Vlasenkod5342a12017-04-07 17:00:53 +0200178//usage: " OPTIONS := [mtu [lock] NUM] [advmss [lock] NUM]"
Denys Vlasenko1140bf32017-04-06 17:54:38 +0200179//upstream man ip-route:
180//======================
181//ip route { show | flush } SELECTOR
182//ip route save SELECTOR
183//ip route restore
184//ip route get ADDRESS [ from ADDRESS iif STRING ] [ oif STRING ] [ tos TOS ]
185//ip route { add | del | change | append | replace } ROUTE
186//SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ]
187//ROUTE := NODE_SPEC [ INFO_SPEC ]
188//NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ]
189//INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ] ...
190//NH := [ encap ENCAP ] [ via [ FAMILY ] ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
191// ..............................................................^ I guess [src ADDRESS] should be here
192//FAMILY := [ inet | inet6 | ipx | dnet | mpls | bridge | link ]
193//OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ] rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ] [ window NUMBER ] [ cwnd NUMBER ] [ ssthresh REALM ] [ realms REALM ]
194// [ rto_min TIME ] [ initcwnd NUMBER ] [ initrwnd NUMBER ] [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ] [ pref PREF ] [ expires TIME ]
195//TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ]
196//TABLE_ID := [ local | main | default | all | NUMBER ]
197//SCOPE := [ host | link | global | NUMBER ]
198//NHFLAGS := [ onlink | pervasive ]
199//RTPROTO := [ kernel | boot | static | NUMBER ]
200//FEATURES := [ ecn | ]
201//PREF := [ low | medium | high ]
202//ENCAP := [ MPLS | IP ]
203//ENCAP_MPLS := mpls [ LABEL ]
204//ENCAP_IP := ip id TUNNEL_ID dst REMOTE_IP [ tos TOS ] [ ttl TTL ]
Pere Orga5bc8c002011-04-11 03:29:49 +0200205//usage:
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200206//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
Pere Orga5bc8c002011-04-11 03:29:49 +0200207//usage:#define iprule_trivial_usage
Denys Vlasenko12389882017-01-21 14:27:07 +0100208//usage: "[list] | add|del SELECTOR ACTION"
Pere Orga5bc8c002011-04-11 03:29:49 +0200209//usage:#define iprule_full_usage "\n\n"
Pere Orga5bc8c002011-04-11 03:29:49 +0200210//usage: " SELECTOR := [from PREFIX] [to PREFIX] [tos TOS] [fwmark FWMARK]\n"
Denys Vlasenko12389882017-01-21 14:27:07 +0100211//usage: " [dev IFACE] [pref NUMBER]\n"
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200212//usage: " ACTION := [table TABLE_ID] [nat ADDR]\n"
Denys Vlasenko8908c1d2017-01-21 03:56:46 +0100213//usage: " [prohibit|reject|unreachable]\n"
Pere Orga5bc8c002011-04-11 03:29:49 +0200214//usage: " [realms [SRCREALM/]DSTREALM]\n"
Denys Vlasenko8908c1d2017-01-21 03:56:46 +0100215//usage: " TABLE_ID := [local|main|default|NUMBER]"
Pere Orga5bc8c002011-04-11 03:29:49 +0200216//usage:
Denys Vlasenko4eaa0f72017-04-07 18:14:46 +0200217//--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
Pere Orga5bc8c002011-04-11 03:29:49 +0200218//usage:#define iptunnel_trivial_usage
Denys Vlasenkof3d705f2017-01-21 03:46:35 +0100219//usage: "add|change|del|show [NAME]\n"
220//usage: " [mode ipip|gre|sit]\n"
Pere Orga5bc8c002011-04-11 03:29:49 +0200221//usage: " [remote ADDR] [local ADDR] [ttl TTL]"
222//usage:#define iptunnel_full_usage "\n\n"
Denys Vlasenkof3d705f2017-01-21 03:46:35 +0100223//usage: "iptunnel add|change|del|show [NAME]\n"
224//usage: " [mode ipip|gre|sit] [remote ADDR] [local ADDR]\n"
Pere Orga5bc8c002011-04-11 03:29:49 +0200225//usage: " [[i|o]seq] [[i|o]key KEY] [[i|o]csum]\n"
226//usage: " [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]"
Curt Brune69934702015-10-14 12:53:47 +0200227//usage:
228//usage:#define ipneigh_trivial_usage
Denys Vlasenkof3d705f2017-01-21 03:46:35 +0100229//usage: "show|flush [to PREFIX] [dev DEV] [nud STATE]"
Denys Vlasenko12389882017-01-21 14:27:07 +0100230//usage:#define ipneigh_full_usage ""
231//usage:
232//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE
233//usage:# define IP_BAR_LINK "|"
234//usage:#else
235//usage:# define IP_BAR_LINK ""
236//usage:#endif
237//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK
238//usage:# define IP_BAR_TUNNEL "|"
239//usage:#else
240//usage:# define IP_BAR_TUNNEL ""
241//usage:#endif
242//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || ENABLE_FEATURE_IP_TUNNEL
243//usage:# define IP_BAR_NEIGH "|"
244//usage:#else
245//usage:# define IP_BAR_NEIGH ""
246//usage:#endif
247//usage:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || ENABLE_FEATURE_IP_TUNNEL || ENABLE_FEATURE_IP_NEIGH
248//usage:# define IP_BAR_RULE "|"
249//usage:#else
250//usage:# define IP_BAR_RULE ""
251//usage:#endif
252//usage:
253//usage:#define ip_trivial_usage
254//usage: "[OPTIONS] "
255//usage: IF_FEATURE_IP_ADDRESS("address")
256//usage: IF_FEATURE_IP_ROUTE( IF_FEATURE_IP_ADDRESS("|")"route")
257//usage: IF_FEATURE_IP_LINK( IP_BAR_LINK "link")
258//usage: IF_FEATURE_IP_TUNNEL( IP_BAR_TUNNEL"tunnel")
259//usage: IF_FEATURE_IP_NEIGH( IP_BAR_NEIGH "neigh")
260//usage: IF_FEATURE_IP_RULE( IP_BAR_RULE "rule")
261//usage: " [COMMAND]"
262//usage:#define ip_full_usage "\n\n"
263//usage: "OPTIONS := -f[amily] inet|inet6|link | -o[neline]\n"
264//usage: "COMMAND :="
265//usage: IF_FEATURE_IP_ADDRESS("\n"
266//usage: "ip addr "ipaddr_trivial_usage)
267//usage: IF_FEATURE_IP_ROUTE("\n"
268//usage: "ip route "iproute_trivial_usage)
269//usage: IF_FEATURE_IP_LINK("\n"
270//usage: "ip link "iplink_trivial_usage)
271//usage: IF_FEATURE_IP_TUNNEL("\n"
272//usage: "ip tunnel "iptunnel_trivial_usage)
273//usage: IF_FEATURE_IP_NEIGH("\n"
274//usage: "ip neigh "ipneigh_trivial_usage)
275//usage: IF_FEATURE_IP_RULE("\n"
276//usage: "ip rule "iprule_trivial_usage)
Pere Orga5bc8c002011-04-11 03:29:49 +0200277
Denis Vlasenkob6adbf12007-05-26 19:00:18 +0000278#include "libbb.h"
Glenn L McGrath9a2d2722002-11-10 01:33:55 +0000279
Bernhard Reutner-Fischerab187822005-10-26 10:47:26 +0000280#include "libiproute/utils.h"
281#include "libiproute/ip_common.h"
Glenn L McGrath9a2d2722002-11-10 01:33:55 +0000282
Denys Vlasenko2e9b5512010-07-24 23:27:38 +0200283typedef int FAST_FUNC (*ip_func_ptr_t)(char**);
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200284
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100285#if ENABLE_IPADDR \
286 || ENABLE_IPLINK \
287 || ENABLE_IPROUTE \
288 || ENABLE_IPRULE \
289 || ENABLE_IPTUNNEL \
290 || ENABLE_IPNEIGH
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200291static int ip_do(ip_func_ptr_t ip_func, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000292{
Denis Vlasenko3246c0d2008-12-04 12:15:19 +0000293 argv = ip_parse_common_args(argv + 1);
Denis Vlasenkoed6a49c2007-11-18 22:56:25 +0000294 return ip_func(argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000295}
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100296#endif
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000297
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100298#if ENABLE_IPADDR
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000299int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000300int ipaddr_main(int argc UNUSED_PARAM, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000301{
Denis Vlasenko2570b2e2008-03-28 01:00:09 +0000302 return ip_do(do_ipaddr, argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000303}
304#endif
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100305#if ENABLE_IPLINK
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000306int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000307int iplink_main(int argc UNUSED_PARAM, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000308{
Denis Vlasenko2570b2e2008-03-28 01:00:09 +0000309 return ip_do(do_iplink, argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000310}
311#endif
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100312#if ENABLE_IPROUTE
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000313int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000314int iproute_main(int argc UNUSED_PARAM, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000315{
Denis Vlasenko2570b2e2008-03-28 01:00:09 +0000316 return ip_do(do_iproute, argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000317}
318#endif
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100319#if ENABLE_IPRULE
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000320int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000321int iprule_main(int argc UNUSED_PARAM, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000322{
Denis Vlasenko2570b2e2008-03-28 01:00:09 +0000323 return ip_do(do_iprule, argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000324}
325#endif
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100326#if ENABLE_IPTUNNEL
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000327int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000328int iptunnel_main(int argc UNUSED_PARAM, char **argv)
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000329{
Denis Vlasenko2570b2e2008-03-28 01:00:09 +0000330 return ip_do(do_iptunnel, argv);
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000331}
332#endif
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100333#if ENABLE_IPNEIGH
Curt Brune69934702015-10-14 12:53:47 +0200334int ipneigh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
335int ipneigh_main(int argc UNUSED_PARAM, char **argv)
336{
337 return ip_do(do_ipneigh, argv);
338}
339#endif
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000340
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100341#if ENABLE_IP
342static int FAST_FUNC ip_print_help(char **argv UNUSED_PARAM)
343{
344 bb_show_usage();
345}
Bernhard Reutner-Fischer07c394e2007-04-10 20:11:12 +0000346
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +0000347int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +0000348int ip_main(int argc UNUSED_PARAM, char **argv)
Glenn L McGrathf112daa2002-12-01 23:04:06 +0000349{
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100350 static const char keywords[] ALIGN1 = ""
Denis Vlasenko5e34ff22009-04-21 11:09:40 +0000351 IF_FEATURE_IP_ADDRESS("address\0")
352 IF_FEATURE_IP_ROUTE("route\0")
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200353 IF_FEATURE_IP_ROUTE("r\0")
Denis Vlasenko5e34ff22009-04-21 11:09:40 +0000354 IF_FEATURE_IP_LINK("link\0")
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200355 IF_FEATURE_IP_TUNNEL("tunnel\0")
356 IF_FEATURE_IP_TUNNEL("tunl\0")
Denis Vlasenko5e34ff22009-04-21 11:09:40 +0000357 IF_FEATURE_IP_RULE("rule\0")
Curt Brune69934702015-10-14 12:53:47 +0200358 IF_FEATURE_IP_NEIGH("neigh\0")
Denis Vlasenko990d0f62007-07-24 15:54:42 +0000359 ;
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200360 static const ip_func_ptr_t ip_func_ptrs[] = {
361 ip_print_help,
362 IF_FEATURE_IP_ADDRESS(do_ipaddr,)
363 IF_FEATURE_IP_ROUTE(do_iproute,)
364 IF_FEATURE_IP_ROUTE(do_iproute,)
365 IF_FEATURE_IP_LINK(do_iplink,)
366 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
367 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
368 IF_FEATURE_IP_RULE(do_iprule,)
Curt Brune69934702015-10-14 12:53:47 +0200369 IF_FEATURE_IP_NEIGH(do_ipneigh,)
Bernhard Reutner-Fischere87d7952007-04-10 18:43:27 +0000370 };
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200371 ip_func_ptr_t ip_func;
372 int key;
Bernhard Reutner-Fischere87d7952007-04-10 18:43:27 +0000373
Denis Vlasenkoed6a49c2007-11-18 22:56:25 +0000374 argv = ip_parse_common_args(argv + 1);
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100375 if (ARRAY_SIZE(ip_func_ptrs) > 1 && *argv)
376 key = index_in_substrings(keywords, *argv++);
377 else
378 key = -1;
Denys Vlasenkoe0a62202010-07-24 23:26:58 +0200379 ip_func = ip_func_ptrs[key + 1];
380
Denis Vlasenkoed6a49c2007-11-18 22:56:25 +0000381 return ip_func(argv);
Glenn L McGrath9a2d2722002-11-10 01:33:55 +0000382}
Denys Vlasenko7c5dea32016-12-22 22:30:13 +0100383#endif