blob: 263ac78ada2d0300d74257eb07d955be413a6982
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * This program is free software; you can redistribute it and/or |
4 | * modify it under the terms of the GNU General Public License |
5 | * as published by the Free Software Foundation; either version |
6 | * 2 of the License, or (at your option) any later version. |
7 | * |
8 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> |
9 | */ |
10 | |
11 | #include "libbb.h" |
12 | #include "rt_names.h" |
13 | #include "utils.h" |
14 | |
15 | #include <netinet/if_ether.h> |
16 | #include <linux/if_ether.h> |
17 | |
18 | |
19 | /* Please conditionalize exotic protocols on CONFIG_something */ |
20 | |
21 | static const uint16_t llproto_ids[] = { |
22 | #define __PF(f,n) ETH_P_##f, |
23 | __PF(LOOP,loop) |
24 | __PF(PUP,pup) |
25 | #ifdef ETH_P_PUPAT |
26 | __PF(PUPAT,pupat) |
27 | #endif |
28 | __PF(IP,ip) |
29 | __PF(X25,x25) |
30 | __PF(ARP,arp) |
31 | __PF(BPQ,bpq) |
32 | #ifdef ETH_P_IEEEPUP |
33 | __PF(IEEEPUP,ieeepup) |
34 | #endif |
35 | #ifdef ETH_P_IEEEPUPAT |
36 | __PF(IEEEPUPAT,ieeepupat) |
37 | #endif |
38 | __PF(DEC,dec) |
39 | __PF(DNA_DL,dna_dl) |
40 | __PF(DNA_RC,dna_rc) |
41 | __PF(DNA_RT,dna_rt) |
42 | __PF(LAT,lat) |
43 | __PF(DIAG,diag) |
44 | __PF(CUST,cust) |
45 | __PF(SCA,sca) |
46 | __PF(RARP,rarp) |
47 | __PF(ATALK,atalk) |
48 | __PF(AARP,aarp) |
49 | __PF(IPX,ipx) |
50 | __PF(IPV6,ipv6) |
51 | #ifdef ETH_P_PPP_DISC |
52 | __PF(PPP_DISC,ppp_disc) |
53 | #endif |
54 | #ifdef ETH_P_PPP_SES |
55 | __PF(PPP_SES,ppp_ses) |
56 | #endif |
57 | #ifdef ETH_P_ATMMPOA |
58 | __PF(ATMMPOA,atmmpoa) |
59 | #endif |
60 | #ifdef ETH_P_ATMFATE |
61 | __PF(ATMFATE,atmfate) |
62 | #endif |
63 | |
64 | __PF(802_3,802_3) |
65 | __PF(AX25,ax25) |
66 | __PF(ALL,all) |
67 | __PF(802_2,802_2) |
68 | __PF(SNAP,snap) |
69 | __PF(DDCMP,ddcmp) |
70 | __PF(WAN_PPP,wan_ppp) |
71 | __PF(PPP_MP,ppp_mp) |
72 | __PF(LOCALTALK,localtalk) |
73 | __PF(PPPTALK,ppptalk) |
74 | __PF(TR_802_2,tr_802_2) |
75 | __PF(MOBITEX,mobitex) |
76 | __PF(CONTROL,control) |
77 | __PF(IRDA,irda) |
78 | #ifdef ETH_P_ECONET |
79 | __PF(ECONET,econet) |
80 | #endif |
81 | |
82 | 0x8100, |
83 | ETH_P_IP |
84 | }; |
85 | #undef __PF |
86 | |
87 | /* Keep declarations above and below in sync! */ |
88 | |
89 | static const char llproto_names[] ALIGN1 = |
90 | #define __PF(f,n) #n "\0" |
91 | __PF(LOOP,loop) |
92 | __PF(PUP,pup) |
93 | #ifdef ETH_P_PUPAT |
94 | __PF(PUPAT,pupat) |
95 | #endif |
96 | __PF(IP,ip) |
97 | __PF(X25,x25) |
98 | __PF(ARP,arp) |
99 | __PF(BPQ,bpq) |
100 | #ifdef ETH_P_IEEEPUP |
101 | __PF(IEEEPUP,ieeepup) |
102 | #endif |
103 | #ifdef ETH_P_IEEEPUPAT |
104 | __PF(IEEEPUPAT,ieeepupat) |
105 | #endif |
106 | __PF(DEC,dec) |
107 | __PF(DNA_DL,dna_dl) |
108 | __PF(DNA_RC,dna_rc) |
109 | __PF(DNA_RT,dna_rt) |
110 | __PF(LAT,lat) |
111 | __PF(DIAG,diag) |
112 | __PF(CUST,cust) |
113 | __PF(SCA,sca) |
114 | __PF(RARP,rarp) |
115 | __PF(ATALK,atalk) |
116 | __PF(AARP,aarp) |
117 | __PF(IPX,ipx) |
118 | __PF(IPV6,ipv6) |
119 | #ifdef ETH_P_PPP_DISC |
120 | __PF(PPP_DISC,ppp_disc) |
121 | #endif |
122 | #ifdef ETH_P_PPP_SES |
123 | __PF(PPP_SES,ppp_ses) |
124 | #endif |
125 | #ifdef ETH_P_ATMMPOA |
126 | __PF(ATMMPOA,atmmpoa) |
127 | #endif |
128 | #ifdef ETH_P_ATMFATE |
129 | __PF(ATMFATE,atmfate) |
130 | #endif |
131 | |
132 | __PF(802_3,802_3) |
133 | __PF(AX25,ax25) |
134 | __PF(ALL,all) |
135 | __PF(802_2,802_2) |
136 | __PF(SNAP,snap) |
137 | __PF(DDCMP,ddcmp) |
138 | __PF(WAN_PPP,wan_ppp) |
139 | __PF(PPP_MP,ppp_mp) |
140 | __PF(LOCALTALK,localtalk) |
141 | __PF(PPPTALK,ppptalk) |
142 | __PF(TR_802_2,tr_802_2) |
143 | __PF(MOBITEX,mobitex) |
144 | __PF(CONTROL,control) |
145 | __PF(IRDA,irda) |
146 | #ifdef ETH_P_ECONET |
147 | __PF(ECONET,econet) |
148 | #endif |
149 | |
150 | "802.1Q" "\0" |
151 | "ipv4" "\0" |
152 | ; |
153 | #undef __PF |
154 | |
155 | |
156 | const char* FAST_FUNC ll_proto_n2a(unsigned short id, char *buf, int len) |
157 | { |
158 | unsigned i; |
159 | id = ntohs(id); |
160 | for (i = 0; i < ARRAY_SIZE(llproto_ids); i++) { |
161 | if (llproto_ids[i] == id) |
162 | return nth_string(llproto_names, i); |
163 | } |
164 | snprintf(buf, len, "[%u]", id); |
165 | return buf; |
166 | } |
167 | |
168 | int FAST_FUNC ll_proto_a2n(unsigned short *id, char *buf) |
169 | { |
170 | unsigned i; |
171 | const char *name = llproto_names; |
172 | for (i = 0; i < ARRAY_SIZE(llproto_ids); i++) { |
173 | if (strcasecmp(name, buf) == 0) { |
174 | i = llproto_ids[i]; |
175 | goto good; |
176 | } |
177 | name += strlen(name) + 1; |
178 | } |
179 | errno = 0; |
180 | i = bb_strtou(buf, NULL, 0); |
181 | if (errno || i > 0xffff) |
182 | return -1; |
183 | good: |
184 | *id = htons(i); |
185 | return 0; |
186 | } |
187 |