OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [libnetworking/] [libc/] [linkaddr.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*-
2
 * Copyright (c) 1990, 1993
3
 *      The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 * 3. All advertising materials mentioning features or use of this software
14
 *    must display the following acknowledgement:
15
 *      This product includes software developed by the University of
16
 *      California, Berkeley and its contributors.
17
 * 4. Neither the name of the University nor the names of its contributors
18
 *    may be used to endorse or promote products derived from this software
19
 *    without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
 * SUCH DAMAGE.
32
 *
33
 *  linkaddr.c,v 1.3 2000/12/08 22:06:54 joel Exp
34
 */
35
 
36
#if defined(LIBC_SCCS) && !defined(lint)
37
static char sccsid[] = "@(#)linkaddr.c  8.1 (Berkeley) 6/4/93";
38
#endif /* LIBC_SCCS and not lint */
39
 
40
#include <sys/types.h>
41
#include <sys/socket.h>
42
#include <net/if_dl.h>
43
#include <string.h>
44
 
45
/* States*/
46
#define NAMING  0
47
#define GOTONE  1
48
#define GOTTWO  2
49
#define RESET   3
50
/* Inputs */
51
#define DIGIT   (4*0)
52
#define END     (4*1)
53
#define DELIM   (4*2)
54
#define LETTER  (4*3)
55
 
56
void
57
link_addr(addr, sdl)
58
        register const char *addr;
59
        register struct sockaddr_dl *sdl;
60
{
61
        register char *cp = sdl->sdl_data;
62
        char *cplim = sdl->sdl_len + (char *)sdl;
63
        register int byte = 0, state = NAMING,
64
                new=0; /* new=0 to avoid warning */
65
 
66
        bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1);
67
        sdl->sdl_family = AF_LINK;
68
        do {
69
                state &= ~LETTER;
70
                if ((*addr >= '0') && (*addr <= '9')) {
71
                        new = *addr - '0';
72
                } else if ((*addr >= 'a') && (*addr <= 'f')) {
73
                        new = *addr - 'a' + 10;
74
                } else if ((*addr >= 'A') && (*addr <= 'F')) {
75
                        new = *addr - 'A' + 10;
76
                } else if (*addr == 0) {
77
                        state |= END;
78
                } else if (state == NAMING &&
79
                           (((*addr >= 'A') && (*addr <= 'Z')) ||
80
                           ((*addr >= 'a') && (*addr <= 'z'))))
81
                        state |= LETTER;
82
                else
83
                        state |= DELIM;
84
                addr++;
85
                switch (state /* | INPUT */) {
86
                case NAMING | DIGIT:
87
                case NAMING | LETTER:
88
                        *cp++ = addr[-1];
89
                        continue;
90
                case NAMING | DELIM:
91
                        state = RESET;
92
                        sdl->sdl_nlen = cp - sdl->sdl_data;
93
                        continue;
94
                case GOTTWO | DIGIT:
95
                        *cp++ = byte;
96
                        /* FALLTHROUGH */
97
                case RESET | DIGIT:
98
                        state = GOTONE;
99
                        byte = new;
100
                        continue;
101
                case GOTONE | DIGIT:
102
                        state = GOTTWO;
103
                        byte = new + (byte << 4);
104
                        continue;
105
                default: /* | DELIM */
106
                        state = RESET;
107
                        *cp++ = byte;
108
                        byte = 0;
109
                        continue;
110
                case GOTONE | END:
111
                case GOTTWO | END:
112
                        *cp++ = byte;
113
                        /* FALLTHROUGH */
114
                case RESET | END:
115
                        break;
116
                }
117
                break;
118
        } while (cp < cplim);
119
        sdl->sdl_alen = cp - LLADDR(sdl);
120
        new = cp - (char *)sdl;
121
        if (new > sizeof(*sdl))
122
                sdl->sdl_len = new;
123
        return;
124
}
125
 
126
static char hexlist[] = "0123456789abcdef";
127
 
128
char *
129
link_ntoa(sdl)
130
        register const struct sockaddr_dl *sdl;
131
{
132
        static char obuf[64];
133
        register char *out = obuf;
134
        register int i;
135
        register u_char *in = (u_char *)LLADDR(sdl);
136
        u_char *inlim = in + sdl->sdl_alen;
137
        int firsttime = 1;
138
 
139
        if (sdl->sdl_nlen) {
140
                bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
141
                out += sdl->sdl_nlen;
142
                if (sdl->sdl_alen)
143
                        *out++ = ':';
144
        }
145
        while (in < inlim) {
146
                if (firsttime)
147
                        firsttime = 0;
148
                else
149
                        *out++ = '.';
150
                i = *in++;
151
                if (i > 0xf) {
152
                        out[1] = hexlist[i & 0xf];
153
                        i >>= 4;
154
                        out[0] = hexlist[i];
155
                        out += 2;
156
                } else
157
                        *out++ = hexlist[i];
158
        }
159
        *out = 0;
160
        return (obuf);
161
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.