summaryrefslogtreecommitdiff
path: root/networking/ip.c (plain)
blob: c3607b74f2308e8d44b0371e5f4b8eac786f7ed6
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"
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. You generally don't need "ip" to use busybox with
18//config: TCP/IP.
19//config:
20//config:config FEATURE_IP_ADDRESS
21//config: bool "ip address"
22//config: default y
23//config: depends on IP
24//config: help
25//config: Address manipulation support for the "ip" applet.
26//config:
27//config:config FEATURE_IP_LINK
28//config: bool "ip link"
29//config: default y
30//config: depends on IP
31//config: help
32//config: Configure network devices with "ip".
33//config:
34//config:config FEATURE_IP_ROUTE
35//config: bool "ip route"
36//config: default y
37//config: depends on IP
38//config: help
39//config: Add support for routing table management to "ip".
40//config:
41//config:config FEATURE_IP_ROUTE_DIR
42//config: string "ip route configuration directory"
43//config: default "/etc/iproute2"
44//config: depends on FEATURE_IP_ROUTE
45//config: help
46//config: Location of the "ip" applet routing configuration.
47//config:
48//config:config FEATURE_IP_TUNNEL
49//config: bool "ip tunnel"
50//config: default y
51//config: depends on IP
52//config: help
53//config: Add support for tunneling commands to "ip".
54//config:
55//config:config FEATURE_IP_RULE
56//config: bool "ip rule"
57//config: default y
58//config: depends on IP
59//config: help
60//config: Add support for rule commands to "ip".
61//config:
62//config:config FEATURE_IP_NEIGH
63//config: bool "ip neighbor"
64//config: default y
65//config: depends on IP
66//config: help
67//config: Add support for neighbor commands to "ip".
68//config:
69//config:config FEATURE_IP_SHORT_FORMS
70//config: bool "Support short forms of ip commands"
71//config: default y
72//config: depends on IP
73//config: help
74//config: Also support short-form of ip <OBJECT> commands:
75//config: ip addr -> ipaddr
76//config: ip link -> iplink
77//config: ip route -> iproute
78//config: ip tunnel -> iptunnel
79//config: ip rule -> iprule
80//config: ip neigh -> ipneigh
81//config:
82//config: Say N unless you desparately need the short form of the ip
83//config: object commands.
84//config:
85//config:config FEATURE_IP_RARE_PROTOCOLS
86//config: bool "Support displaying rarely used link types"
87//config: default n
88//config: depends on IP
89//config: help
90//config: If you are not going to use links of type "frad", "econet",
91//config: "bif" etc, you probably don't need to enable this.
92//config: Ethernet, wireless, infrared, ppp/slip, ip tunnelling
93//config: link types are supported without this option selected.
94//config:
95//config:config IPADDR
96//config: bool
97//config: default y
98//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_ADDRESS
99//config:
100//config:config IPLINK
101//config: bool
102//config: default y
103//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_LINK
104//config:
105//config:config IPROUTE
106//config: bool
107//config: default y
108//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_ROUTE
109//config:
110//config:config IPTUNNEL
111//config: bool
112//config: default y
113//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_TUNNEL
114//config:
115//config:config IPRULE
116//config: bool
117//config: default y
118//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_RULE
119//config:
120//config:config IPNEIGH
121//config: bool
122//config: default y
123//config: depends on FEATURE_IP_SHORT_FORMS && FEATURE_IP_NEIGH
124
125//applet:#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || ENABLE_FEATURE_IP_TUNNEL || ENABLE_FEATURE_IP_RULE || ENABLE_FEATURE_IP_NEIGH
126//applet:IF_IP(APPLET(ip, BB_DIR_SBIN, BB_SUID_DROP))
127//applet:#endif
128//applet:IF_IPADDR(APPLET(ipaddr, BB_DIR_SBIN, BB_SUID_DROP))
129//applet:IF_IPLINK(APPLET(iplink, BB_DIR_SBIN, BB_SUID_DROP))
130//applet:IF_IPROUTE(APPLET(iproute, BB_DIR_SBIN, BB_SUID_DROP))
131//applet:IF_IPRULE(APPLET(iprule, BB_DIR_SBIN, BB_SUID_DROP))
132//applet:IF_IPTUNNEL(APPLET(iptunnel, BB_DIR_SBIN, BB_SUID_DROP))
133//applet:IF_IPNEIGH(APPLET(ipneigh, BB_DIR_SBIN, BB_SUID_DROP))
134
135//kbuild:lib-$(CONFIG_IP) += ip.o
136
137/* would need to make the " | " optional depending on more than one selected: */
138//usage:#define ip_trivial_usage
139//usage: "[OPTIONS] {"
140//usage: IF_FEATURE_IP_ADDRESS("address | ")
141//usage: IF_FEATURE_IP_ROUTE("route | ")
142//usage: IF_FEATURE_IP_LINK("link | ")
143//usage: IF_FEATURE_IP_TUNNEL("tunnel | ")
144//usage: IF_FEATURE_IP_NEIGH("neigh | ")
145//usage: IF_FEATURE_IP_RULE("rule")
146//usage: "} {COMMAND}"
147//usage:#define ip_full_usage "\n\n"
148//usage: "ip [OPTIONS] OBJECT {COMMAND}\n"
149//usage: "where OBJECT := {"
150//usage: IF_FEATURE_IP_ADDRESS("address | ")
151//usage: IF_FEATURE_IP_ROUTE("route | ")
152//usage: IF_FEATURE_IP_LINK("link | ")
153//usage: IF_FEATURE_IP_TUNNEL("tunnel | ")
154//usage: IF_FEATURE_IP_NEIGH("neigh | ")
155//usage: IF_FEATURE_IP_RULE("rule")
156//usage: "}\n"
157//usage: "OPTIONS := { -f[amily] { inet | inet6 | link } | -o[neline] }"
158//usage:
159//usage:#define ipaddr_trivial_usage
160//usage: "{ {add|del} IFADDR dev STRING | {show|flush}\n"
161//usage: " [dev STRING] [to PREFIX] }"
162//usage:#define ipaddr_full_usage "\n\n"
163//usage: "ipaddr {add|change|replace|delete} IFADDR dev STRING\n"
164//usage: "ipaddr {show|flush} [dev STRING] [scope SCOPE-ID]\n"
165//usage: " [to PREFIX] [label PATTERN]\n"
166//usage: " IFADDR := PREFIX | ADDR peer PREFIX\n"
167//usage: " [broadcast ADDR] [anycast ADDR]\n"
168//usage: " [label STRING] [scope SCOPE-ID]\n"
169//usage: " SCOPE-ID := [host | link | global | NUMBER]"
170//usage:
171//usage:#define iplink_trivial_usage
172//usage: "{ set DEVICE { up | down | arp { on | off } | show [DEVICE] }"
173//usage:#define iplink_full_usage "\n\n"
174//usage: "iplink set DEVICE { up | down | arp | multicast { on | off } |\n"
175//usage: " dynamic { on | off } |\n"
176//usage: " mtu MTU }\n"
177//usage: "iplink show [DEVICE]"
178//usage:
179//usage:#define iproute_trivial_usage
180//usage: "{ list | flush | add | del | change | append |\n"
181//usage: " replace | test } ROUTE"
182//usage:#define iproute_full_usage "\n\n"
183//usage: "iproute { list | flush } SELECTOR\n"
184//usage: "iproute get ADDRESS [from ADDRESS iif STRING]\n"
185//usage: " [oif STRING] [tos TOS]\n"
186//usage: "iproute { add | del | change | append | replace | test } ROUTE\n"
187//usage: " SELECTOR := [root PREFIX] [match PREFIX] [proto RTPROTO]\n"
188//usage: " ROUTE := [TYPE] PREFIX [tos TOS] [proto RTPROTO] [metric METRIC]"
189//usage:
190//usage:#define iprule_trivial_usage
191//usage: "{[list | add | del] RULE}"
192//usage:#define iprule_full_usage "\n\n"
193//usage: "iprule [list | add | del] SELECTOR ACTION\n"
194//usage: " SELECTOR := [from PREFIX] [to PREFIX] [tos TOS] [fwmark FWMARK]\n"
195//usage: " [dev STRING] [pref NUMBER]\n"
196//usage: " ACTION := [table TABLE_ID] [nat ADDRESS]\n"
197//usage: " [prohibit | reject | unreachable]\n"
198//usage: " [realms [SRCREALM/]DSTREALM]\n"
199//usage: " TABLE_ID := [local | main | default | NUMBER]"
200//usage:
201//usage:#define iptunnel_trivial_usage
202//usage: "{ add | change | del | show } [NAME]\n"
203//usage: " [mode { ipip | gre | sit }]\n"
204//usage: " [remote ADDR] [local ADDR] [ttl TTL]"
205//usage:#define iptunnel_full_usage "\n\n"
206//usage: "iptunnel { add | change | del | show } [NAME]\n"
207//usage: " [mode { ipip | gre | sit }] [remote ADDR] [local ADDR]\n"
208//usage: " [[i|o]seq] [[i|o]key KEY] [[i|o]csum]\n"
209//usage: " [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]"
210//usage:
211//usage:#define ipneigh_trivial_usage
212//usage: "{ show | flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ]"
213//usage:#define ipneigh_full_usage "\n\n"
214//usage: "ipneigh { show | flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ]"
215
216#include "libbb.h"
217
218#include "libiproute/utils.h"
219#include "libiproute/ip_common.h"
220
221#if ENABLE_FEATURE_IP_ADDRESS \
222 || ENABLE_FEATURE_IP_ROUTE \
223 || ENABLE_FEATURE_IP_LINK \
224 || ENABLE_FEATURE_IP_TUNNEL \
225 || ENABLE_FEATURE_IP_RULE \
226 || ENABLE_FEATURE_IP_NEIGH
227
228static int FAST_FUNC ip_print_help(char **argv UNUSED_PARAM)
229{
230 bb_show_usage();
231}
232
233typedef int FAST_FUNC (*ip_func_ptr_t)(char**);
234
235static int ip_do(ip_func_ptr_t ip_func, char **argv)
236{
237 argv = ip_parse_common_args(argv + 1);
238 return ip_func(argv);
239}
240
241#if ENABLE_FEATURE_IP_ADDRESS
242int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
243int ipaddr_main(int argc UNUSED_PARAM, char **argv)
244{
245 return ip_do(do_ipaddr, argv);
246}
247#endif
248#if ENABLE_FEATURE_IP_LINK
249int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
250int iplink_main(int argc UNUSED_PARAM, char **argv)
251{
252 return ip_do(do_iplink, argv);
253}
254#endif
255#if ENABLE_FEATURE_IP_ROUTE
256int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
257int iproute_main(int argc UNUSED_PARAM, char **argv)
258{
259 return ip_do(do_iproute, argv);
260}
261#endif
262#if ENABLE_FEATURE_IP_RULE
263int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
264int iprule_main(int argc UNUSED_PARAM, char **argv)
265{
266 return ip_do(do_iprule, argv);
267}
268#endif
269#if ENABLE_FEATURE_IP_TUNNEL
270int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
271int iptunnel_main(int argc UNUSED_PARAM, char **argv)
272{
273 return ip_do(do_iptunnel, argv);
274}
275#endif
276#if ENABLE_FEATURE_IP_NEIGH
277int ipneigh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
278int ipneigh_main(int argc UNUSED_PARAM, char **argv)
279{
280 return ip_do(do_ipneigh, argv);
281}
282#endif
283
284
285int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
286int ip_main(int argc UNUSED_PARAM, char **argv)
287{
288 static const char keywords[] ALIGN1 =
289 IF_FEATURE_IP_ADDRESS("address\0")
290 IF_FEATURE_IP_ROUTE("route\0")
291 IF_FEATURE_IP_ROUTE("r\0")
292 IF_FEATURE_IP_LINK("link\0")
293 IF_FEATURE_IP_TUNNEL("tunnel\0")
294 IF_FEATURE_IP_TUNNEL("tunl\0")
295 IF_FEATURE_IP_RULE("rule\0")
296 IF_FEATURE_IP_NEIGH("neigh\0")
297 ;
298 static const ip_func_ptr_t ip_func_ptrs[] = {
299 ip_print_help,
300 IF_FEATURE_IP_ADDRESS(do_ipaddr,)
301 IF_FEATURE_IP_ROUTE(do_iproute,)
302 IF_FEATURE_IP_ROUTE(do_iproute,)
303 IF_FEATURE_IP_LINK(do_iplink,)
304 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
305 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
306 IF_FEATURE_IP_RULE(do_iprule,)
307 IF_FEATURE_IP_NEIGH(do_ipneigh,)
308 };
309 ip_func_ptr_t ip_func;
310 int key;
311
312 argv = ip_parse_common_args(argv + 1);
313 key = *argv ? index_in_substrings(keywords, *argv++) : -1;
314 ip_func = ip_func_ptrs[key + 1];
315
316 return ip_func(argv);
317}
318
319#endif /* any of ENABLE_FEATURE_IP_xxx is 1 */
320