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 SRP Component */
15 /** */
16 /** Stream Reservation Protocol (SRP) */
17 /** */
18 /**************************************************************************/
19 /**************************************************************************/
20 #include "nx_srp.h"
21 #include "nx_link.h"
22
23 #ifdef NX_ENABLE_VLAN
24
25 /**************************************************************************/
26 /* */
27 /* FUNCTION RELEASE */
28 /* */
29 /* nx_srp_init PORTABLE C */
30 /* 6.4.0 */
31 /* AUTHOR */
32 /* */
33 /* Wen Wang, Microsoft Corporation */
34 /* */
35 /* DESCRIPTION */
36 /* */
37 /* This function initialize SRP, it initializes MRP, MSRP, MVRP */
38 /* sequencly, and create a thread in MRP initializaton. */
39 /* */
40 /* INPUT */
41 /* */
42 /* srp_ptr SRP instance pointer */
43 /* ip_ptr IP instance pointer */
44 /* interface_index Interface index */
45 /* pkt_pool_ptr Packet pool pointer */
46 /* stack_ptr Stack pointer */
47 /* stack_size Stack size */
48 /* priority SRP thread priority */
49 /* */
50 /* OUTPUT */
51 /* */
52 /* status Completion status */
53 /* */
54 /* CALLS */
55 /* */
56 /* nx_mrp_init MRP initialization */
57 /* nx_msrp_init MSRP initialization */
58 /* nx_mvrp_init MVRP initialization */
59 /* nx_mrp_participant_add ADD mrp participant */
60 /* tx_mutex_put Put protection mutex */
61 /* */
62 /* CALLED BY */
63 /* */
64 /* Application Code */
65 /* */
66 /* RELEASE HISTORY */
67 /* */
68 /* DATE NAME DESCRIPTION */
69 /* */
70 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
71 /* */
72 /**************************************************************************/
nx_srp_init(NX_SRP * srp_ptr,NX_IP * ip_ptr,UINT interface_index,NX_PACKET_POOL * pkt_pool_ptr,VOID * stack_ptr,ULONG stack_size,UINT priority)73 UINT nx_srp_init(NX_SRP *srp_ptr, NX_IP *ip_ptr, UINT interface_index, NX_PACKET_POOL *pkt_pool_ptr,
74 VOID *stack_ptr, ULONG stack_size, UINT priority)
75 {
76 UINT status;
77
78 status = nx_mrp_init(&srp_ptr -> nx_mrp, ip_ptr, interface_index, pkt_pool_ptr, "MRP thread",
79 stack_ptr, stack_size, priority);
80
81
82 if (status)
83 {
84 return(status);
85 }
86
87 nx_msrp_init(&srp_ptr -> nx_msrp);
88
89 nx_mrp_participant_add(&srp_ptr -> nx_mrp, &srp_ptr -> nx_msrp.nx_msrp_participant);
90
91 nx_mvrp_init(&srp_ptr -> nx_mvrp);
92
93 nx_mrp_participant_add(&srp_ptr -> nx_mrp, &srp_ptr -> nx_mvrp.participant);
94
95 return(NX_SUCCESS);
96 }
97
98 /**************************************************************************/
99 /* */
100 /* FUNCTION RELEASE */
101 /* */
102 /* nx_srp_talker_start PORTABLE C */
103 /* 6.4.0 */
104 /* AUTHOR */
105 /* */
106 /* Wen Wang, Microsoft Corporation */
107 /* */
108 /* DESCRIPTION */
109 /* */
110 /* This function start SRP talker, it sets event callback funtions and */
111 /* register domain, Vlan, stream request. */
112 /* */
113 /* INPUT */
114 /* */
115 /* srp_ptr SRP instance pointer */
116 /* domain Sream properties */
117 /* stream_id Stream ID */
118 /* dst_addr Destination address */
119 /* max_frame_size Max frame size */
120 /* max_interval_frames Max frame interval */
121 /* event_callback Application callback */
122 /* */
123 /* OUTPUT */
124 /* */
125 /* status Completion status */
126 /* */
127 /* CALLS */
128 /* */
129 /* nx_msrp_register_domain_request MSRP domain request register */
130 /* nx_mvrp_action_request MVRP request new */
131 /* nx_msrp_register_stream_request MSRP stream request register */
132 /* nx_link_multicast_join Join link multicast */
133 /* nx_srp_talker_cbs_set Talker set CBS */
134 /* */
135 /* CALLED BY */
136 /* */
137 /* Application Code */
138 /* */
139 /* RELEASE HISTORY */
140 /* */
141 /* DATE NAME DESCRIPTION */
142 /* */
143 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
144 /* */
145 /**************************************************************************/
nx_srp_talker_start(NX_SRP * srp_ptr,NX_MSRP_DOMAIN * domain,UCHAR * stream_id,UCHAR * dst_addr,UINT max_frame_size,UINT max_interval_frames,NX_MRP_EVENT_CALLBACK event_callback)146 UINT nx_srp_talker_start(NX_SRP *srp_ptr, NX_MSRP_DOMAIN *domain, UCHAR *stream_id, UCHAR *dst_addr,
147 UINT max_frame_size, UINT max_interval_frames, NX_MRP_EVENT_CALLBACK event_callback)
148 {
149 UINT status;
150 NX_MSRP_TALKER_ADVERTISE talker_advertise;
151 UINT index = NX_SRP_TALKER_NUM;
152 CHAR interface_name[32];
153 INT i;
154
155 srp_ptr -> nx_msrp.msrp_event_callback = event_callback;
156
157 srp_ptr -> nx_mvrp.mvrp_event_callback = event_callback;
158
159 /*send register domain request*/
160 status = nx_msrp_register_domain_request(&(srp_ptr -> nx_mrp), &(srp_ptr -> nx_msrp.nx_msrp_participant), domain, NX_MSRP_ACTION_NEW);
161
162 if (status != NX_SUCCESS)
163 {
164
165 return(status);
166 }
167
168 srp_ptr -> nx_mvrp.mvrp_event_callback = event_callback;
169
170 /*send vlan new request*/
171 status = nx_mvrp_action_request(&(srp_ptr -> nx_mrp), &(srp_ptr -> nx_mvrp.participant), domain -> sr_class_vid, NX_MVRP_ACTION_NEW);
172 if (status != NX_SUCCESS)
173 {
174
175 return(status);
176 }
177
178 memcpy(talker_advertise.stream_id, stream_id, 8); /* use case of memcpy is verified. */
179 memcpy(talker_advertise.dest_addr, dst_addr, 6); /* use case of memcpy is verified. */
180 talker_advertise.vlan_identifier = domain -> sr_class_vid;
181 talker_advertise.max_frame_size = (USHORT)max_frame_size;
182 talker_advertise.max_interval_frames = (USHORT)max_interval_frames;
183 talker_advertise.priority = (UCHAR)(domain -> sr_class_priority & 0x07);
184 talker_advertise.accumulated_latency = 0;
185
186 /*send register stream request*/
187 status = nx_msrp_register_stream_request(&(srp_ptr -> nx_mrp), &(srp_ptr -> nx_msrp.nx_msrp_participant), &talker_advertise, NX_MSRP_ACTION_NEW);
188
189 if (status != NX_SUCCESS)
190 {
191
192 return(status);
193 }
194
195 for (i = 0; i < NX_SRP_TALKER_NUM; i++)
196 {
197 if (srp_ptr -> talker[i].in_used == NX_FALSE)
198 {
199 index = (UINT)i;
200 srp_ptr -> talker[i].in_used = NX_TRUE;
201 break;
202 }
203 }
204
205 if (index == NX_SRP_TALKER_NUM)
206 {
207 printf("No resource to allocate for talker with stream ID:%s.\r\n", stream_id);
208 return(NX_NO_MORE_ENTRIES);
209 }
210
211 if (domain -> sr_class_id == NX_SRP_SR_CLASS_A)
212 {
213 srp_ptr -> talker[index].interval = NX_SRP_CLASS_A_INTERVAL;
214 }
215 else if (domain -> sr_class_id == NX_SRP_SR_CLASS_B)
216 {
217 srp_ptr -> talker[index].interval = NX_SRP_CLASS_B_INTERVAL;
218 }
219 else
220 {
221 /* Do not support other kind of SR Class Currently. */
222 return(NX_INVALID_PARAMETERS);
223 }
224
225 memcpy(srp_ptr -> talker[index].stream_id, stream_id, 8); /* use case of memcpy is verified. */
226 srp_ptr -> talker[index].class_id = domain -> sr_class_id;
227 srp_ptr -> talker[index].class_priority = domain -> sr_class_priority;
228 srp_ptr -> talker[index].class_vid = domain -> sr_class_vid;
229 srp_ptr -> talker[index].max_interval_frames = max_interval_frames;
230 srp_ptr -> talker[index].max_frame_size = max_frame_size;
231
232 srp_ptr -> talker[index].physical_address_msw = (ULONG)dst_addr[0] << 8 | dst_addr[1];
233 srp_ptr -> talker[index].physical_address_lsw = (ULONG)dst_addr[2] << 24 | \
234 (ULONG)dst_addr[3] << 16 | \
235 (ULONG)dst_addr[4] << 8 | \
236 (ULONG)dst_addr[5];
237
238 sprintf(interface_name, "NetX IP Interface 0:%u", srp_ptr -> talker[index].class_vid);
239
240 status = nx_link_multicast_join(srp_ptr -> nx_mrp.ip_ptr, srp_ptr -> nx_mrp.interface_index,
241 srp_ptr -> talker[index].physical_address_msw,
242 srp_ptr -> talker[index].physical_address_lsw);
243
244 if (status != NX_SUCCESS)
245 {
246 return(status);
247 }
248 else
249 {
250 printf("[Talker]multicast address join %lx-%lx successful\r\n",
251 srp_ptr -> talker[index].physical_address_msw,
252 srp_ptr -> talker[index].physical_address_lsw);
253 }
254
255 status = nx_srp_talker_cbs_set(srp_ptr, index);
256 if (status != NX_SUCCESS)
257 {
258 return(status);
259 }
260 else
261 {
262 printf("[Talker]CBS set successful\r\n");
263 }
264
265 return(status);
266 }
267
268 /**************************************************************************/
269 /* */
270 /* FUNCTION RELEASE */
271 /* */
272 /* nx_srp_listener_start PORTABLE C */
273 /* 6.4.0 */
274 /* AUTHOR */
275 /* */
276 /* Wen Wang, Microsoft Corporation */
277 /* */
278 /* DESCRIPTION */
279 /* */
280 /* This function start SRP listener. It enables listener and set user */
281 /* date and callback function. */
282 /* */
283 /* INPUT */
284 /* */
285 /* srp_ptr SRP instance pointer */
286 /* event_callback Application callback */
287 /* stream_id Stream ID */
288 /* */
289 /* OUTPUT */
290 /* */
291 /* status Completion status */
292 /* */
293 /* CALLS */
294 /* */
295 /* None */
296 /* */
297 /* CALLED BY */
298 /* */
299 /* Application Code */
300 /* */
301 /* RELEASE HISTORY */
302 /* */
303 /* DATE NAME DESCRIPTION */
304 /* */
305 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
306 /* */
307 /**************************************************************************/
nx_srp_listener_start(NX_SRP * srp_ptr,NX_MRP_EVENT_CALLBACK event_callback,UCHAR * stream_id)308 UINT nx_srp_listener_start(NX_SRP *srp_ptr, NX_MRP_EVENT_CALLBACK event_callback, UCHAR *stream_id)
309 {
310 /* Allowed to response to talker.*/
311 srp_ptr -> nx_msrp.listener_enable = 1;
312
313 srp_ptr -> nx_msrp.msrp_event_callback = event_callback;
314
315 srp_ptr -> nx_mvrp.mvrp_event_callback = event_callback;
316
317 /* Listener set the stream_id it will accept, it could be NX_NULL.*/
318 srp_ptr -> nx_msrp.msrp_callback_data = stream_id;
319
320 return(NX_MSRP_SUCCESS);
321 }
322
323 /**************************************************************************/
324 /* */
325 /* FUNCTION RELEASE */
326 /* */
327 /* nx_srp_talker_stop PORTABLE C */
328 /* 6.4.0 */
329 /* AUTHOR */
330 /* */
331 /* Wen Wang, Microsoft Corporation */
332 /* */
333 /* DESCRIPTION */
334 /* */
335 /* This function stop SRP talker. It withdraw the domain,Vlan,stream */
336 /* request. */
337 /* */
338 /* INPUT */
339 /* */
340 /* srp_ptr SRP instance pointer */
341 /* stream_id Stream ID */
342 /* domain Stream properties */
343 /* */
344 /* OUTPUT */
345 /* */
346 /* status Completion status */
347 /* */
348 /* CALLS */
349 /* */
350 /* nx_msrp_deregister_domain_request MSRP domain request deregister*/
351 /* nx_mvrp_action_request MVRP request leave */
352 /* nx_msrp_deregister_stream_request MSRP stream request deregister*/
353 /* */
354 /* CALLED BY */
355 /* */
356 /* Application Code */
357 /* */
358 /* RELEASE HISTORY */
359 /* */
360 /* DATE NAME DESCRIPTION */
361 /* */
362 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
363 /* */
364 /**************************************************************************/
nx_srp_talker_stop(NX_SRP * srp_ptr,UCHAR * stream_id,NX_MSRP_DOMAIN * domain)365 UINT nx_srp_talker_stop(NX_SRP *srp_ptr, UCHAR *stream_id, NX_MSRP_DOMAIN *domain)
366 {
367 UINT status;
368
369 /* Send deregister domain request*/
370 status = nx_msrp_deregister_domain_request(&srp_ptr -> nx_mrp, &srp_ptr -> nx_msrp.nx_msrp_participant, domain);
371
372 if (status != NX_SUCCESS)
373 {
374 return(status);
375 }
376
377 /* Send vlan leave request*/
378 status = nx_mvrp_action_request(&(srp_ptr -> nx_mrp), &(srp_ptr -> nx_mvrp.participant), domain -> sr_class_vid, NX_MVRP_ACTION_TYPE_LEAVE);
379
380 if (status != NX_SUCCESS)
381 {
382 return(status);
383 }
384
385 /* Send deregister stream request*/
386 status = nx_msrp_deregister_stream_request(&srp_ptr -> nx_mrp, &srp_ptr -> nx_msrp.nx_msrp_participant, stream_id);
387
388 return(status);
389 }
390
391 /**************************************************************************/
392 /* */
393 /* FUNCTION RELEASE */
394 /* */
395 /* nx_srp_listener_stop PORTABLE C */
396 /* 6.4.0 */
397 /* AUTHOR */
398 /* */
399 /* Wen Wang, Microsoft Corporation */
400 /* */
401 /* DESCRIPTION */
402 /* */
403 /* This function stop SRP listener. It unregister the domain,Vlan */
404 /* stream attached to talker. */
405 /* */
406 /* INPUT */
407 /* */
408 /* srp_ptr SRP instance pointer */
409 /* stream_id Stream ID */
410 /* domain Stream properties */
411 /* */
412 /* OUTPUT */
413 /* */
414 /* status Completion status */
415 /* */
416 /* CALLS */
417 /* */
418 /* nx_msrp_deregister_domain_request MSRP domain request deregister*/
419 /* nx_mvrp_action_request MVRP request leave */
420 /* nx_msrp_deregister_attach_request MSRP stream attach deregister */
421 /* */
422 /* CALLED BY */
423 /* */
424 /* Application Code */
425 /* */
426 /* RELEASE HISTORY */
427 /* */
428 /* DATE NAME DESCRIPTION */
429 /* */
430 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
431 /* */
432 /**************************************************************************/
nx_srp_listener_stop(NX_SRP * srp_ptr,UCHAR * stream_id,NX_MSRP_DOMAIN * domain)433 UINT nx_srp_listener_stop(NX_SRP *srp_ptr, UCHAR *stream_id, NX_MSRP_DOMAIN *domain)
434 {
435 UINT status;
436
437 if (stream_id == NX_NULL)
438 {
439 return(NX_SRP_PARAMETER_NULL);
440 }
441
442 if (domain == NX_NULL)
443 {
444 return(NX_SRP_PARAMETER_NULL);
445 }
446
447 /* Send deregister domain request.*/
448 status = nx_msrp_deregister_domain_request(&srp_ptr -> nx_mrp, &srp_ptr -> nx_msrp.nx_msrp_participant, domain);
449
450 if (status != NX_SUCCESS)
451 {
452 return(status);
453 }
454
455 /* Send vlan leave request.*/
456 status = nx_mvrp_action_request(&(srp_ptr -> nx_mrp), &(srp_ptr -> nx_mvrp.participant), domain -> sr_class_vid, NX_MVRP_ACTION_TYPE_LEAVE);
457
458
459 if (status != NX_SUCCESS)
460 {
461 return(status);
462 }
463
464 /* Send deregister attach request.*/
465 status = nx_msrp_deregister_attach_request(&srp_ptr -> nx_mrp, &srp_ptr -> nx_msrp.nx_msrp_participant, stream_id);
466
467 return(status);
468 }
469
470 /**************************************************************************/
471 /* */
472 /* FUNCTION RELEASE */
473 /* */
474 /* nx_srp_cbs_config_get PORTABLE C */
475 /* 6.4.0 */
476 /* AUTHOR */
477 /* */
478 /* Wen Wang, Microsoft Corporation */
479 /* */
480 /* DESCRIPTION */
481 /* */
482 /* This function get CBS parameters from SRP talker parameter. */
483 /* */
484 /* INPUT */
485 /* */
486 /* sr_class Stream class */
487 /* port_rate ethernet port rate */
488 /* frames_per_interval Freames per interval */
489 /* max_frame_size Max frame size */
490 /* non_sr_frame_size Non-stream frame size */
491 /* idle_slope_a stream A class Idle slope */
492 /* max_frame_size_a stream A class Max frame size */
493 /* cbs_param CBS parameter */
494 /* */
495 /* OUTPUT */
496 /* */
497 /* status Completion status */
498 /* */
499 /* CALLS */
500 /* */
501 /* None. */
502 /* */
503 /* CALLED BY */
504 /* */
505 /* nx_srp_talker_cbs_set Set CBS parameter */
506 /* */
507 /* RELEASE HISTORY */
508 /* */
509 /* DATE NAME DESCRIPTION */
510 /* */
511 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
512 /* */
513 /**************************************************************************/
nx_srp_cbs_config_get(UINT sr_class,INT port_rate,UINT interval,UINT frames_per_interval,UINT max_frame_size,UINT non_sr_frame_size,INT idle_slope_a,UINT max_frame_size_a,NX_SHAPER_CBS_PARAMETER * cbs_param)514 UINT nx_srp_cbs_config_get(UINT sr_class, INT port_rate, UINT interval, UINT frames_per_interval, UINT max_frame_size, UINT non_sr_frame_size, INT idle_slope_a, UINT max_frame_size_a, NX_SHAPER_CBS_PARAMETER *cbs_param)
515 {
516 if (sr_class == NX_SRP_SR_CLASS_A)
517 {
518 cbs_param -> idle_slope = (INT)((long long)1000000 / interval * frames_per_interval * max_frame_size * 8 / 1000000); /* transfer to Mbps */
519 if (cbs_param -> idle_slope >= port_rate)
520 {
521 printf("The Idleslope : %dMbps must be set less than port rate : %dMbps.\n", cbs_param -> idle_slope, port_rate);
522 return(NX_INVALID_PARAMETERS);
523 }
524 cbs_param -> send_slope = cbs_param -> idle_slope - port_rate;
525 cbs_param -> hi_credit = (INT)((long long)cbs_param -> idle_slope * non_sr_frame_size / port_rate);
526 cbs_param -> low_credit = (INT)((long long)cbs_param -> send_slope * max_frame_size / port_rate);
527
528 return(NX_SUCCESS);
529 }
530 else if (sr_class == NX_SRP_SR_CLASS_B)
531 {
532 cbs_param -> idle_slope = (INT)((long long)1000000 / interval * frames_per_interval * max_frame_size * 8 / 1000000); /* transfer to Kbps */
533 if (cbs_param -> idle_slope >= port_rate)
534 {
535 printf("The Idleslope : %dMbps must be set less than port rate : %dMbps.\n", cbs_param -> idle_slope, port_rate);
536 return(NX_INVALID_PARAMETERS);
537 }
538 cbs_param -> send_slope = cbs_param -> idle_slope - port_rate;
539 cbs_param -> hi_credit = (INT)((long long)cbs_param -> idle_slope * non_sr_frame_size / (port_rate - idle_slope_a) + (long long)cbs_param -> idle_slope * max_frame_size_a / port_rate);
540 cbs_param -> low_credit = (INT)((long long)cbs_param -> send_slope * max_frame_size / port_rate);
541
542 return(NX_SUCCESS);
543 }
544 else
545 {
546 return(NX_INVALID_PARAMETERS);
547 }
548 }
549 /**************************************************************************/
550 /* */
551 /* FUNCTION RELEASE */
552 /* */
553 /* nx_srp_talker_cbs_set PORTABLE C */
554 /* 6.4.0 */
555 /* AUTHOR */
556 /* */
557 /* Wen Wang, Microsoft Corporation */
558 /* */
559 /* DESCRIPTION */
560 /* */
561 /* This function get CBS parameters. */
562 /* */
563 /* INPUT */
564 /* */
565 /* srp_ptr SRP instance pointer */
566 /* stream_id Stream ID */
567 /* domain Stream properties */
568 /* */
569 /* OUTPUT */
570 /* */
571 /* status Completion status */
572 /* */
573 /* CALLS */
574 /* */
575 /* nx_srp_cbs_config_get Get CBS parameter */
576 /* nx_shaper_cbs_parameter_set Set CBS parameter to shaper */
577 /* layer. */
578 /* nx_shaper_port_rate_get Get ethernet port rate from */
579 /* shaper layer. */
580 /* */
581 /* CALLED BY */
582 /* */
583 /* nx_srp_talker_start Start SRP talker */
584 /* */
585 /* RELEASE HISTORY */
586 /* */
587 /* DATE NAME DESCRIPTION */
588 /* */
589 /* 12-31-2023 Wen Wang Initial Version 6.4.0 */
590 /* */
591 /**************************************************************************/
nx_srp_talker_cbs_set(NX_SRP * srp_ptr,UINT index)592 UINT nx_srp_talker_cbs_set(NX_SRP *srp_ptr, UINT index)
593 {
594 UINT status;
595 NX_INTERFACE *interface_ptr;
596 UINT port_rate;
597 INT i;
598 INT idle_slope_a = 0;
599 UINT max_frame_size_a = 0;
600
601 interface_ptr = &(srp_ptr -> nx_mrp.ip_ptr -> nx_ip_interface[srp_ptr -> nx_mrp.interface_index]);
602 status = nx_shaper_port_rate_get(interface_ptr, &port_rate);
603 if (status)
604 {
605 return(status);
606 }
607
608 if (srp_ptr -> talker[index].class_id == NX_SRP_SR_CLASS_B)
609 {
610 for (i = 0; i < NX_SRP_TALKER_NUM; i++)
611 {
612 if (srp_ptr -> talker[i].in_used == NX_FALSE)
613 {
614 continue;
615 }
616
617 if (srp_ptr -> talker[i].class_id == NX_SRP_SR_CLASS_A)
618 {
619 idle_slope_a = srp_ptr -> talker[i].cbs_parameters.idle_slope;
620 max_frame_size_a = srp_ptr -> talker[i].max_frame_size;
621 break;
622 }
623 }
624 }
625 /* Get CBS parameters from SRP paramter. */
626 status = nx_srp_cbs_config_get(srp_ptr -> talker[index].class_id,
627 (INT)port_rate,
628 srp_ptr -> talker[index].interval,
629 srp_ptr -> talker[index].max_interval_frames,
630 srp_ptr -> talker[index].max_frame_size,
631 interface_ptr -> nx_interface_ip_mtu_size,
632 idle_slope_a,
633 max_frame_size_a,
634 &(srp_ptr -> talker[index].cbs_parameters));
635 if (status)
636 {
637 return(status);
638 }
639
640 printf("cbs parameters: idle slope: %d, send slope: %d, hi credit: %d, low credit: %d\r\n",
641 srp_ptr -> talker[index].cbs_parameters.idle_slope,
642 srp_ptr -> talker[index].cbs_parameters.send_slope,
643 srp_ptr -> talker[index].cbs_parameters.hi_credit,
644 srp_ptr -> talker[index].cbs_parameters.low_credit);
645
646 /* Set CBS parameters to shaper layer. */
647 if (srp_ptr -> talker[index].class_id == NX_SRP_SR_CLASS_A)
648 {
649 status = nx_shaper_cbs_parameter_set(interface_ptr, &(srp_ptr -> talker[index].cbs_parameters), NX_SHAPER_CLASS_A_PCP);
650 }
651 else
652 {
653 status = nx_shaper_cbs_parameter_set(interface_ptr, &(srp_ptr -> talker[index].cbs_parameters), NX_SHAPER_CLASS_B_PCP);
654 }
655
656 return(status);
657 }
658 #endif /* NX_ENABLE_VLAN */
659