diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-06 16:06:04 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-06 16:06:04 +0200 |
commit | 2d4823b65b67c7f1fa504037aa0d4065650f53d8 (patch) | |
tree | dcaf7f47a3a8bde55a27511808126182284417a0 | |
parent | a7386bb35b474987f0e82337b7fe524220336d32 (diff) | |
download | busybox-w32-2d4823b65b67c7f1fa504037aa0d4065650f53d8.tar.gz busybox-w32-2d4823b65b67c7f1fa504037aa0d4065650f53d8.tar.bz2 busybox-w32-2d4823b65b67c7f1fa504037aa0d4065650f53d8.zip |
iplink: implement "set promisc on|off". Closes 4682
function old new delta
do_iplink 1232 1269 +37
packed_usage 31337 31327 -10
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ip.c | 4 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 31 |
2 files changed, 13 insertions, 22 deletions
diff --git a/networking/ip.c b/networking/ip.c index 620795881..6fc43f653 100644 --- a/networking/ip.c +++ b/networking/ip.c | |||
@@ -154,8 +154,8 @@ | |||
154 | //usage:#define iplink_trivial_usage | 154 | //usage:#define iplink_trivial_usage |
155 | //usage: "set IFACE [up|down] [arp on|off] | show [IFACE]" | 155 | //usage: "set IFACE [up|down] [arp on|off] | show [IFACE]" |
156 | //usage:#define iplink_full_usage "\n\n" | 156 | //usage:#define iplink_full_usage "\n\n" |
157 | //usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [mtu MTU]\n" | 157 | //usage: "iplink set IFACE [up|down] [arp on|off] [multicast on|off] [promisc on|off]\n" |
158 | //usage: " [name NAME] [qlen NUM] [address MAC]\n" | 158 | //usage: " [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n" |
159 | //usage: "iplink show [IFACE]" | 159 | //usage: "iplink show [IFACE]" |
160 | //usage: | 160 | //usage: |
161 | //usage:#define iproute_trivial_usage | 161 | //usage:#define iproute_trivial_usage |
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index f00c40215..aef5f6490 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c | |||
@@ -210,10 +210,10 @@ static int do_set(char **argv) | |||
210 | /* If you add stuff here, update iplink_full_usage */ | 210 | /* If you add stuff here, update iplink_full_usage */ |
211 | static const char keywords[] ALIGN1 = | 211 | static const char keywords[] ALIGN1 = |
212 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" | 212 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" |
213 | "arp\0""address\0" | 213 | "arp\0""promisc\0""address\0" |
214 | "dev\0" /* must be last */; | 214 | "dev\0" /* must be last */; |
215 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, | 215 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, |
216 | ARG_arp, ARG_addr, | 216 | ARG_arp, ARG_promisc, ARG_addr, |
217 | ARG_dev }; | 217 | ARG_dev }; |
218 | enum { PARM_on = 0, PARM_off }; | 218 | enum { PARM_on = 0, PARM_off }; |
219 | smalluint key; | 219 | smalluint key; |
@@ -237,6 +237,7 @@ static int do_set(char **argv) | |||
237 | duparg("mtu", *argv); | 237 | duparg("mtu", *argv); |
238 | mtu = get_unsigned(*argv, "mtu"); | 238 | mtu = get_unsigned(*argv, "mtu"); |
239 | } else if (key == ARG_qlen) { | 239 | } else if (key == ARG_qlen) { |
240 | //TODO: txqueuelen, txqlen are synonyms to qlen | ||
240 | NEXT_ARG(); | 241 | NEXT_ARG(); |
241 | if (qlen != -1) | 242 | if (qlen != -1) |
242 | duparg("qlen", *argv); | 243 | duparg("qlen", *argv); |
@@ -273,6 +274,14 @@ static int do_set(char **argv) | |||
273 | flags &= ~IFF_NOARP; | 274 | flags &= ~IFF_NOARP; |
274 | else | 275 | else |
275 | flags |= IFF_NOARP; | 276 | flags |= IFF_NOARP; |
277 | } else if (key == ARG_promisc) { | ||
278 | if (param < 0) | ||
279 | die_must_be_on_off("promisc"); | ||
280 | mask |= IFF_PROMISC; | ||
281 | if (param == PARM_on) | ||
282 | flags |= IFF_PROMISC; | ||
283 | else | ||
284 | flags &= ~IFF_PROMISC; | ||
276 | } | 285 | } |
277 | } | 286 | } |
278 | 287 | ||
@@ -285,15 +294,6 @@ static int do_set(char **argv) | |||
285 | if (len < 0) | 294 | if (len < 0) |
286 | return -1; | 295 | return -1; |
287 | addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len); | 296 | addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len); |
288 | } else if (matches(*argv, "txqueuelen") == 0 || | ||
289 | strcmp(*argv, "qlen") == 0 || | ||
290 | matches(*argv, "txqlen") == 0) { | ||
291 | NEXT_ARG(); | ||
292 | if (qlen != -1) | ||
293 | duparg("txqueuelen", *argv); | ||
294 | if (get_integer(&qlen, *argv, 0)) | ||
295 | invarg_1_to_2(*argv, "txqueuelen"); | ||
296 | addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4); | ||
297 | } else if (strcmp(*argv, "netns") == 0) { | 297 | } else if (strcmp(*argv, "netns") == 0) { |
298 | NEXT_ARG(); | 298 | NEXT_ARG(); |
299 | if (netns != -1) | 299 | if (netns != -1) |
@@ -313,15 +313,6 @@ static int do_set(char **argv) | |||
313 | req->i.ifi_flags &= ~IFF_ALLMULTI; | 313 | req->i.ifi_flags &= ~IFF_ALLMULTI; |
314 | } else | 314 | } else |
315 | return on_off("allmulticast", *argv); | 315 | return on_off("allmulticast", *argv); |
316 | } else if (strcmp(*argv, "promisc") == 0) { | ||
317 | NEXT_ARG(); | ||
318 | req->i.ifi_change |= IFF_PROMISC; | ||
319 | if (strcmp(*argv, "on") == 0) { | ||
320 | req->i.ifi_flags |= IFF_PROMISC; | ||
321 | } else if (strcmp(*argv, "off") == 0) { | ||
322 | req->i.ifi_flags &= ~IFF_PROMISC; | ||
323 | } else | ||
324 | return on_off("promisc", *argv); | ||
325 | } else if (strcmp(*argv, "trailers") == 0) { | 316 | } else if (strcmp(*argv, "trailers") == 0) { |
326 | NEXT_ARG(); | 317 | NEXT_ARG(); |
327 | req->i.ifi_change |= IFF_NOTRAILERS; | 318 | req->i.ifi_change |= IFF_NOTRAILERS; |