From 7e9f35752bd05d131c41a6d230d5a8d3b49cb395 Mon Sep 17 00:00:00 2001
From: Maxim Menshikov <maxim.menshikov@iopsys.eu>
Date: Mon, 14 Aug 2023 22:54:48 +0100
Subject: [PATCH] Introduce QoS-related structures and definitions
---
src/1905_tlvs.h | 224 ++++++++++++++++++++++++++++++++++
src/extensions/map/easymesh.h | 32 ++---
2 files changed, 240 insertions(+), 16 deletions(-)
diff --git a/src/1905_tlvs.h b/src/1905_tlvs.h
index c0990979..70266183 100644
--- a/src/1905_tlvs.h
+++ b/src/1905_tlvs.h
@@ -557,4 +557,228 @@ struct tlv_ttl {
uint16_t ttl; /* in secs */
} __attribute__((packed));
+#define IEEE1905_TCLAS_ELEM_ID (14)
+#define IEEE1905_TCLAS_PROCESSING_ELEM_ID (44)
+
+struct ieee1905_element {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t data[];
+} __attribute__((packed));;
+
+struct ieee1905_ext_element {
+ uint8_t element_id;
+ uint8_t element_id_ext;
+ uint8_t length;
+ uint8_t data[];
+} __attribute__((packed));;
+
+struct ieee1905_vendor_element {
+ uint8_t element_id;
+ uint8_t length;
+ uint8_t oui[3];
+ uint8_t oui_type;
+ uint8_t data[];
+} __attribute__((packed));
+
+struct ieee1905_tclas_elem_cls_type4_ipv4 {
+ uint32_t src_ip;
+ uint32_t dst_ip;
+ uint16_t src_port;
+ uint16_t dst_port;
+ uint8_t dscp;
+ uint8_t protocol;
+ uint8_t param_mask;
+};
+
+struct ieee1905_tclas_elem_cls_type4_ipv6 {
+ uint8_t src_ip[16];
+ uint8_t dst_ip[16];
+ uint16_t src_port;
+ uint16_t dst_port;
+ uint8_t dscp;
+ uint8_t next_header;
+ uint8_t flow_label[3];
+ uint8_t param_mask;
+};
+
+struct ieee1905_tclas_elem_cls_type4 {
+ uint8_t classifier_mask;
+ uint8_t ip_version;
+ union {
+ struct ieee1905_tclas_elem_cls_type4_ipv4 ipv4;
+ struct ieee1905_tclas_elem_cls_type4_ipv6 ipv6;
+ };
+};
+
+enum ieee1905_tclas_elem_frame_classifier_type {
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_ETH = 0,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_TCP_UDP_IP = 1,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_8021Q = 2,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_FILTER_OFFSET = 3,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_IP = 4,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_8021DQ = 5,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_8021MAC = 6,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_DL_PV1 = 7,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_UL_PV1 = 8,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_PV1_FULL = 9,
+ IEEE1905_TCLAS_ELEM_FRAME_CLASSIFIER_TYPE_IP_EXT= 10,
+};
+
+struct ieee1905_tclas_elem_frame_classifier {
+ uint8_t type; /**< Belongs to ieee1905_tclas_elem_frame_classifier_type
+ enumeration */
+ /* classifier mask is put into specific classifier type for ease */
+ union {
+ struct ieee1905_tclas_elem_cls_type4 params4;
+ };
+};
+
+/* TCLAS element */
+struct ieee1905_tclas_elem {
+ uint8_t user_priority;
+ struct ieee1905_tclas_elem_frame_classifier classifier;
+};
+
+enum ieee1905_scs_desc_request_type {
+ IEEE1905_SCS_DESC_REQUEST_TYPE_ADD = 0,
+ IEEE1905_SCS_DESC_REQUEST_TYPE_REMOVE = 1,
+ IEEE1905_SCS_DESC_REQUEST_TYPE_CHANGE = 2,
+};
+
+struct ieee1905_tclas_processing {
+ uint8_t processing;
+};
+
+/*
+ * This structure can't be used directly because of variable tclas_elems in the
+ * middle
+ */
+struct ieee1905_scs_desc_add_change {
+ uint32_t intra_access_category_priority:24;
+
+ /* Please note that elements must be prepended with ieee1905_element */
+ struct ieee1905_tclas_elem tclas_elems[0];
+
+ struct ieee1905_element processing_element; /* ieee1905_tclas_processing */
+};
+
+
+#define IEEE1905_SCS_DESC_ELEM_ID (185)
+
+/**
+ * Part 11: Wireless LAN Medium Access Control
+ * (MAC) and Physical Layer (PHY) Specifications
+ * 9.4.2.121 SCS Descriptor element
+ */
+struct ieee1905_scs_desc {
+ uint8_t scsid;
+ uint8_t request_type; /* belongs to ieee1905_scs_desc_request_type enum */
+ union {
+ struct ieee1905_scs_desc_add_change add_change;
+ uint8_t __dummy[0];
+ };
+};
+
+#define IEEE1905_MSCS_DESC_ELEM_ID (255)
+#define IEEE1905_MSCS_DESC_ELEM_ID_EXT (88)
+
+/**
+ * Part 11: Wireless LAN Medium Access Control
+ * (MAC) and Physical Layer (PHY) Specifications
+ * 9.4.2.243 MSCS Descriptor element
+ */
+struct ieee1905_mscs_desc {
+ uint8_t request_type; /* belongs to ieee1905_scs_desc_request_type enum */
+ uint8_t up_bitmap;
+ uint8_t up_limit;
+ int32_t stream_timeout;
+
+ /*
+ * These elements are TCLAS Mask Elements (9.4.2.242), not TCLAS Elements
+ * directly
+ */
+ struct ieee1905_tclas_elem tclas_elems[0];
+};
+
+/* User-friendly structures that might be used in configuration parsing */
+struct ieee1905_scs_desc_usr {
+ uint8_t scsid;
+ uint32_t intra_access_category_priority;
+
+ /* TCLAS elements */
+ uint32_t tclas_elems_count;
+ struct ieee1905_tclas_elem *tclas_elems;
+
+ /* Processing part */
+ uint8_t processing;
+ uint8_t processing_present;
+};
+
+struct ieee1905_mscs_desc_usr {
+ uint8_t up_bitmap;
+ uint8_t up_limit;
+ int32_t stream_timeout;
+
+ uint32_t tclas_elems_count;
+ struct ieee1905_tclas_elem *tclas_elems;
+};
+
+/* WiFi Easy Mesh Specification 17.2.71 - DSCP Mapping Table TLV */
+struct ieee1905_dscp_pcp_usr {
+ uint8_t dscp_pcp[64];
+};
+
+/** Possible QoS management attribute IDs */
+enum ieee1905_qos_mgmt_attr_id {
+ IEEE1905_QOS_MGMT_ATTR_ID_PORT_RANGE = 1,
+ IEEE1905_QOS_MGMT_ATTR_ID_DSCP_POLICY = 2,
+ IEEE1905_QOS_MGMT_ATTR_ID_TCLAS = 3,
+ IEEE1905_QOS_MGMT_ATTR_ID_DOMAIN_NAME = 4,
+};
+
+#define IEEE1905_QOS_MGMT_ELEM_ID (0xDD)
+#define IEEE1905_QOS_MGMT_ELEM_OUI { 0x50, 0x6F, 0x9A }
+#define IEEE1905_QOS_MGMT_ELEM_OUI_TYPE (1)
+
+/**
+ * Single QoS management attribute - user-friendly container
+ */
+struct ieee1905_qos_mgmt_attr_usr {
+ uint8_t attribute_id; /* belongs to ieee1905_qos_mgmt_attr_id enumeration */
+ union {
+ struct {
+ uint16_t start_port; /**< Start port in port range */
+ uint16_t end_port; /**< End port in port range */
+ } port_range;
+ struct {
+ uint8_t dscp_policy_id; /**< DSCP policy ID */
+ uint8_t request_type; /* practically, this field is not needed
+ here, but we keep it here in order to
+ have just one structure for write/recv
+ functions */
+ uint8_t dscp; /**< Target DSCP value */
+ } dscp_policy;
+ struct {
+ struct ieee1905_tclas_elem_frame_classifier classifier; /**<
+ Complete TCLAS classifier */
+ } tclas;
+ struct {
+ uint32_t domain_name_len; /**< Target domain name length */
+ uint8_t *domain_name; /**< Target domain name */
+ } domain_name;
+ };
+};
+
+/**
+ * QoS management attribute container
+ */
+struct ieee1905_qos_mgmt_usr {
+ uint32_t attributes_count; /**< Number of
+ attributes
+ in attributes
+ field */
+ struct ieee1905_qos_mgmt_attr_usr *attributes; /**< Array of attributes */
+};
+
#endif /* _1905_TLVS_H_ */
diff --git a/src/extensions/map/easymesh.h b/src/extensions/map/easymesh.h
index a91fd55d..0a60bb03 100644
--- a/src/extensions/map/easymesh.h
+++ b/src/extensions/map/easymesh.h
@@ -1492,25 +1492,25 @@ struct tlv_sr_config_response {
uint8_t code;
} __attribute__((packed));
-
-/** TLV: QoS management policy */
-struct tlv_qos_management_policy {
- uint8_t num_mscs_disallowed;
- struct sta_macaddr mscs_disallowed;
- uint8_t num_scs_disallowed;
- struct sta_macaddr scs_disallowed;
-} __attribute__((packed));
-
-
/** TLV: QoS management descriptor */
-struct tlv_qos_management_desc {
- uint16_t qmid;
- uint8_t bssid[6];
- uint8_t sta[6];
- uint8_t desc[];
+struct tlv_qos_mgmt_desc {
+ uint16_t qmid;
+ macaddr_t bssid;
+ macaddr_t sta;
+ uint8_t desc[];
+} __attribute__((packed));
+
+/** WiFi Easy Mesh Specification 17.2.70 Service Prioritization Requesst TLV */
+struct tlv_spr {
+ uint32_t rule_id;
+ uint8_t add_remove:1;
+ uint8_t rsvd1:7;
+ uint8_t precedence;
+ uint8_t output;
+ uint8_t always_match:1;
+ uint8_t rsvd2:7;
} __attribute__((packed));
-
/** TLV: Controller capability */
struct tlv_controller_cap {
#define CONTROLLER_KIBMIB_COUNTER_SUPPORTED BIT(7)
--
GitLab