• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/busybox/networking/libiproute/
1/* vi: set sw=4 ts=4: */
2/*
3 * rtm_map.c
4 *
5 *		This program is free software; you can redistribute it and/or
6 *		modify it under the terms of the GNU General Public License
7 *		as published by the Free Software Foundation; either version
8 *		2 of the License, or (at your option) any later version.
9 *
10 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
11 *
12 */
13
14#include "libbb.h"
15#include "rt_names.h"
16#include "utils.h"
17
18const char* FAST_FUNC rtnl_rtntype_n2a(int id, char *buf)
19{
20	switch (id) {
21	case RTN_UNSPEC:
22		return "none";
23	case RTN_UNICAST:
24		return "unicast";
25	case RTN_LOCAL:
26		return "local";
27	case RTN_BROADCAST:
28		return "broadcast";
29	case RTN_ANYCAST:
30		return "anycast";
31	case RTN_MULTICAST:
32		return "multicast";
33	case RTN_BLACKHOLE:
34		return "blackhole";
35	case RTN_UNREACHABLE:
36		return "unreachable";
37	case RTN_PROHIBIT:
38		return "prohibit";
39	case RTN_THROW:
40		return "throw";
41	case RTN_NAT:
42		return "nat";
43	case RTN_XRESOLVE:
44		return "xresolve";
45	default:
46		/* buf is SPRINT_BSIZE big */
47		sprintf(buf, "%d", id);
48		return buf;
49	}
50}
51
52
53int FAST_FUNC rtnl_rtntype_a2n(int *id, char *arg)
54{
55	static const char keywords[] ALIGN1 =
56		"local\0""nat\0""broadcast\0""brd\0""anycast\0"
57		"multicast\0""prohibit\0""unreachable\0""blackhole\0"
58		"xresolve\0""unicast\0""throw\0";
59	enum {
60		ARG_local = 1, ARG_nat, ARG_broadcast, ARG_brd, ARG_anycast,
61		ARG_multicast, ARG_prohibit, ARG_unreachable, ARG_blackhole,
62		ARG_xresolve, ARG_unicast, ARG_throw
63	};
64	const smalluint key = index_in_substrings(keywords, arg) + 1;
65	char *end;
66	unsigned long res;
67
68	if (key == ARG_local)
69		res = RTN_LOCAL;
70	else if (key == ARG_nat)
71		res = RTN_NAT;
72	else if (key == ARG_broadcast || key == ARG_brd)
73		res = RTN_BROADCAST;
74	else if (key == ARG_anycast)
75		res = RTN_ANYCAST;
76	else if (key == ARG_multicast)
77		res = RTN_MULTICAST;
78	else if (key == ARG_prohibit)
79		res = RTN_PROHIBIT;
80	else if (key == ARG_unreachable)
81		res = RTN_UNREACHABLE;
82	else if (key == ARG_blackhole)
83		res = RTN_BLACKHOLE;
84	else if (key == ARG_xresolve)
85		res = RTN_XRESOLVE;
86	else if (key == ARG_unicast)
87		res = RTN_UNICAST;
88	else if (key == ARG_throw)
89		res = RTN_THROW;
90	else {
91		res = strtoul(arg, &end, 0);
92		if (end == arg || *end || res > 255)
93			return -1;
94	}
95	*id = res;
96	return 0;
97}
98
99int FAST_FUNC get_rt_realms(uint32_t *realms, char *arg)
100{
101	uint32_t realm = 0;
102	char *p = strchr(arg, '/');
103
104	*realms = 0;
105	if (p) {
106		*p = 0;
107		if (rtnl_rtrealm_a2n(realms, arg)) {
108			*p = '/';
109			return -1;
110		}
111		*realms <<= 16;
112		*p = '/';
113		arg = p+1;
114	}
115	if (*arg && rtnl_rtrealm_a2n(&realm, arg))
116		return -1;
117	*realms |= realm;
118	return 0;
119}
120