/[mac2eui64]/trunk/mac2eui64.c
ViewVC logotype

Annotation of /trunk/mac2eui64.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (hide annotations) (download)
2015-09-29T08:31:02Z (8 years, 9 months ago) by trond
Content type: text/plain
File size: 8801 byte(s)
Changed the email address.
Changed from gcc to clang36.
Updated to code to reflect current standards.

1 trond 3 /*
2     mac2eui64.c
3    
4     Conversion from the IEEE 802 MAC format to the IEEE EUI-64 format.
5     Displays values suitable for use as a 64 bit interface ID in A6 RRs.
6     Also displayed are labels suitable for use with PTR RRs in the
7 trond 4 reverse zone ip6.arpa.
8 trond 3
9 trond 4 Updated in 2015 to conform to ISO C 2011.
10 trond 3
11 trond 4 Copyright (C) 2003 Trond Endrestøl <Trond.Endrestol@ximalas.info>
12    
13 trond 3 This program is free software; you can redistribute it and/or modify
14     it under the terms of the GNU General Public License as published by
15     the Free Software Foundation; either version 2 of the License, or
16     (at your option) any later version.
17    
18     This program is distributed in the hope that it will be useful,
19     but WITHOUT ANY WARRANTY; without even the implied warranty of
20     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21     GNU General Public License for more details.
22    
23     You should have received a copy of the GNU General Public License
24     along with this program; if not, write to the Free Software
25     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26    
27     $Ximalas$
28     */
29     #include <ctype.h>
30     #include <stdio.h>
31     #include <stdlib.h>
32     #include <unistd.h>
33    
34 trond 4 void Usage(const char * const argv0, int ReturnValue) __attribute__((noreturn));
35     void Version(const char * const argv0) __attribute__((noreturn));
36     void TransformMAC(const char * const argv0, const char * const argvi);
37    
38 trond 3 int main(int argc, char **argv)
39     {
40     int c;
41 trond 4 ssize_t i;
42 trond 3
43     opterr = 0;
44     while ((c = getopt(argc, argv, "hv")) != -1) {
45     switch (c) {
46     case 'h':
47     Usage(argv[0], EXIT_SUCCESS);
48 trond 4 //break;
49 trond 3
50     case 'v':
51     Version(argv[0]);
52 trond 4 //break;
53 trond 3
54     case '?':
55     fprintf(stderr, "%s: invalid option -%c\n", argv[0], optopt);
56     break;
57    
58     default:
59     fprintf(stderr, "%s: something is dead wrong with getopt() or with this program\n", argv[0]);
60     return EXIT_FAILURE;
61 trond 4 //break;
62 trond 3 }
63     }
64    
65     i = optind;
66    
67     if (i == argc)
68     Usage(argv[0], EXIT_FAILURE);
69    
70     TransformMAC(argv[0], argv[i++]);
71    
72     while (i < argc) {
73     puts("");
74     TransformMAC(argv[0], argv[i++]);
75     }
76    
77     return EXIT_SUCCESS;
78     } /* main() */
79    
80     void Usage(const char * const argv0, int ReturnValue)
81     {
82     fprintf((ReturnValue == EXIT_SUCCESS) ? stdout : stderr,
83     "Usage: %s [-h | -v | <macaddress1> [macaddress2] ... [macaddressN]]\n\n"
84    
85     "Options:\n"
86     "-h show this help\n"
87     "-v display version and copyright\n\n"
88    
89     "MAC addresses must consist of 12 hex digits with leading zeroes.\n"
90     "Any punctuation is ignored. Examples of valid MAC addresses:\n\n"
91    
92     " 00:50:DA:2C:8F:55\n"
93     " 00-50-DA-2C-8F-55\n"
94     " 0050.DA2C.8F55\n"
95     " 0050DA2C8F55\n",
96     argv0);
97     exit(ReturnValue);
98     } /* Usage() */
99    
100     void Version(const char * const argv0)
101     {
102     printf("%s version 1.0\n\n"
103    
104     "Conversion from the IEEE 802 MAC format to the IEEE EUI-64 format.\n"
105     "Displays values suitable for use as a 64 bit interface ID in A6 RRs.\n"
106     "Also displayed are labels suitable for use with PTR RRs in the\n"
107 trond 4 "reverse zone ip6.arpa.\n\n"
108 trond 3
109 trond 4 "Updated in 2015 to conform to ISO C 2011.\n\n"
110 trond 3
111 trond 4 "Copyright (C) 2003 Trond Endrestøl <Trond.Endrestol@ximalas.info>\n\n"
112    
113 trond 3 "This program is free software; you can redistribute it and/or modify\n"
114     "it under the terms of the GNU General Public License as published by\n"
115     "the Free Software Foundation; either version 2 of the License, or\n"
116     "(at your option) any later version.\n\n"
117    
118     "This program is distributed in the hope that it will be useful,\n"
119     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
120     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
121     "GNU General Public License for more details.\n\n"
122    
123     "You should have received a copy of the GNU General Public License\n"
124     "along with this program; if not, write to the Free Software\n"
125     "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.\n",
126     argv0);
127    
128     exit(EXIT_SUCCESS);
129     } /* Version */
130    
131 trond 4 int ConstructMAC(const char *argvi, unsigned char *MAC);
132     void ConstructEUI64(const unsigned char * const MAC, unsigned char * const EUI64);
133     void InvertUniversalLocalBit(unsigned char * const EUI64);
134    
135     void PrintMAC(const unsigned char * const MAC);
136     void PrintEUI64(const unsigned char * const EUI64);
137     void PrintEUI64_InterfaceID(const unsigned char * const EUI64);
138     void PrintEUI64_IP6_ARPA(const unsigned char * const EUI64);
139     //void PrintEUI64_IP6_INT(const unsigned char * const EUI64);
140    
141 trond 3 void TransformMAC(const char * const argv0, const char * const argvi)
142     {
143     unsigned char MAC[6], EUI64[8];
144    
145     if (ConstructMAC(argvi, MAC)) {
146     fprintf(stderr, "%s: invalid MAC address: %s\n", argv0, argvi);
147     return;
148     }
149    
150     ConstructEUI64(MAC, EUI64);
151    
152     PrintMAC(MAC);
153     PrintEUI64(EUI64);
154    
155     /* Transform the EUI-64 address into
156     the Modified EUI-64 address for use as
157     the value for the interface ID */
158     InvertUniversalLocalBit(EUI64);
159    
160     PrintEUI64_InterfaceID(EUI64);
161     PrintEUI64_IP6_ARPA(EUI64);
162 trond 4 //PrintEUI64_IP6_INT(EUI64);
163 trond 3 } /* TransformMAC() */
164    
165     int ConstructMAC(const char *argvi, unsigned char * MAC)
166     {
167     unsigned char ConstructHexByte(unsigned char MSNybble, unsigned char LSNybble);
168    
169     int ReturnValue = EXIT_SUCCESS, NumDigits = 0;
170     size_t i = 0;
171     unsigned char MSNybble, LSNybble;
172    
173     while (*argvi) {
174     if (isxdigit(*argvi)) {
175     NumDigits++;
176 trond 4 MSNybble = (unsigned char)*argvi++;
177 trond 3
178     if (!isxdigit(*argvi)) {
179     break;
180     }
181    
182     NumDigits++;
183 trond 4 LSNybble = (unsigned char)*argvi;
184 trond 3
185     MAC[i++] = ConstructHexByte(MSNybble, LSNybble);
186     }
187    
188     argvi++;
189     }
190    
191     if (NumDigits != 12)
192     ReturnValue = EXIT_FAILURE;
193    
194     return ReturnValue;
195     } /* ConstructMAC() */
196    
197 trond 4 unsigned char ConstructHexByte(unsigned char MSNybble, unsigned char LSNybble);
198    
199 trond 3 unsigned char ConstructHexByte(unsigned char MSNybble, unsigned char LSNybble)
200     {
201     unsigned char Byte;
202    
203 trond 4 MSNybble = (unsigned char)toupper(MSNybble);
204     LSNybble = (unsigned char)toupper(LSNybble);
205 trond 3
206     if (MSNybble >= 'A') {
207     MSNybble = 0x0A + MSNybble - 'A';
208     }
209     else {
210     MSNybble -= '0';
211     }
212    
213     if (LSNybble >= 'A') {
214     LSNybble = 0x0A + LSNybble - 'A';
215     }
216     else {
217     LSNybble -= '0';
218     }
219    
220 trond 4 Byte = (unsigned char)((MSNybble << 4) | LSNybble);
221 trond 3
222     return Byte;
223     } /* ConstructHexByte() */
224    
225     void ConstructEUI64(const unsigned char * const MAC, unsigned char * const EUI64)
226     {
227     EUI64[0] = MAC[0];
228     EUI64[1] = MAC[1];
229     EUI64[2] = MAC[2];
230     EUI64[3] = 0xFF;
231     EUI64[4] = 0xFE;
232     EUI64[5] = MAC[3];
233     EUI64[6] = MAC[4];
234     EUI64[7] = MAC[5];
235     } /* ConstructEUI64() */
236    
237     void InvertUniversalLocalBit(unsigned char * const EUI64)
238     {
239     if (EUI64[0] & 0x02)
240     EUI64[0] &= ~0x02;
241     else
242     EUI64[0] |= 0x02;
243     } /* InvertUniversalLocalBit() */
244    
245     void PrintMAC(const unsigned char * const MAC)
246     {
247     printf("MAC:\t\t%02X:%02X:%02X:%02X:%02X:%02X\n",
248     MAC[0], MAC[1], MAC[2], MAC[3], MAC[4], MAC[5]);
249     } /* PrintMAC() */
250    
251     void PrintEUI64(const unsigned char * const EUI64)
252     {
253     printf("EUI-64:\t\t%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
254     EUI64[0], EUI64[1], EUI64[2], EUI64[3],
255     EUI64[4], EUI64[5], EUI64[6], EUI64[7]);
256     } /* PrintEUI64() */
257    
258     void PrintEUI64_InterfaceID(const unsigned char * const EUI64)
259     {
260     printf("Interface ID:\t::%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
261     EUI64[0], EUI64[1], EUI64[2], EUI64[3],
262     EUI64[4], EUI64[5], EUI64[6], EUI64[7]);
263     } /* PrintEUI64_InterfaceID() */
264    
265 trond 4 void PrintEUI64_IP6_ARPA(const unsigned char * const EUI64)
266 trond 3 {
267 trond 4 // printf("ip6.arpa:\t\\[x%02X%02X%02X%02X%02X%02X%02X%02X/64]\n",
268     // EUI64[0], EUI64[1], EUI64[2], EUI64[3],
269     // EUI64[4], EUI64[5], EUI64[6], EUI64[7]);
270    
271     printf("ip6.arpa/64:\t%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x\n",
272 trond 3 EUI64[7] & 0x0F, EUI64[7] >> 4,
273     EUI64[6] & 0x0F, EUI64[6] >> 4,
274     EUI64[5] & 0x0F, EUI64[5] >> 4,
275     EUI64[4] & 0x0F, EUI64[4] >> 4,
276     EUI64[3] & 0x0F, EUI64[3] >> 4,
277     EUI64[2] & 0x0F, EUI64[2] >> 4,
278     EUI64[1] & 0x0F, EUI64[1] >> 4,
279     EUI64[0] & 0x0F, EUI64[0] >> 4);
280     } /* PrintEUI64_IP6_ARPA() */
281    
282 trond 4 //void PrintEUI64_IP6_INT(const unsigned char * const EUI64)
283     //{
284     // printf("ip6.int/64:\t%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x\n",
285     // EUI64[7] & 0x0F, EUI64[7] >> 4,
286     // EUI64[6] & 0x0F, EUI64[6] >> 4,
287     // EUI64[5] & 0x0F, EUI64[5] >> 4,
288     // EUI64[4] & 0x0F, EUI64[4] >> 4,
289     // EUI64[3] & 0x0F, EUI64[3] >> 4,
290     // EUI64[2] & 0x0F, EUI64[2] >> 4,
291     // EUI64[1] & 0x0F, EUI64[1] >> 4,
292     // EUI64[0] & 0x0F, EUI64[0] >> 4);
293     //} /* PrintEUI64_IP6_INT() */
294    
295 trond 3 /* mac2eui64.c */

Properties

Name Value
svn:eol-style native
svn:keywords Ximalas=%H
svn:mime-type text/plain

svn@ximalas.info
ViewVC Help
Powered by ViewVC 1.3.0-dev