X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/692ad810cee7a1f300ba4cb4e67306289fa550ce..d833d6c26a2f6a503cbabbbad24b44da8b3dcf92:/radius.c diff --git a/radius.c b/radius.c index 17488ac..d1d5894 100644 --- a/radius.c +++ b/radius.c @@ -1,6 +1,6 @@ // L2TPNS Radius Stuff -char const *cvs_id_radius = "$Id: radius.c,v 1.21 2005-01-05 13:45:49 bodea Exp $"; +char const *cvs_id_radius = "$Id: radius.c,v 1.23 2005-01-25 04:19:06 bodea Exp $"; #include #include @@ -337,9 +337,7 @@ void radiussend(uint16_t r, uint8_t state) { // get radius port uint16_t port = config->radiusport[(radius[r].try - 1) % config->numradiusservers]; - // no need to define the accounting port for itself: - // the accounting port is as far as I know always one more - // than the auth port JK 20040713 + // assume RADIUS accounting port is the authentication port +1 addr.sin_port = htons((state == RADIUSAUTH) ? port : port+1); } @@ -621,12 +619,38 @@ void processrad(uint8_t *buf, int len, char socket_index) } while (newp); free(avpair); } + else if (*p == 99) + { + // Framed-IPv6-Route + struct in6_addr r6; + int prefixlen; + uint8_t *n = p + 2; + uint8_t *e = p + p[1]; + uint8_t *m = strchr(n, '/'); + + *m++ = 0; + inet_pton(AF_INET6, n, &r6); + + prefixlen = 0; + while (m < e && isdigit(*m)) { + prefixlen = prefixlen * 10 + *m++ - '0'; + } + + if (prefixlen) + { + LOG(3, s, session[s].tunnel, + " Radius reply contains route for %s/%d\n", + n, prefixlen); + session[s].ipv6route = r6; + session[s].ipv6prefixlen = prefixlen; + } + } } } else if (r_code == AccessReject) { LOG(2, s, session[s].tunnel, " Authentication denied for %s\n", session[s].user); -//FIXME: We should tear down the session here! + sessionshutdown(s, "Authentication denied"); break; }