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 /**                                                                       */
15 /** USBX Component                                                        */
16 /**                                                                       */
17 /**   CDC ECM Class                                                       */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 /**************************************************************************/
24 /*                                                                        */
25 /*  COMPONENT DEFINITION                                   RELEASE        */
26 /*                                                                        */
27 /*    ux_host_class_cdc_ecm.h                             PORTABLE C      */
28 /*                                                           6.3.0        */
29 /*  AUTHOR                                                                */
30 /*                                                                        */
31 /*    Chaoqiong Xiao, Microsoft Corporation                               */
32 /*                                                                        */
33 /*  DESCRIPTION                                                           */
34 /*                                                                        */
35 /*    This file contains all the header and extern functions used by the  */
36 /*    USBX CDC_ECM class.                                                 */
37 /*                                                                        */
38 /*  RELEASE HISTORY                                                       */
39 /*                                                                        */
40 /*    DATE              NAME                      DESCRIPTION             */
41 /*                                                                        */
42 /*  05-19-2020     Chaoqiong Xiao           Initial Version 6.0           */
43 /*  09-30-2020     Chaoqiong Xiao           Modified comment(s),          */
44 /*                                            used UX prefix to refer to  */
45 /*                                            TX symbols instead of using */
46 /*                                            them directly,              */
47 /*                                            resulting in version 6.1    */
48 /*  02-02-2021     Xiuwen Cai               Modified comment(s), added    */
49 /*                                            compile option for using    */
50 /*                                            packet pool from NetX,      */
51 /*                                            resulting in version 6.1.4  */
52 /*  08-02-2021     Chaoqiong Xiao           Modified comment(s),          */
53 /*                                            added extern "C" keyword    */
54 /*                                            for compatibility with C++, */
55 /*                                            resulting in version 6.1.8  */
56 /*  04-25-2022     Chaoqiong Xiao           Modified comment(s),          */
57 /*                                            fixed standalone compile,   */
58 /*                                            resulting in version 6.1.11 */
59 /*  10-31-2022     Chaoqiong Xiao           Modified comment(s),          */
60 /*                                            supported NX packet chain,  */
61 /*                                            resulting in version 6.2.0  */
62 /*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
63 /*                                            optimized USB descriptors,  */
64 /*                                            resulting in version 6.3.0  */
65 /*                                                                        */
66 /**************************************************************************/
67 
68 #ifndef UX_HOST_CLASS_CDC_ECM_H
69 #define UX_HOST_CLASS_CDC_ECM_H
70 
71 /* Determine if a C++ compiler is being used.  If so, ensure that standard
72    C is used to process the API information.  */
73 
74 #ifdef   __cplusplus
75 
76 /* Yes, C++ compiler is present.  Use standard C.  */
77 extern   "C" {
78 
79 #endif
80 
81 #if !defined(UX_HOST_STANDALONE)
82 #include "nx_api.h"
83 #include "ux_network_driver.h"
84 #else
85 
86 /* Assume NX things for compiling.  */
87 #define NX_PACKET                                   VOID*
88 #define NX_PACKET_POOL                              VOID*
89 #endif
90 
91 
92 /* Define CDC_ECM Class constants.  Insert here the PID/VID of vendors and products using the CDC ECM chipset.
93    It is a better mechanism to put this value in the ux_user.h file. */
94 #ifndef UX_HOST_CLASS_CDC_ECM_VENDOR_ID
95 #define UX_HOST_CLASS_CDC_ECM_VENDOR_ID                        0x0770
96 #define UX_HOST_CLASS_CDC_ECM_PRODUCT_ID                       0x1042
97 #endif
98 
99 /* Define CDC_ECM Class/subclass/protocol constants. */
100 #define UX_HOST_CLASS_CDC_CONTROL_CLASS                        0x02
101 #define UX_HOST_CLASS_CDC_DATA_CLASS                           0x0A
102 #define UX_HOST_CLASS_CDC_ECM_CONTROL_SUBCLASS                 0x06
103 #define UX_HOST_CLASS_CDC_ECM_CONTROL_PROTOCOL                 0x00
104 #define UX_HOST_CLASS_CDC_ECM_CS_INTERFACE                     0x24
105 #define UX_HOST_CLASS_CDC_ECM_FUNCTIONAL_DESCRIPTOR            0x0F
106 #define UX_HOST_CLASS_CDC_ECM_MAC_ADDRESS_STRING_LENGTH        32
107 #define UX_HOST_CLASS_CDC_ECM_MAC_ADDRESS_ASCII_LENGTH         8
108 
109 #define UX_HOST_CLASS_CDC_ECM_SPEED_SELECTED_100MPBS           0x100
110 #define UX_HOST_CLASS_CDC_ECM_SPEED_SELECTED_10MPBS            0x10
111 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_DOWN                  0
112 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_UP                    1
113 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_PENDING_UP            2
114 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_PENDING_DOWN          3
115 #define UX_HOST_CLASS_CDC_ECM_BASE_IP_ADDRESS                  0xC0A80001
116 #define UX_HOST_CLASS_CDC_ECM_BASE_IP_MASK                     0xFFFFFF00
117 #define UX_HOST_CLASS_CDC_ECM_MAX_MTU                          1518
118 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_IP                      0x0800
119 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_ARP                     0x0806
120 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_RARP                    0x8035
121 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE             1536
122 #define UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING                 2
123 #ifndef UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES
124 #define UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES                16
125 #endif
126 
127 #define UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE                   sizeof(NX_PACKET)
128 
129 #define UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT           UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE, UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING), UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_calc_ovf)
130 #define UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE                  (UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE + UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING)
131 
132 #define UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT                           \
133     UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT                            \
134     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
135         UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE,                              \
136         UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE),                              \
137         UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_calc_ovf)
138 #define UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE                     (UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE + UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE)
139 
140 #define UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_ASSERT             \
141     UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT                               \
142     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_MULC_ULONG(                   \
143         UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES,                            \
144         UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE),                                \
145         UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc1_ovf)         \
146     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
147         UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES *                           \
148             UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE,                             \
149         32), UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc2_ovf)
150 #define UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE       (UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES * UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE + 32)
151 
152 #ifdef NX_DISABLE_PACKET_CHAIN
153 #undef UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT
154 #else
155 #define UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT
156 #endif
157 
158 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_SIZE                    14
159 
160 #define UX_HOST_CLASS_CDC_ECM_DEVICE_INIT_DELAY                (1 * UX_PERIODIC_RATE)
161 #define UX_HOST_CLASS_CDC_ECM_CLASS_TRANSFER_TIMEOUT           300000
162 #define UX_HOST_CLASS_CDC_ECM_SETUP_BUFFER_SIZE                16
163 
164 
165 /* Define NetX errors inside the CDC ECM class.  */
166 #define UX_HOST_CLASS_CDC_ECM_NX_SUCCESS                       0x00
167 #define UX_HOST_CLASS_CDC_ECM_NX_NO_PACKET                     0x01
168 #define UX_HOST_CLASS_CDC_ECM_NX_UNDERFLOW                     0x02
169 #define UX_HOST_CLASS_CDC_ECM_NX_OVERFLOW                      0x03
170 #define UX_HOST_CLASS_CDC_ECM_NX_NO_MAPPING                    0x04
171 #define UX_HOST_CLASS_CDC_ECM_NX_DELETED                       0x05
172 #define UX_HOST_CLASS_CDC_ECM_NX_POOL_ERROR                    0x06
173 #define UX_HOST_CLASS_CDC_ECM_NX_PTR_ERROR                     0x07
174 #define UX_HOST_CLASS_CDC_ECM_NX_WAIT_ERROR                    0x08
175 #define UX_HOST_CLASS_CDC_ECM_NX_SIZE_ERROR                    0x09
176 #define UX_HOST_CLASS_CDC_ECM_NX_OPTION_ERROR                  0x0a
177 #define UX_HOST_CLASS_CDC_ECM_NX_DELETE_ERROR                  0x10
178 #define UX_HOST_CLASS_CDC_ECM_NX_CALLER_ERROR                  0x11
179 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_PACKET                0x12
180 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_SOCKET                0x13
181 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_ENABLED                   0x14
182 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_ENABLED               0x15
183 #define UX_HOST_CLASS_CDC_ECM_NX_ENTRY_NOT_FOUND               0x16
184 #define UX_HOST_CLASS_CDC_ECM_NX_NO_MORE_ENTRIES               0x17
185 #define UX_HOST_CLASS_CDC_ECM_NX_ARP_TIMER_ERROR               0x18
186 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE0                0x19
187 #define UX_HOST_CLASS_CDC_ECM_NX_WAIT_ABORTED                  0x1A
188 #define UX_HOST_CLASS_CDC_ECM_NX_IP_INTERNAL_ERROR             0x20
189 #define UX_HOST_CLASS_CDC_ECM_NX_IP_ADDRESS_ERROR              0x21
190 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_BOUND                 0x22
191 #define UX_HOST_CLASS_CDC_ECM_NX_PORT_UNAVAILABLE              0x23
192 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_BOUND                     0x24
193 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE1                0x25
194 #define UX_HOST_CLASS_CDC_ECM_NX_SOCKET_UNBOUND                0x26
195 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CREATED                   0x27
196 #define UX_HOST_CLASS_CDC_ECM_NX_SOCKETS_BOUND                 0x28
197 #define UX_HOST_CLASS_CDC_ECM_NX_NO_RESPONSE                   0x29
198 #define UX_HOST_CLASS_CDC_ECM_NX_POOL_DELETED                  0x30
199 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_RELEASED              0x31
200 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE2                0x32
201 #define UX_HOST_CLASS_CDC_ECM_NX_MAX_LISTEN                    0x33
202 #define UX_HOST_CLASS_CDC_ECM_NX_DUPLICATE_LISTEN              0x34
203 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CLOSED                    0x35
204 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_LISTEN_STATE              0x36
205 #define UX_HOST_CLASS_CDC_ECM_NX_IN_PROGRESS                   0x37
206 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CONNECTED                 0x38
207 #define UX_HOST_CLASS_CDC_ECM_NX_WINDOW_OVERFLOW               0x39
208 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_SUSPENDED             0x40
209 #define UX_HOST_CLASS_CDC_ECM_NX_DISCONNECT_FAILED             0x41
210 #define UX_HOST_CLASS_CDC_ECM_NX_STILL_BOUND                   0x42
211 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_SUCCESSFUL                0x43
212 #define UX_HOST_CLASS_CDC_ECM_NX_UNHANDLED_COMMAND             0x44
213 #define UX_HOST_CLASS_CDC_ECM_NX_NO_FREE_PORTS                 0x45
214 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_PORT                  0x46
215 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_RELISTEN              0x47
216 #define UX_HOST_CLASS_CDC_ECM_NX_CONNECTION_PENDING            0x48
217 #define UX_HOST_CLASS_CDC_ECM_NX_TX_QUEUE_DEPTH                0x49
218 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_IMPLEMENTED               0x80
219 
220 /* Define  CDC_ECM Class packet equivalences.  */
221 
222 #define UX_HOST_CLASS_CDC_ECM_PACKET_SIZE                      128
223 #define UX_HOST_CLASS_CDC_ECM_NODE_ID_LENGTH                   6
224 
225 /* Define supported notification types.  */
226 
227 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_CONNECTION   0x00
228 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_RESPONSE_AVAILABLE   0x01
229 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_SERIAL_STATE         0x20
230 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_CALL_STATE_CHANGE    0x28
231 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_LINE_STATE_CHANGE    0x29
232 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_SPEED_CHANGE         0x2A
233 
234 /* Define notification packet format.  */
235 
236 #define UX_HOST_CLASS_CDC_ECM_NPF_REQUEST_TYPE                  0x00
237 #define UX_HOST_CLASS_CDC_ECM_NPF_NOTIFICATION_TYPE             0x01
238 #define UX_HOST_CLASS_CDC_ECM_NPF_VALUE                         0x02
239 #define UX_HOST_CLASS_CDC_ECM_NPF_INDEX                         0x04
240 #define UX_HOST_CLASS_CDC_ECM_NPF_LENGTH                        0x06
241 
242 /* Define supported notification values.  */
243 
244 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_LINK_DOWN    0x00
245 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_LINK_UP      0x01
246 
247 /* Define packet allocation timeout in milliseconds.  */
248 
249 #ifndef UX_HOST_CLASS_CDC_ECM_PACKET_POOL_WAIT
250 #define UX_HOST_CLASS_CDC_ECM_PACKET_POOL_WAIT                  1000
251 #endif
252 
253 /* Define packet pool waiting time in milliseconds.  */
254 
255 #ifndef UX_HOST_CLASS_CDC_ECM_PACKET_POOL_INSTANCE_WAIT
256 #define UX_HOST_CLASS_CDC_ECM_PACKET_POOL_INSTANCE_WAIT         100
257 #endif
258 
259 /* Define  CDC_ECM Class instance structure.  */
260 
261 typedef struct UX_HOST_CLASS_CDC_ECM_STRUCT
262 {
263     struct UX_HOST_CLASS_CDC_ECM_STRUCT
264                     *ux_host_class_cdc_ecm_next_instance;
265     UX_HOST_CLASS   *ux_host_class_cdc_ecm_class;
266     UX_DEVICE       *ux_host_class_cdc_ecm_device;
267     UX_ENDPOINT     *ux_host_class_cdc_ecm_bulk_in_endpoint;
268     UX_ENDPOINT     *ux_host_class_cdc_ecm_bulk_out_endpoint;
269     UX_ENDPOINT     *ux_host_class_cdc_ecm_interrupt_endpoint;
270     UX_INTERFACE    *ux_host_class_cdc_ecm_interface_data;
271     UX_INTERFACE    *ux_host_class_cdc_ecm_interface_control;
272     UCHAR           ux_host_class_cdc_ecm_bulk_in_transfer_check_and_arm_in_process;
273     UCHAR           ux_host_class_cdc_ecm_bulk_in_transfer_waiting_for_check_and_arm_to_finish;
274     UX_SEMAPHORE    ux_host_class_cdc_ecm_bulk_in_transfer_waiting_for_check_and_arm_to_finish_semaphore;
275     UCHAR           ux_host_class_cdc_ecm_bulk_out_transfer_check_and_arm_in_process;
276     UCHAR           ux_host_class_cdc_ecm_bulk_out_transfer_waiting_for_check_and_arm_to_finish;
277     UX_SEMAPHORE    ux_host_class_cdc_ecm_bulk_out_transfer_waiting_for_check_and_arm_to_finish_semaphore;
278     UINT            ux_host_class_cdc_ecm_instance_status;
279     UINT            ux_host_class_cdc_ecm_state;
280     UX_SEMAPHORE    ux_host_class_cdc_ecm_interrupt_notification_semaphore;
281     UX_THREAD       ux_host_class_cdc_ecm_thread;
282     UCHAR           *ux_host_class_cdc_ecm_thread_stack;
283     ULONG           ux_host_class_cdc_ecm_notification_count;
284     ULONG           ux_host_class_cdc_ecm_primary_phy_id;
285     ULONG           ux_host_class_cdc_ecm_primary_phy_type;
286     ULONG           ux_host_class_cdc_ecm_secondary_phy_id;
287     ULONG           ux_host_class_cdc_ecm_secondary_phy_type;
288     ULONG           ux_host_class_cdc_ecm_model_revision_number;
289     ULONG           ux_host_class_cdc_ecm_vendor_model_number;
290     ULONG           ux_host_class_cdc_ecm_speed_selected;
291     ULONG           ux_host_class_cdc_ecm_device_state;
292     ULONG           ux_host_class_cdc_ecm_link_state;
293     NX_PACKET       *ux_host_class_cdc_ecm_xmit_queue_head;
294     NX_PACKET       *ux_host_class_cdc_ecm_xmit_queue_tail;
295     NX_PACKET_POOL  *ux_host_class_cdc_ecm_packet_pool;
296 #ifdef UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT
297     UCHAR           *ux_host_class_cdc_ecm_xmit_buffer;
298     UCHAR           *ux_host_class_cdc_ecm_receive_buffer;
299 #endif
300 
301     UCHAR           ux_host_class_cdc_ecm_node_id[UX_HOST_CLASS_CDC_ECM_NODE_ID_LENGTH];
302     VOID            (*ux_host_class_cdc_ecm_device_status_change_callback)(struct UX_HOST_CLASS_CDC_ECM_STRUCT *cdc_ecm,
303                                                                 ULONG  device_state);
304     VOID            *ux_host_class_cdc_ecm_network_handle;
305 
306 } UX_HOST_CLASS_CDC_ECM;
307 
308 
309 /* Define ECM Interface Functional descriptor.  */
310 
311 #define UX_HOST_CLASS_CDC_ECM_INTERFACE_DESCRIPTOR_ENTRIES               8
312 #define UX_HOST_CLASS_CDC_ECM_INTERFACE_DESCRIPTOR_LENGTH                13
313 
314 typedef struct UX_HOST_CLASS_ECM_INTERFACE_DESCRIPTOR_STRUCT
315 {
316     UCHAR           bFunctionLength;
317     UCHAR           bDescriptorType;
318     UCHAR           bDescriptorSubtype;
319     UCHAR           iMACAddress;
320     ULONG           bmEthernetStatistics;
321     USHORT          wMaxSegmentSize;
322     USHORT          wNumberMCFilters;
323     UCHAR           bNumberPowerFilters;
324     UCHAR           _align_size[3];
325 } UX_HOST_CLASS_ECM_INTERFACE_DESCRIPTOR;
326 
327 /* Define CDC ECM Class function prototypes.  */
328 
329 UINT  _ux_host_class_cdc_ecm_activate(UX_HOST_CLASS_COMMAND *command);
330 UINT  _ux_host_class_cdc_ecm_deactivate(UX_HOST_CLASS_COMMAND *command);
331 UINT  _ux_host_class_cdc_ecm_endpoints_get(UX_HOST_CLASS_CDC_ECM *cdc_ecm);
332 UINT  _ux_host_class_cdc_ecm_entry(UX_HOST_CLASS_COMMAND *command);
333 UINT  _ux_host_class_cdc_ecm_write(VOID *cdc_ecm_class, NX_PACKET *packet);
334 VOID  _ux_host_class_cdc_ecm_interrupt_notification(UX_TRANSFER *transfer_request);
335 VOID  _ux_host_class_cdc_ecm_thread(ULONG parameter);
336 VOID  _ux_host_class_cdc_ecm_transmission_callback(UX_TRANSFER *transfer_request);
337 VOID  _ux_host_class_cdc_ecm_transmit_queue_clean(UX_HOST_CLASS_CDC_ECM *cdc_ecm_control);
338 UINT  _ux_host_class_cdc_ecm_mac_address_get(UX_HOST_CLASS_CDC_ECM *cdc_ecm);
339 
340 /* Define CDC ECM Class API prototypes.  */
341 
342 #define ux_host_class_cdc_ecm_entry        _ux_host_class_cdc_ecm_entry
343 #define ux_host_class_cdc_ecm_write        _ux_host_class_cdc_ecm_write
344 
345 /* Determine if a C++ compiler is being used.  If so, complete the standard
346    C conditional started above.  */
347 #ifdef __cplusplus
348 }
349 #endif
350 
351 #endif
352