]> git.ozlabs.org Git - ppp.git/commitdiff
radius: Handle IPv6 RADIUS attributes (#176)
authorAlarig Le Lay <alarig@swordarmor.fr>
Thu, 31 Dec 2020 01:25:07 +0000 (02:25 +0100)
committerGitHub <noreply@github.com>
Thu, 31 Dec 2020 01:25:07 +0000 (12:25 +1100)
Signed-off-by: Alarig Le Lay <alarig@swordarmor.fr>
pppd/plugins/radius/avpair.c
pppd/plugins/radius/dict.c
pppd/plugins/radius/radiusclient.h

index ebc1895c0a6900d79e8d799e596e1169dcaad8e4..b97a7cf3632fbf4dcdccf51e724abe68c59ac897 100644 (file)
@@ -222,6 +222,9 @@ VALUE_PAIR *rc_avpair_gen (AUTH_HDR *auth)
                        {
 
                            case PW_TYPE_STRING:
+                           case PW_TYPE_IFID:
+                           case PW_TYPE_IPV6ADDR:
+                           case PW_TYPE_IPV6PREFIX:
                                memcpy (pair->strvalue, (char *) ptr, (size_t) attrlen);
                                pair->strvalue[attrlen] = '\0';
                                pair->lvalue = attrlen;
@@ -692,9 +695,10 @@ int rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair)
 int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv)
 {
        DICT_VALUE     *dval;
-       char            buffer[32];
+       char            buffer[INET6_ADDRSTRLEN + 4]; // for a prefix: addr + '/' + prefixlen
        struct in_addr  inad;
        unsigned char         *ptr;
+       char            *str;
 
        *name = *value = '\0';
 
@@ -753,6 +757,26 @@ int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv)
                strncpy(value, buffer, lv-1);
                break;
 
+           case PW_TYPE_IFID:
+               ptr = pair->strvalue;
+               snprintf(buffer, sizeof (buffer), "%x:%x:%x:%x",
+                        (ptr[0] << 8) + ptr[1], (ptr[2] << 8) + ptr[3],
+                        (ptr[4] << 8) + ptr[5], (ptr[6] << 8) + ptr[7]);
+               strncpy(value, buffer, lv-1);
+               break;
+
+           case PW_TYPE_IPV6ADDR:
+               inet_ntop(AF_INET6, pair->strvalue, buffer, sizeof (buffer));
+               strncpy(value, buffer, lv-1);
+               break;
+
+           case PW_TYPE_IPV6PREFIX:
+               inet_ntop(AF_INET6, pair->strvalue + 2, buffer, sizeof (buffer));
+               str = buffer + strlen(buffer);
+               snprintf(str, sizeof (buffer) - (str - buffer), "/%d", *(pair->strvalue + 1));
+               strncpy(value, buffer, lv-1);
+               break;
+
            default:
                error("rc_avpair_tostr: unknown attribute type %d", pair->type);
                return (-1);
index 72b3e708cb20718c897d3d3bc1cfd377a15c6071..3b2add2ae4e7cbc7fe84b67b83a3722d4b8e6f73 100644 (file)
@@ -158,6 +158,18 @@ int rc_read_dictionary (char *filename)
                        {
                                type = PW_TYPE_DATE;
                        }
+                       else if (strcmp (typestr, "ifid") == 0)
+                       {
+                               type = PW_TYPE_IFID;
+                       }
+                       else if (strcmp (typestr, "ipv6addr") == 0)
+                       {
+                               type = PW_TYPE_IPV6ADDR;
+                       }
+                       else if (strcmp (typestr, "ipv6prefix") == 0)
+                       {
+                               type = PW_TYPE_IPV6PREFIX;
+                       }
                        else
                        {
                                error("rc_read_dictionary: invalid type on line %d of dictionary %s",
index c3a8e7abb21332e1eb97a7f7b498bb77cddd24be..17f64259d222364f5d12a39da4e65baddcc22451 100644 (file)
@@ -77,6 +77,17 @@ typedef struct pw_auth_hdr
 #define PW_TYPE_INTEGER                        1
 #define PW_TYPE_IPADDR                 2
 #define PW_TYPE_DATE                   3
+#define PW_TYPE_ABINARY                        4
+#define PW_TYPE_OCTETS                 5
+#define PW_TYPE_IFID                   6
+#define PW_TYPE_IPV6ADDR               7
+#define PW_TYPE_IPV6PREFIX             8
+#define PW_TYPE_BYTE                   9
+#define PW_TYPE_SHORT                  10
+#define PW_TYPE_ETHERNET               11
+#define PW_TYPE_SIGNED                 12
+#define PW_TYPE_COMBO_IP               13
+#define PW_TYPE_TLV                    14
 
 /* standard RADIUS codes */