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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [libnetworking/] [libc/] [linkaddr.c] - Blame information for rev 590

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*-
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
 *  $Id: linkaddr.c,v 1.2 2001-09-27 12:01:53 chris 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, new;
64
 
65
        bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1);
66
        sdl->sdl_family = AF_LINK;
67
        do {
68
                state &= ~LETTER;
69
                if ((*addr >= '0') && (*addr <= '9')) {
70
                        new = *addr - '0';
71
                } else if ((*addr >= 'a') && (*addr <= 'f')) {
72
                        new = *addr - 'a' + 10;
73
                } else if ((*addr >= 'A') && (*addr <= 'F')) {
74
                        new = *addr - 'A' + 10;
75
                } else if (*addr == 0) {
76
                        state |= END;
77
                } else if (state == NAMING &&
78
                           (((*addr >= 'A') && (*addr <= 'Z')) ||
79
                           ((*addr >= 'a') && (*addr <= 'z'))))
80
                        state |= LETTER;
81
                else
82
                        state |= DELIM;
83
                addr++;
84
                switch (state /* | INPUT */) {
85
                case NAMING | DIGIT:
86
                case NAMING | LETTER:
87
                        *cp++ = addr[-1];
88
                        continue;
89
                case NAMING | DELIM:
90
                        state = RESET;
91
                        sdl->sdl_nlen = cp - sdl->sdl_data;
92
                        continue;
93
                case GOTTWO | DIGIT:
94
                        *cp++ = byte;
95
                        /* FALLTHROUGH */
96
                case RESET | DIGIT:
97
                        state = GOTONE;
98
                        byte = new;
99
                        continue;
100
                case GOTONE | DIGIT:
101
                        state = GOTTWO;
102
                        byte = new + (byte << 4);
103
                        continue;
104
                default: /* | DELIM */
105
                        state = RESET;
106
                        *cp++ = byte;
107
                        byte = 0;
108
                        continue;
109
                case GOTONE | END:
110
                case GOTTWO | END:
111
                        *cp++ = byte;
112
                        /* FALLTHROUGH */
113
                case RESET | END:
114
                        break;
115
                }
116
                break;
117
        } while (cp < cplim);
118
        sdl->sdl_alen = cp - LLADDR(sdl);
119
        new = cp - (char *)sdl;
120
        if (new > sizeof(*sdl))
121
                sdl->sdl_len = new;
122
        return;
123
}
124
 
125
static char hexlist[] = "0123456789abcdef";
126
 
127
char *
128
link_ntoa(sdl)
129
        register const struct sockaddr_dl *sdl;
130
{
131
        static char obuf[64];
132
        register char *out = obuf;
133
        register int i;
134
        register u_char *in = (u_char *)LLADDR(sdl);
135
        u_char *inlim = in + sdl->sdl_alen;
136
        int firsttime = 1;
137
 
138
        if (sdl->sdl_nlen) {
139
                bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
140
                out += sdl->sdl_nlen;
141
                if (sdl->sdl_alen)
142
                        *out++ = ':';
143
        }
144
        while (in < inlim) {
145
                if (firsttime)
146
                        firsttime = 0;
147
                else
148
                        *out++ = '.';
149
                i = *in++;
150
                if (i > 0xf) {
151
                        out[1] = hexlist[i & 0xf];
152
                        i >>= 4;
153
                        out[0] = hexlist[i];
154
                        out += 2;
155
                } else
156
                        *out++ = hexlist[i];
157
        }
158
        *out = 0;
159
        return (obuf);
160
}

powered by: WebSVN 2.1.0

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