Fix link-layer address parsing. Add debug statements.

Cosmetic: fix copyright whitespace.
This commit is contained in:
dyoung 2008-05-12 21:54:51 +00:00
parent 8c56a7ef60
commit 85a29f7ecc
1 changed files with 15 additions and 5 deletions

View File

@ -1,7 +1,7 @@
/* $NetBSD: parse.c,v 1.6 2008/05/12 00:39:18 dyoung Exp $ */
/* $NetBSD: parse.c,v 1.7 2008/05/12 21:54:51 dyoung Exp $ */
/*-
* Copyright (c)2008 David Young. All rights reserved.
* Copyright (c) 2008 David Young. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -224,9 +224,9 @@ parse_linkaddr(const char *addr, struct sockaddr_storage *ss)
sizeof(*ss) - offsetof(struct sockaddr_dl, sdl_data[0]);
enum {
LLADDR_S_INITIAL = 0,
LLADDR_S_ONE_OCTET,
LLADDR_S_TWO_OCTETS,
LLADDR_S_COLON
LLADDR_S_ONE_OCTET = 1,
LLADDR_S_TWO_OCTETS = 2,
LLADDR_S_COLON = 3
} state = LLADDR_S_INITIAL;
uint8_t octet = 0, val;
struct sockaddr_dl *sdl;
@ -238,21 +238,29 @@ parse_linkaddr(const char *addr, struct sockaddr_storage *ss)
sdl = (struct sockaddr_dl *)ss;
for (i = 0, p = addr; i < maxlen; p++) {
dbg_warnx("%s.%d: *p == %c, state %d", __func__, __LINE__, *p,
state);
if (*p == '\0') {
dbg_warnx("%s.%d", __func__, __LINE__);
if (state != LLADDR_S_ONE_OCTET &&
state != LLADDR_S_TWO_OCTETS)
return -1;
dbg_warnx("%s.%d", __func__, __LINE__);
sdl->sdl_data[i++] = octet;
sdl->sdl_len =
offsetof(struct sockaddr_dl, sdl_data[i]);
sdl->sdl_alen = i;
return 0;
}
if (*p == ':') {
dbg_warnx("%s.%d", __func__, __LINE__);
if (state != LLADDR_S_ONE_OCTET &&
state != LLADDR_S_TWO_OCTETS)
return -1;
dbg_warnx("%s.%d", __func__, __LINE__);
sdl->sdl_data[i++] = octet;
state = LLADDR_S_COLON;
continue;
}
if ('a' <= *p && *p <= 'f')
val = 10 + *p - 'a';
@ -263,6 +271,7 @@ parse_linkaddr(const char *addr, struct sockaddr_storage *ss)
else
return -1;
dbg_warnx("%s.%d", __func__, __LINE__);
if (state == LLADDR_S_ONE_OCTET) {
state = LLADDR_S_TWO_OCTETS;
octet <<= 4;
@ -273,6 +282,7 @@ parse_linkaddr(const char *addr, struct sockaddr_storage *ss)
state = LLADDR_S_ONE_OCTET;
octet = val;
}
dbg_warnx("%s.%d", __func__, __LINE__);
}
return -1;
}