1 /*************************************************************************** 2 * Copyright (c) 2024 Microsoft Corporation 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the MIT License which is available at 6 * https://opensource.org/licenses/MIT. 7 * 8 * SPDX-License-Identifier: MIT 9 **************************************************************************/ 10 11 /**************************************************************************/ 12 /**************************************************************************/ 13 /** */ 14 /** NetX MSRP Component */ 15 /** */ 16 /** Multiple Stream Registration Protocol (MSRP) */ 17 /** */ 18 /**************************************************************************/ 19 /**************************************************************************/ 20 21 #ifndef NX_MSRP_H 22 #define NX_MSRP_H 23 24 #include "nx_api.h" 25 #include "nx_mrp.h" 26 27 #define NX_MRP_MSRP_PROTOCOL_VERSION 0 28 29 /* MSRP protocal verison index in packet*/ 30 #define NX_MSRP_PROTOCAL_VERSION_INDEX 16 31 32 /* MSRP return value*/ 33 #define NX_MSRP_SUCCESS 0 34 #define NX_MSRP_EVENT_TYPE_ERROR 1 35 #define NX_MSRP_ATTRIBUTE_TYPE_ERROR 2 36 #define NX_MSRP_INDICATION_TYPE_ERROR 3 37 #define NX_MSRP_NOT_SUPPORTED 4 38 #define NX_MSRP_VERSION_NOT_SUPPORTED 5 39 #define NX_MSRP_EVENT_NOT_SUPPORTED 6 40 #define NX_MSRP_LISENER_NOT_READY 7 41 #define NX_MSRP_LISTENER_NOT_ENABLED 8 42 #define NX_MSRP_ATTRIBUTE_FIND_ERROR 9 43 #define NX_MSRP_ATTRIBUTE_FOUND 10 44 #define NX_MSRP_ATTRIBUTE_NEW 11 45 #define NX_MSRP_WAIT 12 46 #define NX_MSRP_REGISTRAR_STATE_ERROR 13 47 #define NX_MSRP_PARAMETER_ERROR 14 48 49 #define NX_MSRP_ATTRIBUTE_END_MASK 0 50 51 #define NX_MSRP_ACTION_NEW 1 52 53 #define NX_MSRP_TALKER_ADVERTISE_ATTRIBUTE_LENGTH 25 54 #define NX_MSRP_TALKER_FAILED_ATTRIBUTE_LENGTH 34 55 #define NX_MSRP_LISTENER_ATTRIBUTE_LENGTH 8 56 #define NX_MSRP_DOMAIN_ATTRIBUTE_LENGTH 4 57 58 /* MSRP stream ID size.*/ 59 #define STREAM_ID_SIZE 8 60 61 /* MSRP attribute type*/ 62 typedef enum 63 { 64 NX_MSRP_TALKER_ADVERTISE_VECTOR = 1, 65 NX_MSRP_TALKER_FAILED_VECTOR = 2, 66 NX_MSRP_TALKER_LISTENER_VECTOR = 3, 67 NX_MSRP_TALKER_DOMAIN_VECTOR = 4, 68 } AttributeType_t; 69 70 /* Fourpacked_event value.*/ 71 typedef enum 72 { 73 NX_MSRP_FOURPACKED_IGNORE = 0, 74 NX_MSRP_FOURPACKED_ASKING_FAILED = 1, 75 NX_MSRP_FOURPACKED_READY = 2, 76 NX_MSRP_FOURPACKED_READY_FAILED = 3, 77 } FourPackedEvent_t; 78 79 /* Talker advertise data structure*/ 80 typedef struct 81 { 82 83 UCHAR stream_id[8]; 84 UCHAR dest_addr[6]; 85 /* Same with mvrp vlan id*/ 86 USHORT vlan_identifier; 87 USHORT max_frame_size; 88 USHORT max_interval_frames; 89 UCHAR priority : 3; 90 UCHAR rank : 1; 91 UCHAR reserved : 4; 92 UINT accumulated_latency; 93 } NX_MSRP_TALKER_ADVERTISE; 94 95 /* Talker failed data structure*/ 96 typedef struct 97 { 98 99 UCHAR stream_id[8]; 100 UCHAR des_addr[6]; 101 USHORT vlan_identifier; 102 USHORT max_frame_size; 103 USHORT max_interval_frames; 104 UCHAR priority : 3; 105 UCHAR rank : 1; 106 UCHAR reserved : 4; 107 UINT accumulated_latency; 108 UCHAR system_id[8]; 109 UCHAR failure_code; 110 } NX_MSRP_TALKER_FAILED; 111 112 /* Listener data structure*/ 113 typedef struct 114 { 115 116 UCHAR stream_id[8]; 117 UCHAR fourpacked_event; 118 } NX_MSRP_LISTENER; 119 120 typedef struct 121 { 122 /* 6: classA, 5:class B*/ 123 UCHAR sr_class_id; 124 UCHAR sr_class_priority; 125 USHORT sr_class_vid; 126 } NX_MSRP_DOMAIN; 127 128 typedef union 129 { 130 131 NX_MSRP_TALKER_ADVERTISE talker_advertise; 132 NX_MSRP_TALKER_FAILED talker_failed; 133 NX_MSRP_LISTENER listener; 134 NX_MSRP_DOMAIN domain; 135 } NX_MSRP_ATTRIBUTE_UNION; 136 137 typedef struct 138 { 139 140 NX_MRP_ATTRIBUTE mrp_attribute; 141 NX_MSRP_ATTRIBUTE_UNION msrp_attribute_union; 142 UCHAR indication_flag; 143 UCHAR direction; 144 } NX_MSRP_ATTRIBUTE; 145 146 #define NX_MSRP_ATTRIBUTE_ARRAY_MAX_SIZE 10 147 148 typedef UINT (*NX_MRP_EVENT_CALLBACK)(NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR mrp_event, VOID *callback_data); 149 150 typedef struct nx_msrp 151 { 152 NX_MRP_PARTICIPANT nx_msrp_participant; 153 NX_MRP_EVENT_CALLBACK msrp_event_callback; 154 VOID *msrp_callback_data; 155 UCHAR listener_enable; 156 } NX_MSRP; 157 158 /* Internal functions. */ 159 UINT nx_msrp_init(NX_MSRP *nx_msrp_ptr); 160 /*set as callback function*/ 161 UINT nx_msrp_indication_process(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 162 UINT nx_msrp_mrpdu_parse(); 163 UINT nx_msrp_mrpdu_pack(); 164 /* Send talker advertise.*/ 165 UINT nx_msrp_register_stream_request(NX_MRP * mrp, NX_MRP_PARTICIPANT * participant, NX_MSRP_TALKER_ADVERTISE * talker_advertise, UINT new_request); 166 /* Send talker withdraw.*/ 167 UINT nx_msrp_deregister_stream_request(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, UCHAR *stream_id); 168 /* Send listener ready.*/ 169 UINT nx_msrp_register_attach_request(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, UCHAR *stream_id, UINT event, UCHAR fourpacked_value); 170 /* Send listener withdraw.*/ 171 UINT nx_msrp_deregister_attach_request(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, UCHAR *stream_id); 172 /* Recevie talker register request.*/ 173 UINT nx_msrp_register_stream_indication(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UINT indication_event); 174 /* Recevie talker deregister request.*/ 175 UINT nx_msrp_deregister_stream_indication(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 176 /* Recevie listener register attach.*/ 177 UINT nx_msrp_register_attach_indication(NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 178 /* Recevie listener deregister attach.*/ 179 UINT nx_msrp_deregister_attach_indication(NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 180 UINT nx_msrp_register_domain_request(NX_MRP * mrp, NX_MRP_PARTICIPANT * participant, NX_MSRP_DOMAIN * domain, UINT new_request); 181 UINT nx_msrp_register_domain_indication(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 182 UINT nx_msrp_deregister_domain_request(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MSRP_DOMAIN *domain); 183 UINT nx_msrp_deregister_domain_indication(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, UCHAR indication_type); 184 UINT nx_msrp_attribute_find(NX_MRP *mrp, NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE **attribute_ptr, UCHAR attribute_type, UCHAR *attribute_value); 185 UINT nx_msrp_mrpdu_pack_attribute(NX_MRP_PARTICIPANT *participant, NX_MRP_ATTRIBUTE *attribute, USHORT num_of_value, 186 UCHAR *threepacked_event, UCHAR *fourpacked_event, UCHAR *data_ptr, UINT *length_ptr); 187 #endif 188 189