diff options
Diffstat (limited to 'networking/libiproute/ll_proto.c')
-rw-r--r-- | networking/libiproute/ll_proto.c | 108 |
1 files changed, 85 insertions, 23 deletions
diff --git a/networking/libiproute/ll_proto.c b/networking/libiproute/ll_proto.c index 7aac8364d..60add2f0c 100644 --- a/networking/libiproute/ll_proto.c +++ b/networking/libiproute/ll_proto.c @@ -14,19 +14,78 @@ #include <netinet/if_ether.h> -#if !ENABLE_WERROR -#warning de-bloat +/* Please conditionalize exotic protocols on CONFIG_something */ + +static const uint16_t llproto_ids[] = +#define __PF(f,n) ETH_P_##f, +__PF(LOOP,loop) +__PF(PUP,pup) +#ifdef ETH_P_PUPAT +__PF(PUPAT,pupat) #endif -/* Before re-enabling this, please (1) conditionalize exotic protocols - * on CONFIG_something, and (2) decouple strings and numbers - * (use llproto_ids[] = n,n,n..; and llproto_names[] = "loop\0" "pup\0" ...;) - */ +__PF(IP,ip) +__PF(X25,x25) +__PF(ARP,arp) +__PF(BPQ,bpq) +#ifdef ETH_P_IEEEPUP +__PF(IEEEPUP,ieeepup) +#endif +#ifdef ETH_P_IEEEPUPAT +__PF(IEEEPUPAT,ieeepupat) +#endif +__PF(DEC,dec) +__PF(DNA_DL,dna_dl) +__PF(DNA_RC,dna_rc) +__PF(DNA_RT,dna_rt) +__PF(LAT,lat) +__PF(DIAG,diag) +__PF(CUST,cust) +__PF(SCA,sca) +__PF(RARP,rarp) +__PF(ATALK,atalk) +__PF(AARP,aarp) +__PF(IPX,ipx) +__PF(IPV6,ipv6) +#ifdef ETH_P_PPP_DISC +__PF(PPP_DISC,ppp_disc) +#endif +#ifdef ETH_P_PPP_SES +__PF(PPP_SES,ppp_ses) +#endif +#ifdef ETH_P_ATMMPOA +__PF(ATMMPOA,atmmpoa) +#endif +#ifdef ETH_P_ATMFATE +__PF(ATMFATE,atmfate) +#endif + +__PF(802_3,802_3) +__PF(AX25,ax25) +__PF(ALL,all) +__PF(802_2,802_2) +__PF(SNAP,snap) +__PF(DDCMP,ddcmp) +__PF(WAN_PPP,wan_ppp) +__PF(PPP_MP,ppp_mp) +__PF(LOCALTALK,localtalk) +__PF(PPPTALK,ppptalk) +__PF(TR_802_2,tr_802_2) +__PF(MOBITEX,mobitex) +__PF(CONTROL,control) +__PF(IRDA,irda) +#ifdef ETH_P_ECONET +__PF(ECONET,econet) +#endif + +0x8100, +ETH_P_IP +; +#undef __PF + +/* Keep declarations above and below in sync! */ -#define __PF(f,n) { ETH_P_##f, #n }, -static struct { - int id; - const char *name; -} llproto_names[] = { +static const char llproto_names[] = +#define __PF(f,n) #n "\0" __PF(LOOP,loop) __PF(PUP,pup) #ifdef ETH_P_PUPAT @@ -86,9 +145,9 @@ __PF(IRDA,irda) __PF(ECONET,econet) #endif -{ 0x8100, "802.1Q" }, -{ ETH_P_IP, "ipv4" }, -}; +"802.1Q" "\0" +"ipv4" "\0" +; #undef __PF @@ -96,23 +155,26 @@ const char* FAST_FUNC ll_proto_n2a(unsigned short id, char *buf, int len) { unsigned i; id = ntohs(id); - for (i = 0; i < ARRAY_SIZE(llproto_names); i++) { - if (llproto_names[i].id == id) - return llproto_names[i].name; + for (i = 0; i < ARRAY_SIZE(llproto_ids); i++) { + if (llproto_ids[i] == id) + return nth_string(llproto_names, i); } - snprintf(buf, len, "[%d]", id); + snprintf(buf, len, "[%u]", id); return buf; } int FAST_FUNC ll_proto_a2n(unsigned short *id, char *buf) { unsigned i; - for (i = 0; i < ARRAY_SIZE(llproto_names); i++) { - if (strcasecmp(llproto_names[i].name, buf) == 0) { - i = llproto_names[i].id; - goto good; - } + const char *name = llproto_names; + for (i = 0; i < ARRAY_SIZE(llproto_ids); i++) { + if (strcasecmp(name, buf) == 0) { + i = llproto_ids[i]; + goto good; + } + name += strlen(name) + 1; } + errno = 0; i = bb_strtou(buf, NULL, 0); if (errno || i > 0xffff) return -1; |