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