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
/*
* WiMAX craziness.
*/
-#define MAX_TLV_NEST (3)
+#define MAX_TLV_NEST (4)
/*
* Bit packing:
* 8 bits of base VSA
* 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
};
return ptr[1];
}
+extern int fr_wimax_max_tlv;
extern int fr_wimax_shift[];
extern int fr_wimax_mask[];
{
int len;
+ if (nest > fr_wimax_max_tlv) return -1;
+
if (room < 2) return 0;
room -= 2;
/*
* 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,
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.