--- src/pppoe.c 2012/10/24 10:32:49 1.129 +++ src/pppoe.c 2013/07/01 14:22:49 1.132 @@ -50,6 +50,7 @@ char hook[NG_HOOKSIZ]; /* hook on that node */ char session[MAX_SESSION]; /* session name */ char acname[PPPOE_SERVICE_NAME_SIZE]; /* AC name */ + int mac_format; /* MAC address format */ u_char peeraddr[6]; /* Peer MAC address */ char real_session[MAX_SESSION]; /* real session name */ char agent_cid[64]; /* Agent Circuit ID */ @@ -69,7 +70,16 @@ enum { SET_IFACE, SET_SESSION, - SET_ACNAME + SET_ACNAME, + SET_MAC_FORMAT +}; + +/* MAC format options */ +enum { + MAC_UNFORMATTED = 0, + MAC_UNIX_LIKE, + MAC_CISCO_LIKE, + MAC_IETF }; /* @@ -164,6 +174,8 @@ PppoeSetCommand, NULL, 2, (void *)SET_SESSION }, { "acname {name}", "Set PPPoE access concentrator name", PppoeSetCommand, NULL, 2, (void *)SET_ACNAME }, + { "mac-format {format}", "set radius attribute 31 mac format", + PppoeSetCommand, NULL, 2, (void *)SET_MAC_FORMAT }, { NULL }, }; @@ -213,6 +225,7 @@ pe->agent_cid[0] = 0; pe->agent_rid[0] = 0; pe->PIf = NULL; + pe->mac_format = MAC_UNFORMATTED; /* Done */ return(0); @@ -551,10 +564,29 @@ const PppoeInfo pe = (PppoeInfo)ctx->lnk->info; char buf[32]; + switch (pe->mac_format) { + case MAC_UNFORMATTED: + sprintf(buf, "unformatted"); + break; + case MAC_UNIX_LIKE: + sprintf(buf, "unix-like"); + break; + case MAC_CISCO_LIKE: + sprintf(buf, "cisco-like"); + break; + case MAC_IETF: + sprintf(buf, "ietf"); + break; + default: + sprintf(buf, "unknown"); + break; + } + Printf("PPPoE configuration:\r\n"); Printf("\tIface Node : %s\r\n", pe->path); Printf("\tIface Hook : %s\r\n", pe->hook); Printf("\tSession : %s\r\n", pe->session); + Printf("\tMAC format : %s\r\n", buf); Printf("PPPoE status:\r\n"); if (ctx->lnk->state != PHYS_STATE_DOWN) { Printf("\tOpened : %s\r\n", (pe->opened?"YES":"NO")); @@ -615,7 +647,30 @@ PppoeInfo const pppoe = (PppoeInfo)l->info; if (pppoe->incoming) { - ether_ntoa_r((struct ether_addr *)pppoe->peeraddr, buf); + switch (pppoe->mac_format) { + case MAC_UNFORMATTED: + snprintf(buf, buf_len, "%02x%02x%02x%02x%02x%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + case MAC_UNIX_LIKE: + ether_ntoa_r((struct ether_addr *)pppoe->peeraddr, buf); + break; + case MAC_CISCO_LIKE: + snprintf(buf, buf_len, "%02x%02x.%02x%02x.%02x%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + case MAC_IETF: + snprintf(buf, buf_len, "%02x-%02x-%02x-%02x-%02x-%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + default: + sprintf(buf, "unknown"); + return(-1); + break; + } } else { strlcpy(buf, pppoe->real_session, buf_len); } @@ -629,7 +684,30 @@ PppoeInfo const pppoe = (PppoeInfo)l->info; if (!pppoe->incoming) { - ether_ntoa_r((struct ether_addr *)pppoe->peeraddr, buf); + switch (pppoe->mac_format) { + case MAC_UNFORMATTED: + snprintf(buf, buf_len, "%02x%02x%02x%02x%02x%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + case MAC_UNIX_LIKE: + ether_ntoa_r((struct ether_addr *)pppoe->peeraddr, buf); + break; + case MAC_CISCO_LIKE: + snprintf(buf, buf_len, "%02x%02x.%02x%02x.%02x%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + case MAC_IETF: + snprintf(buf, buf_len, "%02x-%02x-%02x-%02x-%02x-%02x", + pppoe->peeraddr[0], pppoe->peeraddr[1], pppoe->peeraddr[2], + pppoe->peeraddr[3], pppoe->peeraddr[4], pppoe->peeraddr[5]); + break; + default: + sprintf(buf, "unknown"); + return(-1); + break; + } } else { strlcpy(buf, pppoe->real_session, buf_len); } @@ -1377,6 +1455,21 @@ return(-1); strlcpy(pi->acname, av[0], sizeof(pi->acname)); break; + case SET_MAC_FORMAT: + if (ac != 1) + return(-1); + if (strcmp(av[0], "unformatted") == 0) { + pi->mac_format = MAC_UNFORMATTED; + } else if (strcmp(av[0], "unix-like") == 0) { + pi->mac_format = MAC_UNIX_LIKE; + } else if (strcmp(av[0], "cisco-like") == 0) { + pi->mac_format = MAC_CISCO_LIKE; + } else if (strcmp(av[0], "ietf") == 0) { + pi->mac_format = MAC_IETF; + } else { + Error("Incorrect pppoe mac-format"); + } + break; default: assert(0); }