Nested TLVs 4 deep now work...
authorAlan T. DeKok <aland@freeradius.org>
Tue, 13 Oct 2009 09:12:59 +0000 (11:12 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 31 May 2010 08:16:20 +0000 (10:16 +0200)
share/dictionary.wimax
src/lib/dict.c
src/lib/radius.c

index 74669b1..2586179 100644 (file)
@@ -432,32 +432,30 @@ ATTRIBUTE WiMAX-PFDv2-Classifier-IP-ToS-DSCP      7       byte
 ATTRIBUTE      WiMAX-PFDv2-Classifier-Action           8       byte
 ATTRIBUTE      WiMAX-PFDv2-Classifier-Eth-Option       9       tlv
 
+
 # Nest 3
 BEGIN-TLV      WiMAX-PFDv2-Classifier-Eth-Option
-#
-#  These are all really TLVs
-#
-ATTRIBUTE      WiMAX-PFDv2-Eth-Proto-Type              1       octets
-ATTRIBUTE      WiMAX-PFDv2-Eth-VLAN-Id                 2       octets
-ATTRIBUTE      WiMAX-PFDv2-Eth-Priority-Range          3       octets
-
-# Nest 4: BOOM!
-#BEGIN-TLV     WiMAX-PFDv2-Eth-Proto-Type
-#ATTRIBUTE     WiMAX-PFDv2-Eth-Proto-Type-Ethertype    1       short
-#ATTRIBUTE     WiMAX-PFDv2-Eth-Proto-Type-DSAP         2       byte
-#END-TLV               WiMAX-PFDv2-Eth-Proto-Type
-
-# Nest 4: BOOM!
-#BEGIN-TLV     WiMAX-PFDv2-Eth-VLAN-Id
-#ATTRIBUTE     WiMAX-PFDv2-Eth-VLAN-Id-S-VID           1       integer
-#ATTRIBUTE     WiMAX-PFDv2-Eth-VLAN-Id-C-VID           2       integer
-#END-TLV               WiMAX-PFDv2-Eth-VLAN-Id
-
-# Nest 4: BOOM!
-#BEGIN-TLV     WiMAX-PFDv2-Eth-Priority-Range
-#ATTRIBUTE     WiMAX-PFDv2-Eth-Priority-Range-Low      1       byte
-#ATTRIBUTE     WiMAX-PFDv2-Eth-Priority-Range-High     2       byte
-#END-TLV               WiMAX-PFDv2-Eth-Priority-Range
+ATTRIBUTE      WiMAX-PFDv2-Eth-Proto-Type              1       tlv
+ATTRIBUTE      WiMAX-PFDv2-Eth-VLAN-Id                 2       tlv
+ATTRIBUTE      WiMAX-PFDv2-Eth-Priority-Range          3       tlv
+
+# Nest 4
+BEGIN-TLV      WiMAX-PFDv2-Eth-Proto-Type
+ATTRIBUTE      WiMAX-PFDv2-Eth-Proto-Type-Ethertype    1       short
+ATTRIBUTE      WiMAX-PFDv2-Eth-Proto-Type-DSAP         2       byte
+END-TLV                WiMAX-PFDv2-Eth-Proto-Type
+
+# Nest 4
+BEGIN-TLV      WiMAX-PFDv2-Eth-VLAN-Id
+ATTRIBUTE      WiMAX-PFDv2-Eth-VLAN-Id-S-VID           1       integer
+ATTRIBUTE      WiMAX-PFDv2-Eth-VLAN-Id-C-VID           2       integer
+END-TLV                WiMAX-PFDv2-Eth-VLAN-Id
+
+# Nest 4
+BEGIN-TLV      WiMAX-PFDv2-Eth-Priority-Range
+ATTRIBUTE      WiMAX-PFDv2-Eth-Priority-Range-Low      1       byte
+ATTRIBUTE      WiMAX-PFDv2-Eth-Priority-Range-High     2       byte
+END-TLV                WiMAX-PFDv2-Eth-Priority-Range
 
 END-TLV                WiMAX-PFDv2-Classifier-Eth-Option
 
index a3f1529..e8f8e15 100644 (file)
@@ -101,7 +101,7 @@ static const FR_NAME_NUMBER type_table[] = {
 /*
  *     WiMAX craziness.
  */
-#define MAX_TLV_NEST (3)
+#define MAX_TLV_NEST (4)
 /*
  *     Bit packing:
  *     8 bits of base VSA
@@ -110,12 +110,13 @@ static const FR_NAME_NUMBER type_table[] = {
  *     5 bits for nested TLV 3
  *     3 bits for nested TLV 4
  */
+const int fr_wimax_max_tlv = MAX_TLV_NEST;
 const int fr_wimax_shift[MAX_TLV_NEST + 1] = {
   0, 8, 16, 24, 29
 };
 
 const int fr_wimax_mask[MAX_TLV_NEST + 1] = {
-  0, 0xff, 0xff, 0xff, 0x07
+  0, 0xff, 0xff, 0x1f, 0x07
 };
 
 
index 4a4812d..5790bb7 100644 (file)
@@ -824,6 +824,7 @@ static int rad_vp2rfc(const RADIUS_PACKET *packet,
        return ptr[1];
 }
 
+extern int fr_wimax_max_tlv;
 extern int fr_wimax_shift[];
 extern int fr_wimax_mask[];
 
@@ -834,6 +835,8 @@ static int tlv2data(const RADIUS_PACKET *packet,
 {
        int len;
 
+       if (nest > fr_wimax_max_tlv) return -1;
+
        if (room < 2) return 0;
        room -= 2;
 
@@ -843,7 +846,8 @@ static int tlv2data(const RADIUS_PACKET *packet,
        /*
         *      No more nested TLVs: pack the data.
         */
-       if (!vp->flags.has_tlv) {
+       if ((nest == fr_wimax_max_tlv) ||
+           ((vp->attribute >> fr_wimax_shift[nest + 1]) == 0)) {
                len = vp2data(packet, original, secret, vp, ptr + 2, room);
        } else {
                len = tlv2data(packet, original, secret, vp, ptr + 2, room,
@@ -2553,7 +2557,7 @@ static VALUE_PAIR *tlv2wimax(const RADIUS_PACKET *packet,
        VALUE_PAIR *vp;
        uint8_t *y;             /* why do I need to do this? */
 
-       if (nest > 4) return NULL;
+       if (nest > fr_wimax_max_tlv) return NULL;
 
        /*
         *      Sanity check the attribute.