From da8ff6fbdb83365ae2ea24e6cc6cd48c9afe6718 Mon Sep 17 00:00:00 2001 From: Yajun Xia Date: Fri, 23 Feb 2024 14:50:16 +0800 Subject: [PATCH 1/8] Draft init. --- rtos-docs/netx-duo/chapter6.md | 57 ++++++++++++++++++ .../media/user-guide/tsn-framework.png | Bin 0 -> 51302 bytes rtos-docs/netx-duo/overview-netx-duo.md | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 rtos-docs/netx-duo/chapter6.md create mode 100644 rtos-docs/netx-duo/media/user-guide/tsn-framework.png diff --git a/rtos-docs/netx-duo/chapter6.md b/rtos-docs/netx-duo/chapter6.md new file mode 100644 index 0000000..43ce3b8 --- /dev/null +++ b/rtos-docs/netx-duo/chapter6.md @@ -0,0 +1,57 @@ +--- +title: Chapter 6 - TSN components of NetX Duo +description: This chapter contains an introduction to TSN components and a description of its applications and benefits. +--- + +# Chapter 6 - TSN Components of NetX Duo + +This chapter contains an introduction to TSN components and a description of its applications and benefits. + +## Protocol framework +Time-Sensitive Networking (TSN) is a set of standards developed by the IEEE 802.1 working group. These standards define the mechanisms for transmitting time-sensitive data effectively over Ethernet networks. + +In this chapter, the TSN compents in below frame work in colour blue are described. +![TSN Framework](./media/user-guide/tsn-framework.png) + +## Link layer + + + +## Credit-based shaper (CBS) +### Introduction +Credit-based shaper (CBS) is a traffic shaping mechanism that is in audio video bridge(AVB) network, to ensure/control the bandwidth of specific audio and video traffic streams. this mechanism can ensure that the data is transmitted at a constant rate and to avoid congestion in the network. + +### APIs +#### API to set the CBS parameters +```c +UINT nx_shaper_cbs_parameter_set(NX_INTERFACE *interface_ptr, NX_SHAPER_CBS_PARAMETER *cbs_parameter, UCHAR pcp); +``` +This API sets the CBS parameters for the specified interface and priority. The CBS parameters include the maximum burst size, the time interval, and the credit limit. + +#### API to get the CBS parameters +```c +UINT nx_shaper_cbs_parameter_get(NX_INTERFACE *interface_ptr, NX_SHAPER_CBS_PARAMETER *cbs_parameter, UCHAR pcp); +``` +This API gets the CBS parameters for the specified interface and priority. + + +## IEEE 802.1Qbv Enhancements to Traffic Scheduling: Time-Aware Shaper (TAS) +The IEEE 802.1Qbv time-aware scheduler is designed to separate the communication on the Ethernet network into fixed length, repeating time cycles. Within these cycles, different time slices can be configured that can be assigned to one or several of the eight Ethernet priorities. By doing this, it is possible to grant exclusive use - for a limited time - to the Ethernet transmission medium for those traffic classes that need transmission guarantees and can't be interrupted. The basic concept is a time-division multiple access (TDMA) scheme. By establishing virtual communication channels for specific time periods, time-critical communication can be separated from non-critical background traffic. + +## Frame preemption (FPE) +Frame preemption defines two MAC services for an egress port, preemptable MAC (pMAC) and express MAC (eMAC). Express frames can interrupt transmission of preemptable frames. On resume, MAC merge sublayer re-assembles frame fragments in the next bridge. + +## Time synchronization(gPTP) +IEEE 802.1AS-2011 defines the Generalized Precision Time Protocol (gPTP) profile which, like all profiles of IEEE 1588, selects among the options of 1588, but also generalizes the architecture to allow PTP to apply beyond wired Ethernet networks. + +To account for data path delays, the gPTP protocol measures the frame residence time within each bridge (the time required for receiving, processing, queuing and transmission of timing information from the ingress to egress ports), and the link latency of each hop (a propagation delay between two adjacent bridges). These calculated delays are then referenced to the GrandMaster (GM) clock in a bridge elected by the Best Master Clock Algorithm, a clock spanning tree protocol to which all from Clock Master (CM) and endpoint devices attempt to synchronize. Any device which does not synchronize to timing messages is outside of the timing domain boundaries. + +## Stream reservation protocol (SRP) + + + +## Multiple streams reservation protocol (MSRP) + +## Multiple vlan registration protocol (MVRP) + +## Multiple registration protocol (MRP) \ No newline at end of file diff --git a/rtos-docs/netx-duo/media/user-guide/tsn-framework.png b/rtos-docs/netx-duo/media/user-guide/tsn-framework.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0c9d6f7b9b97b462041972dcfe7f0161d4815f GIT binary patch literal 51302 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

8Q(1#0I_EsRS|jTVOB0}wl`BVw_^5p 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 literal 0 HcmV?d00001 diff --git a/rtos-docs/netx-duo/overview-netx-duo.md b/rtos-docs/netx-duo/overview-netx-duo.md index c6afeb9..8c90baf 100644 --- a/rtos-docs/netx-duo/overview-netx-duo.md +++ b/rtos-docs/netx-duo/overview-netx-duo.md @@ -167,7 +167,7 @@ NetX Duo supports the following HTTP/HTTPS protocols. - User Datagram Protocol (UDP) - Minimal 2.5 KB FLASH, 124 sockets bytes of RAM per socket -- Fast, near wirespeed TCP packet processing: +- Fast, near wirespeed UDP packet processing: - RX 95 Mbps on 100 Mbps Ethernet, MCU @100MHz, 14% MCU utilization - TX 94 Mbps on 100 Mbps Ethernet, MCU @100MHz, 10% MCU utilization - UDP Fast Pathâ„¢ technology From e211daec9f4db4aae05b39be9e490a2a7328cc85 Mon Sep 17 00:00:00 2001 From: Yajun Xia Date: Thu, 21 Mar 2024 10:08:55 +0800 Subject: [PATCH 2/8] Update in 3/21. --- rtos-docs/netx-duo/chapter3.md | 69 ++++++++++++++++++++++++++++++++++ rtos-docs/netx-duo/chapter6.md | 57 ---------------------------- 2 files changed, 69 insertions(+), 57 deletions(-) delete mode 100644 rtos-docs/netx-duo/chapter6.md diff --git a/rtos-docs/netx-duo/chapter3.md b/rtos-docs/netx-duo/chapter3.md index 720777f..ead3c93 100644 --- a/rtos-docs/netx-duo/chapter3.md +++ b/rtos-docs/netx-duo/chapter3.md @@ -1454,3 +1454,72 @@ A driver function is needed for each IP interface. Refer to [Chapter 5](chapter5 - Only TCP and UDP sockets are supported - DHCP is usually done by underlayer TCP/IP stack not NetX Duo - Other limitations from underlayer TCP/IP stack + +## TSN Components + +Time-Sensitive Networking (TSN) is a suite of standards crafted by the IEEE 802.1 working group aimed at augmenting the capabilities of Ethernet networks. These standards define mechanisms for transmitting time-sensitive data over deterministic Ethernet networks. + +In this section, the TSN compents in below frame work in colour blue are described. + +![Diagram of TSN Framework](./media/user-guide/tsn-framework.png) + +**FIGURE 15. TSN Framework** + +### Link layer +In NetxDuo, the Link Layer component offers a range of essential functionalities, These include: + +VLAN Interface Creation: NetxDuo allows for the seamless creation of Virtual Local Area Network (VLAN) interfaces, enabling the segmentation of network traffic into distinct logical networks. + +VLAN ID Modification: It provides the capability to modify VLAN IDs on specific VLAN interface, facilitating the customization and management of VLAN configurations to suit specific network requirements. + +Raw Packet Transmission: NetxDuo provides a Raw Packet transmission interface for direct transmission of network packets at the Link Layer. This is particularly useful for specialized network communication needs, such as the direct sending of packets by MRP and ptp components using raw packet transmission. + +Packet Distribution for Received Packets: The Link Layer in NetxDuo efficiently handles the reception of network packets, distributing them appropriately based on packet types. This includes the distribution of VLAN-tagged packets to the corresponding VLAN interfaces and the distribution of untagged packets to the default interface. + +Above functionalities are used by TSN components to implement TSN features. + +### Credit-based shaper (CBS) - IEEE 802.1Qav Forwarding and Queuing Enhancements for Time-Sensitive Stream +Credit-based shaper (CBS) is a traffic shaping mechanism that is in audio video bridge(AVB) network, to ensure/control the bandwidth of specific audio and video traffic streams. this mechanism can ensure that the data is transmitted at a constant rate and to avoid congestion in the network. + +In CBS module of NetxDuo, following functionalities are provided: +- CBS shaper creation and deletion. +- The Mapping configuration of PCP on VLAN tag to related hardware queue. +- CBS parameters Setting, such as idle slope, send slope, and CBS credit limit. + +By utilizing these functionalities, we can assign different SR class traffic to specific hardware queues and control the bandwidth of the traffic by setting the CBS parameters on related hardware queues. + +### Time-Aware Shaper (TAS) - IEEE 802.1Qbv Enhancements to Traffic Scheduling +TAS (Time-Aware Scheduler) in TSN (Time-Sensitive Networking) is designed to ensures deterministic and prioritized communication by controlling the bandwidth allocation for high-priority streams through gate control and regulating cycles. + +The IEEE 802.1Qbv time-aware scheduler orchestrates Ethernet network communication by dividing it into fixed-length, repeating time cycles. Within these cycles, customizable time slices are allocated to one or multiple of the eight Ethernet priorities. This approach enables exclusive utilization of the Ethernet transmission medium for time-sensitive traffic classes, ensuring uninterrupted transmission guarantees when needed. Operating on a time-division multiple access (TDMA) scheme, the scheduler establishes virtual communication channels for specific time periods, effectively segregating time-critical communication from non-critical background traffic. + +In TAS module of NetxDuo, following functionalities are provided: +- TAS shaper creation and deletion. (Shared with CBS and FPE) +- The Mapping configuration of PCP on VLAN tag to related hardware queue.(Shared with CBS) +- TAS parameters setting. Include base time, cycle time, time slot and associated gate control settings. + +By leveraging these functionalities, high-priority traffic can be directed to specific hardware queues with allocated time slots, enabling precise bandwidth control. Furthermore, through synchronized TAS settings across the entire TSN infrastructure and time synchronization facilitated by gPTP (generalized Precision Time Protocol), we can effectively manage end-to-end latency for traffic, ensuring timely and reliable communication. + +### Frame preemption (FPE) - 802.1Qbu +Frame Preemption (FPE) is a TSN feature that allows high-priority frames to interrupt the transmission of lower-priority frames. This feature is particularly useful in time-sensitive applications, where the timely delivery of high-priority frames is critical. By preempting the transmission of lower-priority frames, high-priority frames can be transmitted without delay, ensuring that they are delivered within the required time frame. + +In FPE module of NetxDuo, following functionalities are provided: +- FPE shaper creation and deletion. (Shared with CBS and TAS) +- FPE parameters setting. such as enable/disable the FPE verification, express queue bitmap setting, ha/ra time setting, express queue guard band enable/disable. + +FPE (Frame Preemption Engine) is typically utilized in conjunction with TAS (Time-Aware Scheduler). By fragmenting preemptable frames, the guard band required for preemptable frame slots is reduced, thus increasing bandwidth utilization efficiency. + +### Time synchronization(gPTP) +The gPTP (Generalized Precision Time Protocol), as described in the IEEE 1588 Precision Time Protocol standard, is utilized within Time-Sensitive Networks (TSN) to synchronize time across network devices. + + +### Stream reservation protocol (SRP) + + +### Multiple streams reservation protocol (MSRP) + + +### Multiple vlan registration protocol (MVRP) + + +### Multiple registration protocol (MRP) diff --git a/rtos-docs/netx-duo/chapter6.md b/rtos-docs/netx-duo/chapter6.md deleted file mode 100644 index 43ce3b8..0000000 --- a/rtos-docs/netx-duo/chapter6.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Chapter 6 - TSN components of NetX Duo -description: This chapter contains an introduction to TSN components and a description of its applications and benefits. ---- - -# Chapter 6 - TSN Components of NetX Duo - -This chapter contains an introduction to TSN components and a description of its applications and benefits. - -## Protocol framework -Time-Sensitive Networking (TSN) is a set of standards developed by the IEEE 802.1 working group. These standards define the mechanisms for transmitting time-sensitive data effectively over Ethernet networks. - -In this chapter, the TSN compents in below frame work in colour blue are described. -![TSN Framework](./media/user-guide/tsn-framework.png) - -## Link layer - - - -## Credit-based shaper (CBS) -### Introduction -Credit-based shaper (CBS) is a traffic shaping mechanism that is in audio video bridge(AVB) network, to ensure/control the bandwidth of specific audio and video traffic streams. this mechanism can ensure that the data is transmitted at a constant rate and to avoid congestion in the network. - -### APIs -#### API to set the CBS parameters -```c -UINT nx_shaper_cbs_parameter_set(NX_INTERFACE *interface_ptr, NX_SHAPER_CBS_PARAMETER *cbs_parameter, UCHAR pcp); -``` -This API sets the CBS parameters for the specified interface and priority. The CBS parameters include the maximum burst size, the time interval, and the credit limit. - -#### API to get the CBS parameters -```c -UINT nx_shaper_cbs_parameter_get(NX_INTERFACE *interface_ptr, NX_SHAPER_CBS_PARAMETER *cbs_parameter, UCHAR pcp); -``` -This API gets the CBS parameters for the specified interface and priority. - - -## IEEE 802.1Qbv Enhancements to Traffic Scheduling: Time-Aware Shaper (TAS) -The IEEE 802.1Qbv time-aware scheduler is designed to separate the communication on the Ethernet network into fixed length, repeating time cycles. Within these cycles, different time slices can be configured that can be assigned to one or several of the eight Ethernet priorities. By doing this, it is possible to grant exclusive use - for a limited time - to the Ethernet transmission medium for those traffic classes that need transmission guarantees and can't be interrupted. The basic concept is a time-division multiple access (TDMA) scheme. By establishing virtual communication channels for specific time periods, time-critical communication can be separated from non-critical background traffic. - -## Frame preemption (FPE) -Frame preemption defines two MAC services for an egress port, preemptable MAC (pMAC) and express MAC (eMAC). Express frames can interrupt transmission of preemptable frames. On resume, MAC merge sublayer re-assembles frame fragments in the next bridge. - -## Time synchronization(gPTP) -IEEE 802.1AS-2011 defines the Generalized Precision Time Protocol (gPTP) profile which, like all profiles of IEEE 1588, selects among the options of 1588, but also generalizes the architecture to allow PTP to apply beyond wired Ethernet networks. - -To account for data path delays, the gPTP protocol measures the frame residence time within each bridge (the time required for receiving, processing, queuing and transmission of timing information from the ingress to egress ports), and the link latency of each hop (a propagation delay between two adjacent bridges). These calculated delays are then referenced to the GrandMaster (GM) clock in a bridge elected by the Best Master Clock Algorithm, a clock spanning tree protocol to which all from Clock Master (CM) and endpoint devices attempt to synchronize. Any device which does not synchronize to timing messages is outside of the timing domain boundaries. - -## Stream reservation protocol (SRP) - - - -## Multiple streams reservation protocol (MSRP) - -## Multiple vlan registration protocol (MVRP) - -## Multiple registration protocol (MRP) \ No newline at end of file From da7c4d4b9618e07f0bef906e035208ea51280c45 Mon Sep 17 00:00:00 2001 From: wangwen Date: Thu, 21 Mar 2024 15:33:00 +0800 Subject: [PATCH 3/8] add gptp/msrp/srp in chapter3 --- rtos-docs/netx-duo/chapter3.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/rtos-docs/netx-duo/chapter3.md b/rtos-docs/netx-duo/chapter3.md index ead3c93..acdc0f7 100644 --- a/rtos-docs/netx-duo/chapter3.md +++ b/rtos-docs/netx-duo/chapter3.md @@ -1512,12 +1512,35 @@ FPE (Frame Preemption Engine) is typically utilized in conjunction with TAS (Tim ### Time synchronization(gPTP) The gPTP (Generalized Precision Time Protocol), as described in the IEEE 1588 Precision Time Protocol standard, is utilized within Time-Sensitive Networks (TSN) to synchronize time across network devices. +In gPTP module of NetxDuo, following functionalities are provided: +- Creation and deletion of PTP client. +- Starting and stopping the PTP client. +- Retrieving and setting the PTP clock in the client. +- Acquiring master clock information and sync message details through the PTP client. +- Transmission of timestamp notifications for PTP packets. +- Implementation of a software-based PTP clock. +- Utility of computing the difference between two PTP times. +- Utility of converting a PTP time to a UTC date and time. -### Stream reservation protocol (SRP) +### Stream Registration Protocol (SRP) +SRP (Stream Reservation Protocol) is a protocol used in Time-Sensitive Networking (TSN). It allows devices to reserve resources for specific streams of data across the network. This ensures that these streams have the necessary bandwidth and can meet their time sensitivity requirements. +In SRP module of NetxDuo, following functionalities are provided: +- Initializaiton of SRP service. +- Starting and stopping the SRP talker service. +- Starting and stopping the SRP listener service. -### Multiple streams reservation protocol (MSRP) +### Multiple Stream Reservation Protocol (MSRP) +MSRP (Multiple Stream Reservation Protocol) in Time-Sensitive Networking (TSN) is an extension of the Stream Reservation Protocol (SRP). By allowing multiple stream reservations, MSRP enhances the deterministic data delivery capabilities of TSN, ensuring that data can be delivered with a guaranteed level of performance across multiple streams. +In MSRP module of NetxDuo, following functionalities are provided: +- Initialization of an MSRP instance. +- Parsing and packing of MRP Data Units (MRPDUs). +- Management of the registration and deregistration processes for a stream. +- Management of the registration and deregistration processes for an attachment to a stream. +- Handling of indications for a stream's registration and deregistration events. +- Handling of indications for an attachment's registration and deregistration events. +- Management of the registration and deregistration processes for a domain, as well as handling the indications of these events. ### Multiple vlan registration protocol (MVRP) From b38f1f5cd48f853eb77d6344208bfb4ba0466ee0 Mon Sep 17 00:00:00 2001 From: wangwen Date: Thu, 21 Mar 2024 21:32:55 +0800 Subject: [PATCH 4/8] add ptp/CBS in chapter5 --- rtos-docs/netx-duo/chapter5.md | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/rtos-docs/netx-duo/chapter5.md b/rtos-docs/netx-duo/chapter5.md index b59835c..9dfb7c5 100644 --- a/rtos-docs/netx-duo/chapter5.md +++ b/rtos-docs/netx-duo/chapter5.md @@ -531,3 +531,67 @@ The following driver commands are required for network interfaces with TCP/IP se * Cleanup resources created during bind. * For operation `NX_TCPIP_OFFLOAD_UDP_SOCKET_SEND`, * Send data through TCP/IP offload. Be prepare to handle packet length larger than MTU or packet chain situation. + + +## TSN driver support + +TSN shapers are hardware features, so we can add shaper driver on ethernet card which has tsn features. we will introduce the ptp driver and shapers, there are three kinds of shapers : CBS(credit-based shaper),EST(enhanced scheduled traffic),FPE(frame preemption). +### PTP initialize and callback function +PTP are used in TSN system for many scanarios, espesially when EST are enabled. we have high requirment of ptp clock, so please use Fine mode to initialize PTP and we also need to complete the ptp driver callback which are called to get/set/adjust ptp clock. +the driver interface. +```C +UINT nx_driver_ptp_clock_callback(NX_PTP_CLIENT *client_ptr, UINT operation, + NX_PTP_TIME *time_ptr, NX_PACKET *packet_ptr, + VOID *callback_data) +``` + + For parameter operation: +| operation | Description | +| ------------------------------------------- | -------------------------------------------------------------- | +| ***NX_PTP_CLIENT_CLOCK_INIT*** | An IPv4 or IPv6 packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_SET*** | An ARP request or ARP response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_EXTRACT*** | A Reverse ARP request or response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_GET*** | An IPv4 or IPv6 packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_ADJUST*** | An ARP request or ARP response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_PREPARE*** | A Reverse ARP request or response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_SOFT_TIMER_UPDATE*** | A Reverse ARP request or response packet is being transmitted, | + + +- + +### CBS(credit-based shaper) + +the driver interface: +```C +UINT nx_driver_shaper_cbs_entry(NX_SHAPER_DRIVER_PARAMETER *parameter) + +``` +structure NX_SHAPER_DRIVER_PARAMETER: +```C +typedef struct NX_SHAPER_DRIVER_PARAMETER_STRUCT +{ + UINT nx_shaper_driver_command; + UCHAR shaper_type; + UCHAR reserved[3]; + void *shaper_parameter; + NX_INTERFACE *nx_ip_driver_interface; +} NX_SHAPER_DRIVER_PARAMETER; +``` + +| parameter -> nx_shaper_driver_command | Description | +| ------------------------------------------- | -------------------------------------------------------------- | +| ***NX_PTP_CLIENT_CLOCK_INIT*** | An IPv4 or IPv6 packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_SET*** | An ARP request or ARP response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_EXTRACT*** | A Reverse ARP request or response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_GET*** | An IPv4 or IPv6 packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_ADJUST*** | An ARP request or ARP response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_PREPARE*** | A Reverse ARP request or response packet is being transmitted, | +| ***NX_PTP_CLIENT_CLOCK_SOFT_TIMER_UPDATE*** | A Reverse ARP request or response packet is being transmitted, | + + +### CBS(credit-based shaper) +data struct + + +### CBS(credit-based shaper) +data struct \ No newline at end of file From df1e6ced06e52af77d02567f64afa44dbdb6fa0e Mon Sep 17 00:00:00 2001 From: Yajun Xia Date: Thu, 21 Mar 2024 21:41:04 +0800 Subject: [PATCH 5/8] Update Mar 21th. --- rtos-docs/netx-duo/chapter3.md | 16 +++++++++- rtos-docs/netx-duo/chapter4.md | 54 +++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/rtos-docs/netx-duo/chapter3.md b/rtos-docs/netx-duo/chapter3.md index acdc0f7..8e452b4 100644 --- a/rtos-docs/netx-duo/chapter3.md +++ b/rtos-docs/netx-duo/chapter3.md @@ -1543,6 +1543,20 @@ In MSRP module of NetxDuo, following functionalities are provided: - Management of the registration and deregistration processes for a domain, as well as handling the indications of these events. ### Multiple vlan registration protocol (MVRP) - +The Multiple VLAN Registration Protocol (MVRP) is a protocol that provides dynamic VLAN registration service. It is an MRP (Multiple Registration Protocol) application that makes use of MRP Attribute Declaration (MAD) and MRP Attribute Propagation (MAP) to provide common state machine descriptions and attribute propagation mechanisms. +MVRP provides a mechanism for dynamic maintenance of the contents of Dynamic VLAN Registration Entries for each VLAN and propagates the information they contain to other Bridges. This information allows MVRP-aware devices to dynamically establish and update their knowledge of the set of VLANs that currently have active members, and through which Ports those members can be reached. +In MVRP module of NetxDuo, following functionalities are provided to SRP/MRP components: +- Initialization of an MVRP instance. +- Parsing and packing of MRP Data Units (MRPDUs). +- Process the join or leave a VLAN request command from SRP, and trigger the corresponding VLAN registration or deregistration process. +- Handling of indications for a stream's registration and deregistration events from MRP. ### Multiple registration protocol (MRP) +The Multiple Registration Protocol (MRP) is a protocol that provides dynamic registration and deregistration of attributes in a network. It is used to manage resources in a network, such as VLANs, multicast addresses, and streams. MRP operates uses a common state machine and attribute propagation mechanisms to provide a consistent view of the network resources. MRP is used by other protocols, such as MVRP (Multiple VLAN Registration Protocol) and MSRP (Multiple Stream Registration Protocol), to provide dynamic registration of VLANs and streams, respectively. + +In MRP module of NetxDuo, following functionalities are provided to MRP applications: +- Provide the interface of MRP initialization. +- Maintaining state machine for MRP applications. +- Process the event triggered by receiving different MRP messages. +- Receiveing the message from ethernet, and destribute the MRP messages to the corresponding MRP applications. +- Handle the timer event for MRP applications. diff --git a/rtos-docs/netx-duo/chapter4.md b/rtos-docs/netx-duo/chapter4.md index 00186ce..11e7850 100644 --- a/rtos-docs/netx-duo/chapter4.md +++ b/rtos-docs/netx-duo/chapter4.md @@ -12050,4 +12050,56 @@ status = nxd_udp_source_extract(&packet_ptr, &ip_address, &port); - nx_udp_source_extract - nxd_udp_packet_info_extract - nxd_udp_socket_send -- nxd_udp_socket_source_send \ No newline at end of file +- nxd_udp_socket_source_send + +## nx_link_vlan_set +Sets VLAN tag to interface. + +### Prototype + +```c +UINT nx_link_vlan_set(NX_IP *ip_ptr, UINT interface_index, UINT vlan_tag) +``` + +### Description + +This function sets VLAN tag to interface. VLAN tag is comprised the PCP and VLAN ID, encoded in host byte order. The PCP is the 3 most significant bits and the VLAN ID is the 12 least significant bits. The PCP is used to prioritize the packet and the VLAN ID is used to identify the VLAN. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to set the VLAN tag. +- *vlan_tag*: VLAN tag to set to the interface. + +### Return Values +- **NX_SUCCESS** (0x00) Successful socket checksum disable. +- **NX_PTR_ERROR** (0x07) Invalid IP instance. +- **NX_INVALID_INTERFACE** (0x4C) Invalid interface index. + +### Preemption Possible + +No + +### Example + +```c +UINT vlan_tag = 0x810; +UINT interface_index = 0; + +/* Set VLAN tag to interface. */ +status = nx_link_vlan_set(&ip_0, interface_index, vlan_tag); +``` + +### See Also + +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + From 72436ea7a1a6e1b88af0586090a3f62fc9cafa82 Mon Sep 17 00:00:00 2001 From: wangwen Date: Fri, 22 Mar 2024 14:58:18 +0800 Subject: [PATCH 6/8] add TAS/FPE --- rtos-docs/netx-duo/chapter5.md | 126 +++++++++++++++++++++++++-------- 1 file changed, 95 insertions(+), 31 deletions(-) diff --git a/rtos-docs/netx-duo/chapter5.md b/rtos-docs/netx-duo/chapter5.md index 9dfb7c5..f378e42 100644 --- a/rtos-docs/netx-duo/chapter5.md +++ b/rtos-docs/netx-duo/chapter5.md @@ -534,39 +534,40 @@ The following driver commands are required for network interfaces with TCP/IP se ## TSN driver support +TSN shapers are a series of hardware features that can be added to an Ethernet card equipped with TSN capabilities. We will discuss implementation of the PTP driver and the three types of shapers: CBS (Credit-Based Shaper), EST (Enhanced Scheduled Traffic), and FPE (Frame Preemption). -TSN shapers are hardware features, so we can add shaper driver on ethernet card which has tsn features. we will introduce the ptp driver and shapers, there are three kinds of shapers : CBS(credit-based shaper),EST(enhanced scheduled traffic),FPE(frame preemption). ### PTP initialize and callback function -PTP are used in TSN system for many scanarios, espesially when EST are enabled. we have high requirment of ptp clock, so please use Fine mode to initialize PTP and we also need to complete the ptp driver callback which are called to get/set/adjust ptp clock. -the driver interface. +PTP is utilized in various scenarios within the TSN system, particularly when the TAS shaper is enabled. Given the high requirements for the PTP clock, it is recommended to initialize PTP in Fine mode. Additionally, it is necessary to implement the PTP driver callbacks, which are invoked to get, set, and adjust the PTP clock. + +the driver interface which is used to sychnorize ptp clock in the network. ```C UINT nx_driver_ptp_clock_callback(NX_PTP_CLIENT *client_ptr, UINT operation, NX_PTP_TIME *time_ptr, NX_PACKET *packet_ptr, VOID *callback_data) ``` - For parameter operation: -| operation | Description | -| ------------------------------------------- | -------------------------------------------------------------- | -| ***NX_PTP_CLIENT_CLOCK_INIT*** | An IPv4 or IPv6 packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_SET*** | An ARP request or ARP response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_EXTRACT*** | A Reverse ARP request or response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_GET*** | An IPv4 or IPv6 packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_ADJUST*** | An ARP request or ARP response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_PREPARE*** | A Reverse ARP request or response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_SOFT_TIMER_UPDATE*** | A Reverse ARP request or response packet is being transmitted, | +| operation | Description | +| ------------------------------------------- | -----------------------------------------------------------------| +| ***NX_PTP_CLIENT_CLOCK_INIT*** | A driver PTP pointer is initialized, | +| ***NX_PTP_CLIENT_CLOCK_SET*** | Set PTP clock when syncorize PTP in the network | +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_EXTRACT*** | Get timestamp from packet, | +| ***NX_PTP_CLIENT_CLOCK_GET*** | Get timestamp from PTP clock, | +| ***NX_PTP_CLIENT_CLOCK_ADJUST*** | Adjust PTP clock by PTP offset when syncorize PTP in the network,| +| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_PREPARE*** | Add NX_INTERFACE_CAPABILITY_PTP_TIMESTAMP support in interface, | +| ***NX_PTP_CLIENT_CLOCK_SOFT_TIMER_UPDATE*** | update soft timer, Reserved for hardware driver, | -- -### CBS(credit-based shaper) +### Credit-based shaper (CBS) - IEEE 802.1Qav Forwarding and Queuing Enhancements for Time-Sensitive Stream +In general, a CBS works by assigning "credits" to each data packet. The number of credits a packet has determines when it can be transmitted. Packets with more credits are transmitted before packets with fewer credits. This allows the CBS to prioritize certain data streams over others, ensuring that high-priority data is transmitted first. +The CBS driver needs to be implemented to support the CBS feature. The driver entry will be invoked from the application, passing application data to configure the CBS driver. -the driver interface: +the driver entry: ```C UINT nx_driver_shaper_cbs_entry(NX_SHAPER_DRIVER_PARAMETER *parameter) ``` -structure NX_SHAPER_DRIVER_PARAMETER: +Data structure of driver entry paramter: ```C typedef struct NX_SHAPER_DRIVER_PARAMETER_STRUCT { @@ -577,21 +578,84 @@ typedef struct NX_SHAPER_DRIVER_PARAMETER_STRUCT NX_INTERFACE *nx_ip_driver_interface; } NX_SHAPER_DRIVER_PARAMETER; ``` - -| parameter -> nx_shaper_driver_command | Description | -| ------------------------------------------- | -------------------------------------------------------------- | -| ***NX_PTP_CLIENT_CLOCK_INIT*** | An IPv4 or IPv6 packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_SET*** | An ARP request or ARP response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_EXTRACT*** | A Reverse ARP request or response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_GET*** | An IPv4 or IPv6 packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_ADJUST*** | An ARP request or ARP response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_PACKET_TS_PREPARE*** | A Reverse ARP request or response packet is being transmitted, | -| ***NX_PTP_CLIENT_CLOCK_SOFT_TIMER_UPDATE*** | A Reverse ARP request or response packet is being transmitted, | +Data stucture of CBS parameter which define the necessary parameters that CBS driver needs. +```C +typedef struct NX_SHAPER_CBS_PARAMETER_STRUCT +{ + INT idle_slope; /* Mbps */ + INT send_slope; /* Mbps */ + INT hi_credit; + INT low_credit; + UCHAR hw_queue_id; + UCHAR reserved[3]; +} NX_SHAPER_CBS_PARAMETER; +``` +the driver entry parameter: +| parameter -> nx_shaper_driver_command | Description | +| ------------------------------------------- | -----------------------------------------------------------------| +| ***NX_SHAPER_COMMAND_INIT*** | initialization of enabling CBS, | +| ***NX_SHAPER_COMMAND_CONFIG*** | set hardware queue priority and capablity of CBS, | +| ***NX_SHAPER_COMMAND_PARAMETER_SET*** | set parameter passed from application to driver, | -### CBS(credit-based shaper) -data struct +### Time-Aware Shaper (TAS) - IEEE 802.1Qbv Enhancements to Traffic Scheduling +A Time-Aware Shaper (TAS) is a mechanism used in Time-Sensitive Networking (TSN) systems to control the transmission of Ethernet frames based on the time. It's part of the IEEE 802.1Qbv standard. +The TAS works by dividing time into repeating cycles, and each cycle is further divided into time intervals, or "gates". Each gate is either open or closed, and frames can only be transmitted when the gate is open. +The TAS driver needs to be implemented to support the TAS feature. The driver entry will be invoked from the application, passing application data to configure the TAS driver. -### CBS(credit-based shaper) -data struct \ No newline at end of file +the driver entry: +```C +UINT nx_driver_shaper_tas_entry(NX_SHAPER_DRIVER_PARAMETER *parameter) + +``` + +Data stucture of TAS parameter which define the necessary parameters that TAS driver needs. +```C +typedef struct NX_SHAPER_TAS_PARAMETER_STRUCT +{ + ULONG64 base_time; + UINT cycle_time; + UINT cycle_time_extension; + UINT gcl_length; + NX_SHAPER_TAS_GCL gcl[NX_SHAPER_GCL_LENGTH_MAX]; + void *fp_parameter; /* Configured by shaper */ +} NX_SHAPER_TAS_PARAMETER; +``` +the driver entry parameter: + +| parameter -> nx_shaper_driver_command | Description | +| ------------------------------------------- | -----------------------------------------------------------------| +| ***NX_SHAPER_COMMAND_INIT*** | initialization of enabling TAS, | +| ***NX_SHAPER_COMMAND_CONFIG*** | set hardware queue priority and capablity of TAS, | +| ***NX_SHAPER_COMMAND_PARAMETER_SET*** | set parameter passed from application to driver, | + +### Frame preemption (FPE) - 802.1Qbu +In traditional Ethernet networks, once a frame starts transmitting, it must be completely sent before another frame can begin. This can cause delays for time-sensitive data if it has to wait for a large, non-time-sensitive frame to finish transmitting. +Frame Preemption addresses this issue by allowing a high-priority, time-sensitive frame to interrupt the transmission of a low-priority frame. The low-priority frame is then resumed after the high-priority frame has been sent. This ensures that time-sensitive data can be transmitted with minimal delay, even in a busy network +The FPE driver needs to be implemented to support the FPE feature. The driver entry will be invoked from the application, passing application data to configure the FPE driver. +the driver entry: +```C +UINT nx_driver_shaper_fpe_entry(NX_SHAPER_DRIVER_PARAMETER *parameter) + +``` + +Data stucture of TAS parameter which define the necessary parameters that TAS driver needs. +```C +typedef struct NX_SHAPER_FP_PARAMETER_STRUCT +{ + UCHAR verification_enable; /* Enable/Disable fp verification (Application/Driver) */ + UCHAR express_queue_bitmap; /* Bitmap of express queues */ + UCHAR express_guardband_enable; /* Enable/Disable guard band on express queue */ + UCHAR reserved; + UINT ha; /* Hold advance time */ + UINT ra; /* Release advance time */ +} NX_SHAPER_FP_PARAMETER; +``` +the driver entry parameter: + +| parameter -> nx_shaper_driver_command | Description | +| ------------------------------------------- | -----------------------------------------------------------------| +| ***NX_SHAPER_COMMAND_INIT*** | initialization of enabling FPE, | +| ***NX_SHAPER_COMMAND_CONFIG*** | set hardware queue priority and capablity of FPE, | +| ***NX_SHAPER_COMMAND_PARAMETER_SET*** | set parameter passed from application to driver, | \ No newline at end of file From d47864b523e14b7601494deebf6db53a41e52c21 Mon Sep 17 00:00:00 2001 From: Yajun Xia Date: Fri, 22 Mar 2024 15:20:17 +0800 Subject: [PATCH 7/8] update API. --- rtos-docs/netx-duo/chapter4.md | 1027 ++++++++++++++++++++++++++++++++ 1 file changed, 1027 insertions(+) diff --git a/rtos-docs/netx-duo/chapter4.md b/rtos-docs/netx-duo/chapter4.md index 11e7850..5761839 100644 --- a/rtos-docs/netx-duo/chapter4.md +++ b/rtos-docs/netx-duo/chapter4.md @@ -12103,3 +12103,1030 @@ status = nx_link_vlan_set(&ip_0, interface_index, vlan_tag); - nx_link_ethernet_header_parse - nx_link_vlan_interface_create + +## nx_link_vlan_get +Get VLAN tag from interface. + +### Prototype + +```c +UINT nx_link_vlan_get(NX_IP *ip_ptr, UINT interface_index, UINT *vlan_tag) +``` + +### Description + +This function gets VLAN tag from interface, VLAN tag is comprised the PCP and VLAN ID, encoded in host byte order. The PCP is the 3 most significant bits and the VLAN ID is the 12 least significant bits. The PCP is used to prioritize the packet and the VLAN ID is used to identify the VLAN. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to get the VLAN tag. +- *vlan_tag*: Pointer to store the VLAN tag. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful socket checksum disable. +- **NX_PTR_ERROR** (0x07) Invalid IP instance. +- **NX_INVALID_INTERFACE** (0x4C) Invalid interface index. +- **NX_NOT_FOUND** (0x4E) VLAN tag not found. + +### Preemption Possible + +No + +### Example + +```c +UINT vlan_tag; +UINT interface_index = 0; + +/* Get VLAN tag from interface. */ +status = nx_link_vlan_get(&ip_0, interface_index, &vlan_tag); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_vlan_clear +Clears VLAN tag from interface. + +### Prototype + +```c +UINT nx_link_vlan_clear(NX_IP *ip_ptr, UINT interface_index) +``` + +### Description + +This function clears VLAN tag from interface. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to clear the VLAN tag. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful socket checksum disable. +- **NX_PTR_ERROR** (0x07) Invalid IP instance. +- **NX_INVALID_INTERFACE** (0x4C) Invalid interface index. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; + +/* Clear VLAN tag from interface. */ +status = nx_link_vlan_clear(&ip_0, interface_index); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_multicast_join +Join a multicast group. + +### Prototype + +```c +UINT nx_link_multicast_join(NX_IP *ip_ptr, UINT interface_index, + ULONG physical_address_msw, ULONG physical_address_lsw) +``` + +### Description + +This function handles the request to join the specified multicast group on a specified network device. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to join the multicast group. +- *physical_address_msw*: Top 16 bits (47-32) of the multicast address to join. +- *physical_address_lsw*: Lower 32 bits (31-0) of the multicast address to join. + +### Return Values +- **NX_SUCCESS** (0x00) Successful multicast group join. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; +ULONG physical_address_msw = 0x011b; +ULONG physical_address_lsw = 0x19000000; + +/* Join a multicast group. */ +status = nx_link_multicast_join(&ip_0, interface_index, + physical_address_msw, physical_address_lsw); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_multicast_leave +Leave a multicast group. + +### Prototype + +```c +UINT nx_link_multicast_leave(NX_IP *ip_ptr, UINT interface_index, + ULONG physical_address_msw, ULONG physical_address_lsw) +``` + +### Description + +This function handles the request to leave the specified multicast group on a specified network device. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to leave the multicast group. +- *physical_address_msw*: Top 16 bits (47-32) of the multicast address to leave. +- *physical_address_lsw*: Lower 32 bits (31-0) of the multicast address to leave. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful multicast group leave. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; +ULONG physical_address_msw = 0x011b; +ULONG physical_address_lsw = 0x19000000; + +/* Leave a multicast group. */ +status = nx_link_multicast_leave(&ip_0, interface_index, + physical_address_msw, physical_address_lsw); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_ethernet_packet_send +Send an Ethernet packet. + +### Prototype + +```c +UINT nx_link_ethernet_packet_send(NX_IP *ip_ptr, UINT interface_index, NX_PACKET *packet_ptr, + ULONG physical_address_msw, ULONG physical_address_lsw, UINT packet_type) +``` + +### Description + +This function sends out a link packet with layer 3 header already constructed or raw packet. Ethernet header will be added in this function. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to send the packet. +- *packet_ptr*: Pointer to the packet to send. +- *physical_address_msw*: Top 16 bits (47-32) of the destination MAC address. +- *physical_address_lsw*: Lower 32 bits (31-0) of the destination MAC address. +- *packet_type*: Type of the packet to send. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful packet send. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; +ULONG physical_address_msw = 0x011b; +ULONG physical_address_lsw = 0x19000000; +UINT packet_type = NX_PTP_ETHERNET_TYPE; + +/* Send an Ethernet packet. */ +status = nx_link_ethernet_packet_send(&ip_0, interface_index, packet_ptr, + physical_address_msw, physical_address_lsw, packet_type); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse + +## nx_link_raw_packet_send +Send a raw packet. + +### Prototype + +```c +UINT nx_link_raw_packet_send(NX_IP *ip_ptr, UINT interface_index, NX_PACKET *packet_ptr); +``` + +### Description + +This function sends out a link packet with layer 2 header already constructed or raw packet. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to send the packet. +- *packet_ptr*: Pointer to the packet to send. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful packet send. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; + +/* Send a raw packet. */ +status = nx_link_raw_packet_send(&ip_0, interface_index, packet_ptr); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_packet_receive_callback_add +Add a packet receive callback. + +### Prototype + +```c +UINT nx_link_packet_receive_callback_add(NX_IP *ip_ptr, UINT interface_index, NX_LINK_RECEIVE_QUEUE *queue_ptr, + UINT packet_type, nx_link_packet_receive_callback *callback_ptr, VOID *context) +``` + +### Description + +This function adds a receive callback function to specified interface. Multiple callbacks callback functions can be added to each interface. They will be invoked one by one until the packet is consumed. Only packet matching registered packet_type will be passed to callback function. NX_LINK_PACKET_TYPE_ALL can be used to handle all types except TCP/IP ones. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to add the callback. +- *queue_ptr*: Pointer to the receive queue. +- *packet_type*: Type of the packet to receive. +- *callback_ptr*: Pointer to the callback function. +- *context*: Pointer to the context. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful packet send. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; +NX_LINK_RECEIVE_QUEUE queue; +UINT packet_type = NX_PTP_ETHERNET_TYPE; +nx_link_packet_receive_callback callback; + +/* Add a packet receive callback. */ +status = nx_link_packet_receive_callback_add(&ip_0, interface_index, &queue, + packet_type, callback, NX_NULL); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_remove +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + +## nx_link_packet_receive_callback_remove +Remove a packet receive callback. + +### Prototype + +```c +UINT nx_link_packet_receive_callback_remove(NX_IP *ip_ptr, UINT interface_index, NX_LINK_RECEIVE_QUEUE *queue_ptr) +``` + +### Description + +This function removes a receive callback function to specified interface. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_index*: Index of the network interface to remove the callback. +- *queue_ptr*: Pointer to the receive queue. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful packet send. +- **NX_PTR_ERROR** (0x07) Invalid IP pointer. +- **NX_INVALID_INTERFACE** (0x4C) Device index points to an invalid network interface. + +### Preemption Possible + +No + +### Example + +```c +UINT interface_index = 0; +NX_LINK_RECEIVE_QUEUE queue; + +/* Remove a packet receive callback. */ +status = nx_link_packet_receive_callback_remove(&ip_0, interface_index, &queue); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_ethernet_header_parse +- nx_link_vlan_interface_create + + +## nx_link_ethernet_header_parse +Parse an Ethernet header. + +### Prototype + +```c +UINT nx_link_ethernet_header_parse(NX_PACKET *packet_ptr, ULONG *destination_msb, ULONG *destination_lsb, + ULONG *source_msb, ULONG *source_lsb, USHORT *ether_type, USHORT *vlan_tag, + UCHAR *vlan_tag_valid, UINT *header_size) +``` + +### Description + +This function parses Ethernet packet and return each file of header. + +### Parameters + +- *packet_ptr*: Pointer to the packet to parse. +- *destination_msb*: Pointer to store the destination MAC address MSB. +- *destination_lsb*: Pointer to store the destination MAC address LSB. +- *source_msb*: Pointer to store the source MAC address MSB. +- *source_lsb*: Pointer to store the source MAC address LSB. +- *ether_type*: Pointer to store the Ethernet type. +- *vlan_tag*: Pointer to store the VLAN tag. +- *vlan_tag_valid*: Pointer to store the VLAN tag valid. +- *header_size*: Pointer to store the header size. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful packet send. + +### Preemption Possible + +No + +### Example + +```c +ULONG destination_msb, destination_lsb, source_msb, source_lsb; +USHORT ether_type, vlan_tag; +UCHAR vlan_tag_valid; +UINT header_size; + +/* Parse an Ethernet header. */ +nx_link_ethernet_header_parse(packet_ptr, &destination_msb, &destination_lsb, + &source_msb, &source_lsb, ðer_type, &vlan_tag, + &vlan_tag_valid, &header_size); +``` + +### See Also + +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove +- nx_link_vlan_interface_create + +## nx_link_vlan_interface_create +Create a VLAN interface. + +### Prototype + +```c +UINT nx_link_vlan_interface_create(NX_IP *ip_ptr, CHAR *interface_name, ULONG ip_address, ULONG network_mask, + UINT vlan_tag, UINT parent_interface_index, UINT *interface_index_ptr) +``` + +### Description + +This function creates a VLAN interface and bind to parent interface. Any packet received from parent interface will be dispatched to right interface according to the match of VLAN ID. + +### Parameters + +- *ip_ptr*: Pointer to previously created IP instance. +- *interface_name*: Name of the interface. +- *ip_address*: IP address of the interface. +- *network_mask*: Network mask of the interface. +- *vlan_tag*: VLAN tag of the interface. +- *parent_interface_index*: Index of the parent interface. +- *interface_index_ptr*: Pointer to store the index of the interface. + +### Return Values + +**NX_SUCCESS** (0x00) Successful packet send. +**NX_DUPLICATED_ENTRY** (0x4D) Interface is duplicated. +**NX_NO_MORE_ENTRIES** (0x4F) No more entries. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. + +### Preemption Possible + +No + +### Example + +```c +status = nx_link_vlan_interface_create(&ip_0, "NetX IP Interface 0:2", IP_ADDRESS(0, 0, 0, 0), 0xFFFFFFFFUL, VLAN_ID, 0, &interface_0); +if (status) +{ + error_counter++; +} +``` + +### See Also +- nx_link_vlan_set +- nx_link_vlan_get +- nx_link_vlan_clear +- nx_link_multicast_join +- nx_link_multicast_leave +- nx_link_ethernet_packet_send +- nx_link_raw_packet_send +- nx_link_packet_receive_callback_add +- nx_link_packet_receive_callback_remove + +## nx_shaper_create +Create a shaper. + +### Prototype + +```c +UINT nx_shaper_create(NX_INTERFACE *interface_ptr, NX_SHAPER_CONTAINER *shaper_container, NX_SHAPER *shaper, UCHAR shaper_type, NX_SHAPER_DRIVER shaper_driver); +``` + +### Description +This function creates shaper in shaper container, and connects the shaper container with interface instance. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *shaper_container*: Pointer to the shaper container. +- *shaper*: Pointer to the shaper. +- shaper_type: Type of the shaper. +- shaper_driver: Pointer to the shaper driver. + +### Return Values + +**NX_SUCCESS** (0x00) Successful shaper create. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. +**NX_NO_MORE_ENTRIES** (0x4F) No more entries. + +### Preemption Possible + +No + +### Example + +```c +UINT shaper_init(NX_INTERFACE *interface_ptr) +{ +UINT status; +UCHAR pcp_list[8]; +UCHAR queue_id_list[8]; + + status = nx_shaper_create(interface_ptr, &shaper_container, &cbs_shaper, NX_SHAPER_TYPE_CBS, nx_driver_shaper_cbs_entry); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_default_mapping_get(interface_ptr, pcp_list, queue_id_list, 8); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_mapping_set(interface_ptr, pcp_list, queue_id_list, 8); + + return status; +} +``` + +### See Also + +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_delete +Delete a shaper. + +### Prototype + +```c +UINT nx_shaper_delete(NX_INTERFACE *interface_ptr, NX_SHAPER *shaper) +``` + +### Description + +This function deletes a shaper from interface instance, unlink the shaper container with IP interface when there is no shaper exists. + +### Parameters + +*interface_ptr*: Pointer to the interface instance. +*shaper*: Pointer to the shaper. + +### Return Values + +**NX_SUCCESS** (0x00) Successful shaper delete. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. +**NX_ENTRY_NOT_FOUND** (0x4A) Entry not found. + +### Preemption Possible + +No + +### Example + +```c +status = nx_shaper_delete(&ip_0, &cbs_shaper); +``` + +### See Also + +- nx_shaper_create +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_current_mapping_get +Get current mapping of shaper. + +### Prototype + +```c +UINT nx_shaper_current_mapping_get(NX_INTERFACE *interface_ptr, UCHAR *pcp_list, UCHAR *queue_id_list, UCHAR list_size); +``` + +### Description + +This function gets the current pcp to HW queue mapping config. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *pcp_list*: Pointer to the pcp list. +- *queue_id_list*: Pointer to the queue id list. +- *list_size*: Size of the list. + +### Return Values + +**NX_SUCCESS** (0x00) Successfully get mapping. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. +**NX_NOT_SUPPORTED** (0x4B) Not supported. +**NX_NOT_SUCCESSFUL** (0x51) Not successful. + +### Preemption Possible + +No + +### Example + +```c +status = nx_shaper_current_mapping_get(&ip_0, pcp_list, queue_id_list, 8); +``` + +### See Also + +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_default_mapping_get +Get default mapping of shaper. + +### Prototype + +```c +UINT nx_shaper_default_mapping_get(NX_INTERFACE *interface_ptr, UCHAR *pcp_list, UCHAR *queue_id_list, UCHAR list_size) +``` + +### Description + +This function gets the default pcp to HW queue mapping config. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *pcp_list*: Pointer to the pcp list. +- *queue_id_list*: Pointer to the queue id list. +- *list_size*: Size of the list. + +### Return Values + +**NX_SUCCESS** Successfully get mapping. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. +**NX_NOT_SUPPORTED** (0x4B) Not supported. + +### Preemption Possible + +No + +### Example + +```c +UINT shaper_init(NX_INTERFACE *interface_ptr) +{ +UINT status; +UCHAR pcp_list[8]; +UCHAR queue_id_list[8]; + + status = nx_shaper_create(interface_ptr, &shaper_container, &cbs_shaper, NX_SHAPER_TYPE_CBS, nx_driver_shaper_cbs_entry); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_default_mapping_get(interface_ptr, pcp_list, queue_id_list, 8); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_mapping_set(interface_ptr, pcp_list, queue_id_list, 8); + + return status; +} +``` + +### See Also + +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_mapping_set +Set mapping of shaper. + +### Prototype + +```c +UINT nx_shaper_mapping_set(NX_INTERFACE *interface_ptr, UCHAR *pcp_list, UCHAR *queue_id_list, UCHAR list_size) +``` + +### Description + +This function sets the pcp to HW queue mapping config. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *pcp_list*: Pointer to the pcp list. +- *queue_id_list*: Pointer to the queue id list. +- *list_size*: Size of the list. + +### Return Values + +**NX_SUCCESS** Successfully set mapping. +**NX_INVALID_PARAMETERS** (0x47) Invalid parameters. +**NX_NOT_SUPPORTED** (0x4B) Not supported. + +### Preemption Possible + +No + +### Example + +```c +UINT shaper_init(NX_INTERFACE *interface_ptr) +{ +UINT status; +UCHAR pcp_list[8]; +UCHAR queue_id_list[8]; + + status = nx_shaper_create(interface_ptr, &shaper_container, &cbs_shaper, NX_SHAPER_TYPE_CBS, nx_driver_shaper_cbs_entry); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_default_mapping_get(interface_ptr, pcp_list, queue_id_list, 8); + if (status != NX_SUCCESS) + { + return NX_FALSE; + } + + status = nx_shaper_mapping_set(interface_ptr, pcp_list, queue_id_list, 8); + + return status; +} +``` + +### See Also +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_cbs_parameter_set +Set CBS parameter of shaper. + +### Prototype + +```c +UINT nx_shaper_cbs_parameter_set(NX_INTERFACE *interface_ptr, NX_SHAPER_CBS_PARAMETER *cbs_parameter, UCHAR pcp) +``` + +### Description + +This function configures the hardware parameters for CBS shaper. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *cbs_parameter*: Pointer to the CBS parameter. +- *pcp*: PCP value. + +### Return Values + +**NX_SUCCESS** Successfully set CBS parameter. +**NX_NOT_SUPPORTED** (0x4B) Not supported. +**NX_NOT_FOUND** (0x4E) Not found. +**NX_NOT_SUPPORTED** (0x4B) Not supported. + +### Preemption Possible + +No + +### Example + +```c + status = nx_srp_cbs_config_get(srp_ptr -> talker[index].class_id, + (INT)port_rate, + srp_ptr -> talker[index].interval, + srp_ptr -> talker[index].max_interval_frames, + srp_ptr -> talker[index].max_frame_size, + interface_ptr -> nx_interface_ip_mtu_size, + idle_slope_a, + max_frame_size_a, + &(srp_ptr -> talker[index].cbs_parameters)); + if(status) + return status; + + printf("cbs parameters: idle slope: %d, send slope: %d, hi credit: %d, low credit: %d\r\n", + srp_ptr -> talker[index].cbs_parameters.idle_slope, + srp_ptr -> talker[index].cbs_parameters.send_slope, + srp_ptr -> talker[index].cbs_parameters.hi_credit, + srp_ptr -> talker[index].cbs_parameters.low_credit); + if(srp_ptr -> talker[index].class_id == NX_SRP_SR_CLASS_A) + status = nx_shaper_cbs_parameter_set(interface_ptr, &(srp_ptr -> talker[index].cbs_parameters), NX_SHAPER_CLASS_A_PCP); + else + status = nx_shaper_cbs_parameter_set(interface_ptr, &(srp_ptr -> talker[index].cbs_parameters), NX_SHAPER_CLASS_B_PCP); +``` + +### See Also + +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_fp_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_fp_parameter_set +Set FP parameter of shaper. + +### Prototype + +```c +UINT nx_shaper_fp_parameter_set(NX_INTERFACE *interface_ptr, NX_SHAPER_FP_PARAMETER *fp_parameter); +``` + +### Description + +This function sets the frame preemption parameter, when used with other shapers, FP parameter should be set before other shapers. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *fp_parameter*: Pointer to the FP parameter. + +### Return Values + +**NX_SUCCESS** Successfully set FP parameter. +**NX_NOT_SUCCESSFUL** (0x51) Not successful. + +### Preemption Possible + +No + +### Example + +```c +#ifdef FP_ENABLED + //fp_config + memset(&fp_config, 0, sizeof(NX_SHAPER_FP_PARAMETER)); + fp_config.verification_enable = 1; + fp_config.express_guardband_enable = NX_TRUE; + fp_config.ha = 0; + fp_config.ra = 0; + fp_config.express_queue_bitmap = (1 << 3) | (1 << 2); + + status = nx_shaper_fp_parameter_set(interface_ptr, &fp_config); + + if (status != NX_SUCCESS) + { + return NX_FALSE; + } +#endif +``` + +### See Also + +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_tas_parameter_set + +## nx_shaper_tas_parameter_set +Set TAS parameter of shaper. + +### Prototype + +```c +UINT nx_shaper_tas_parameter_set(NX_INTERFACE *interface_ptr, NX_SHAPER_TAS_CONFIG *tas_config); +``` + +### Description + +This function configures the hardware parameters for TAS shaper. + +### Parameters + +- *interface_ptr*: Pointer to the interface instance. +- *tas_config*: Pointer to the TAS config. + +### Return Values + +**NX_SUCCESS** Successfully set TAS parameter. +**NX_NOT_FOUND** (0x4E) Not found. + +### Preemption Possible + +No + +### Example + +```c + tas_config.base_time = (ULONG64)100 << 32; //100seconds + tas_config.auto_fill_status = NX_SHAPER_TAS_IDLE_CYCLE_AUTO_FILL_DISABLED; + tas_config.cycle_time = 1000000; + tas_config.traffic_count = 2; + + tas_config.traffic[0].pcp = 2; + tas_config.traffic[0].time_offset = 0; + tas_config.traffic[0].duration = 500000; + tas_config.traffic[0].traffic_control = NX_SHAPER_TRAFFIC_OPEN; + + tas_config.traffic[1].pcp = 0; + tas_config.traffic[1].time_offset = 500000; + tas_config.traffic[1].duration = 500000; + tas_config.traffic[1].traffic_control = NX_SHAPER_TRAFFIC_OPEN; + + + status = nx_shaper_tas_parameter_set(interface_ptr, &tas_config); +``` + +### See Also + +- nx_shaper_create +- nx_shaper_delete +- nx_shaper_current_mapping_get +- nx_shaper_default_mapping_get +- nx_shaper_mapping_set +- nx_shaper_cbs_parameter_set +- nx_shaper_fp_parameter_set \ No newline at end of file From 03fe56934b45ea592a9872d0c4558706d62b48a7 Mon Sep 17 00:00:00 2001 From: wangwen Date: Fri, 22 Mar 2024 17:02:13 +0800 Subject: [PATCH 8/8] add SRP API in chapter4 --- rtos-docs/netx-duo/chapter4.md | 275 ++++++++++++++++++++++++++++++++- 1 file changed, 274 insertions(+), 1 deletion(-) diff --git a/rtos-docs/netx-duo/chapter4.md b/rtos-docs/netx-duo/chapter4.md index 5761839..bf95ccc 100644 --- a/rtos-docs/netx-duo/chapter4.md +++ b/rtos-docs/netx-duo/chapter4.md @@ -13129,4 +13129,277 @@ No - nx_shaper_default_mapping_get - nx_shaper_mapping_set - nx_shaper_cbs_parameter_set -- nx_shaper_fp_parameter_set \ No newline at end of file +- nx_shaper_fp_parameter_set + +## nx_srp_init +Initialization of SRP. + +### Prototype + +```c +UINT 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); +``` +### Description + +This function initialize SRP, it initializes MRP, MSRP, MVRP sequencly, and create a thread in MRP initializaton. + +### Parameters + +- *srp_ptr*: Pointer to SRP instance. +- *ip_ptr*: Pointer to IP instance. +- *interface_index*: Index of the network interface to use SRP. +- *pkt_pool_ptr*: pointer to Packet pool. +- *stack_ptr*: pointer to SRP thread Stack. +- *stack_size*: SRP thread Stack size . +- *priority*: SRP thread priority. + + +### Return Values + +- **NX_SUCCESS** (0x00) Successful init +- **NX_INVALID_INTERFACE** (0x4C) Invalid interface index +- **NX_PTR_ERROR** (0x07) Invalid IP pointer + +### Allowed From + +Threads + +### Preemption Possible + +No + +### Example + +```c +#define SRP_THREAD_PRIORITY 5 +#define SRP_INTERFACE 0 +NX_SRP nx_srp; +NX_IP ip_0; +NX_PACKET_POOL pool_0; +ULONG srp_stack[2048 *2 / sizeof(ULONG)]; + +/* Create the SRP client instance */ +nx_srp_init(&nx_srp, &ip_0, SRP_INTERFACE, &pool_0, + (UCHAR *)srp_stack, sizeof(srp_stack), SRP_THREAD_PRIORITY); + + +``` +### See Also + +- nx_srp_talker_start +- nx_srp_talker_stop +- nx_srp_listener_start +- nx_srp_listener_stop + + + +## nx_srp_talker_start +Start SRP talker. + +### Prototype + +```c +UINT nx_srp_talker_start(NX_SRP *srp_ptr, NX_MSRP_DOMAIN *srp_domain, UCHAR *stream_id, UCHAR *dest_addr, + UINT max_frame_size, UINT max_interval_frames, NX_MRP_EVENT_CALLBACK event_callback); +``` +### Description + +This function start SRP talker, it sets event callback funtions and register domain, Vlan, stream request. + +### Parameters + +- *srp_ptr*: Pointer to SRP instance. +- *event_callback*: callback invoked by application to monitor the SRP process. +- *stream_id*: stream id of talker advertised. + + +### Return Values + +- **NX_SUCCESS** (0x00) Successful start +- **NX_INVALID_PARAMETERS** (0x4D) Invalid parameter +- **NX_MSRP_EVENT_NOT_SUPPORTED** (0x06) unsupported event +- **NX_MSRP_ATTRIBUTE_FIND_ERROR** (0x09) not found attribute + + +### Allowed From + +Threads + +### Preemption Possible + +No + +### Example + +```c +#define SRP_THREAD_PRIORITY 5 +#define SRP_INTERFACE 0 +NX_SRP nx_srp; +UINT MaxFrameSize = 1300; +UINT MaxIntervalFrames = 1; +UCHAR dest_addr[6] ={0X91,0XE0,0XF0,0X00,0X0E,0X80}; +UCHAR stream_id[8] = {0X00,0X11,0X22,0X33,0X44,0X56,0,1}; +NX_MSRP_DOMAIN srp_domain = {5,2,2}; +UINT srp_event_callback(NX_MRP_PARTICIPANT* participant, NX_MRP_ATTRIBUTE* attribute, UCHAR event,VOID *callback_data); + + /* start the SRP client */ + status = nx_srp_talker_start(&nx_srp, &srp_domain, stream_id, dest_addr, + MaxFrameSize, MaxIntervalFrames, srp_event_callback); + + +``` +### See Also + +- nx_srp_init +- nx_srp_talker_stop +- nx_srp_listener_start +- nx_srp_listener_stop + +## nx_srp_talker_stop +Stop SRP talker. + +### Prototype + +```c +UINT nx_srp_talker_stop(NX_SRP *srp_ptr, UCHAR *stream_id, NX_MSRP_DOMAIN *domain) +``` +### Description + +This function stop SRP talker. It withdraw the domain,Vlan,stream request. + +### Parameters + +- *srp_ptr*: Pointer to SRP instance. +- *stream_id*: stream id of talker advertised. +- *domain*: domain of SRP talker. + + +### Return Values + +- **NX_SUCCESS** (0x00) Successful stop +- **NX_INVALID_PARAMETERS** (0x4D) Invalid parameter +- **NX_MSRP_EVENT_NOT_SUPPORTED** (0x06) unsupported event +- **NX_MSRP_ATTRIBUTE_FIND_ERROR** (0x09) not found attribute + +### Allowed From + +Threads + +### Preemption Possible + +No + +### Example + +```c +NX_SRP nx_srp; +UCHAR stream_id[8] = {0X00,0X11,0X22,0X33,0X44,0X56,0,1}; +NX_MSRP_DOMAIN srp_domain = {5,2,2}; + +nx_srp_talker_stop(&nx_srp,stream_id, &srp_domain ); +``` +### See Also + +- nx_srp_init +- nx_srp_talker_start +- nx_srp_listener_start +- nx_srp_listener_stop + +## nx_srp_listener_start +Start SRP listener. + +### Prototype + +```c + +UINT nx_srp_listener_start(NX_SRP *srp_ptr, NX_MRP_EVENT_CALLBACK event_callback, UCHAR *stream_id) +``` +### Description + +This function start SRP listener. It enables listener and set user date and callback function. + +### Parameters + +- *srp_ptr*: Pointer to SRP instance. +- *event_callback*: callback invoked by application to monitor the SRP process. +- *stream_id*: stream id of listener attached. + + +### Return Values + +- **NX_MSRP_SUCCESS** (0x00) Successful listener start + + +### Allowed From + +Threads + +### Preemption Possible + +No + +### Example + +```c +NX_SRP nx_srp; +UCHAR stream_id[8] = {0X00,0X11,0X22,0X33,0X44,0X56,0,1}; +UINT srp_event_callback(NX_MRP_PARTICIPANT* participant, NX_MRP_ATTRIBUTE* attribute, UCHAR event,VOID *callback_data); + + nx_srp_listener_start(&nx_srp, srp_event_callback, stream_id) +``` +### See Also + +- nx_srp_init +- nx_srp_talker_start +- nx_srp_talker_stop +- nx_srp_listener_stop + +## nx_srp_listener_stop +Stop SRP listener. + +### Prototype + +```c +UINT nx_srp_listener_stop(NX_SRP *srp_ptr, UCHAR *stream_id, NX_MSRP_DOMAIN *domain) +``` +### Description + +This function stop SRP listener. It unregister the domain,Vlan stream attached to talker. + +### Parameters + +- *srp_ptr*: Pointer to SRP instance. +- *stream_id*: Stream id of listener attached to. +- *domain*: Domain of listener attached to. + +### Return Values + +- **NX_SUCCESS** (0x00) Successful stop +- **NX_INVALID_PARAMETERS** (0x4D) Invalid parameter +- **NX_MSRP_EVENT_NOT_SUPPORTED** (0x06) unsupported event +- **NX_MSRP_ATTRIBUTE_FIND_ERROR** (0x09) not found attribute + +### Allowed From + +Threads + +### Preemption Possible + +No + +### Example + +```c +NX_SRP nx_srp; +UCHAR stream_id[8] = {0X00,0X11,0X22,0X33,0X44,0X56,0,1}; +NX_MSRP_DOMAIN srp_domain = {5,2,2}; + +nx_srp_listener_stop(&nx_srp,stream_id, &srp_domain ); +``` +### See Also + +- nx_srp_init +- nx_srp_talker_start +- nx_srp_talker_stop +- nx_srp_listener_start \ No newline at end of file