]>
Commit | Line | Data |
---|---|---|
aba5acdf SH |
1 | /* |
2 | * ll_proto.c | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | * | |
9 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | |
10 | */ | |
11 | ||
12 | #include <stdio.h> | |
13 | #include <stdlib.h> | |
14 | #include <unistd.h> | |
15 | #include <syslog.h> | |
16 | #include <fcntl.h> | |
17 | #include <sys/ioctl.h> | |
18 | #include <sys/socket.h> | |
19 | #include <sys/ioctl.h> | |
aba5acdf SH |
20 | #include <netinet/in.h> |
21 | #include <arpa/inet.h> | |
22 | #include <string.h> | |
23 | ||
ea7436fb SH |
24 | #include <linux/netdevice.h> |
25 | #include <linux/if_arp.h> | |
26 | #include <linux/sockios.h> | |
27 | ||
aba5acdf | 28 | #include "utils.h" |
ea7436fb | 29 | #include "rt_names.h" |
aba5acdf SH |
30 | |
31 | ||
32 | #define __PF(f,n) { ETH_P_##f, #n }, | |
75dbf137 | 33 | static const struct { |
aba5acdf | 34 | int id; |
ea7436fb | 35 | const char *name; |
aba5acdf SH |
36 | } llproto_names[] = { |
37 | __PF(LOOP,loop) | |
ae665a52 | 38 | __PF(PUP,pup) |
aba5acdf | 39 | __PF(PUPAT,pupat) |
aba5acdf SH |
40 | __PF(IP,ip) |
41 | __PF(X25,x25) | |
42 | __PF(ARP,arp) | |
43 | __PF(BPQ,bpq) | |
aba5acdf | 44 | __PF(IEEEPUP,ieeepup) |
aba5acdf | 45 | __PF(IEEEPUPAT,ieeepupat) |
ae665a52 SH |
46 | __PF(DEC,dec) |
47 | __PF(DNA_DL,dna_dl) | |
48 | __PF(DNA_RC,dna_rc) | |
49 | __PF(DNA_RT,dna_rt) | |
50 | __PF(LAT,lat) | |
51 | __PF(DIAG,diag) | |
52 | __PF(CUST,cust) | |
53 | __PF(SCA,sca) | |
54 | __PF(RARP,rarp) | |
55 | __PF(ATALK,atalk) | |
56 | __PF(AARP,aarp) | |
57 | __PF(IPX,ipx) | |
58 | __PF(IPV6,ipv6) | |
aba5acdf | 59 | __PF(PPP_DISC,ppp_disc) |
aba5acdf | 60 | __PF(PPP_SES,ppp_ses) |
aba5acdf | 61 | __PF(ATMMPOA,atmmpoa) |
aba5acdf | 62 | __PF(ATMFATE,atmfate) |
ae665a52 SH |
63 | __PF(802_3,802_3) |
64 | __PF(AX25,ax25) | |
65 | __PF(ALL,all) | |
66 | __PF(802_2,802_2) | |
67 | __PF(SNAP,snap) | |
68 | __PF(DDCMP,ddcmp) | |
69 | __PF(WAN_PPP,wan_ppp) | |
70 | __PF(PPP_MP,ppp_mp) | |
71 | __PF(LOCALTALK,localtalk) | |
98f9a1d2 | 72 | __PF(CAN,can) |
ae665a52 SH |
73 | __PF(PPPTALK,ppptalk) |
74 | __PF(TR_802_2,tr_802_2) | |
75 | __PF(MOBITEX,mobitex) | |
76 | __PF(CONTROL,control) | |
77 | __PF(IRDA,irda) | |
aba5acdf | 78 | __PF(ECONET,econet) |
10bd7e84 SH |
79 | __PF(TIPC,tipc) |
80 | __PF(AOE,aoe) | |
aba5acdf SH |
81 | |
82 | { 0x8100, "802.1Q" }, | |
75dbf137 | 83 | { 0x88cc, "LLDP" }, |
aba5acdf SH |
84 | { ETH_P_IP, "ipv4" }, |
85 | }; | |
86 | #undef __PF | |
87 | ||
88 | ||
ea7436fb | 89 | const char * ll_proto_n2a(unsigned short id, char *buf, int len) |
aba5acdf SH |
90 | { |
91 | int i; | |
92 | ||
93 | id = ntohs(id); | |
94 | ||
95 | for (i=0; i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) { | |
96 | if (llproto_names[i].id == id) | |
97 | return llproto_names[i].name; | |
98 | } | |
99 | snprintf(buf, len, "[%d]", id); | |
100 | return buf; | |
101 | } | |
102 | ||
103 | int ll_proto_a2n(unsigned short *id, char *buf) | |
104 | { | |
105 | int i; | |
106 | for (i=0; i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) { | |
107 | if (strcasecmp(llproto_names[i].name, buf) == 0) { | |
108 | *id = htons(llproto_names[i].id); | |
109 | return 0; | |
110 | } | |
111 | } | |
112 | if (get_u16(id, buf, 0)) | |
113 | return -1; | |
114 | *id = htons(*id); | |
115 | return 0; | |
116 | } |