diff options
author | Rune E. Jensen <runeerle@wgtwo.com> | 2022-11-22 10:35:03 +0100 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2023-11-10 14:39:39 +0000 |
commit | f9ab6985d44651b3f92490829e8fad5bac0ceec2 (patch) | |
tree | 3c4c556d6fe52cebb79251f82b16f572e086a9b1 /src/plugins/gtpu/gtpu.api | |
parent | 5cc67aacf01e8c010ec64a56930f854bcd5d7669 (diff) |
gtpu: support non-G-PDU packets and PDU Session
Updated the gtpu plugin code to support the PDU Session user plane protocol, required for 5G, as
specified in 3GPP TS 38.415 version 17.0.0. This enables some initial support of 5G gNodeB's with
the gtpu plugin.
New features:
- Basic support for the GTP-U Extension Header Flag.
Packets with one extension can now be decapsulated.
This enables basic support of the PDU Session user plane protocol (3GPP TS 38.415 version 17.0.0).
New tunnels can be created with a PDU enable flag and a 6-bit QoS Flow Identifier (QFI).
With this, encapsulated packets will have the PDU Session extension header, and the QFI set.
- Ability to forward GTP-U packets that are not handled by the plugin directly.
Only GTP-U packets with a message type of 255 (G-PDU) are handled directly.
However, 3GPP TS 29.281 defines several other message types like echo and error indication.
A new feature is added to optionally forward unknown or unsupported packets to a new IP address.
This works separately for unknown GTP-U message types, unknown TEIDs, and packets with an unknown
GTP-U header.
This allows both echo and error indications from a 5G gNodeB to be handled by a different system
outside VPP.
- Simple way to get metrics for active tunnels and on tunnel close.
In 5G session/tunnel lifetime is often short and created frequently.
The normal API becomes too slow and inaccurate when too many tunnels are created and deleted
every second.
Improvements:
- A clean ground structure to handle multiple message type in the future.
The code path for G-PDU packets is optimized for performance, representing the typical case.
Unsupported GTP-U packets enter a slow path that decodes the nature of the error.
This presents a easy hook to handle other message types in the future.
- Improved error reporting
When using traces there is more details in the tunnel descriptions.
- Updated the API with several enums.
Fixes:
- gtpu0->length field in IPv6 was computed with IPv4 header lengths in the encapsulation code.
- vec_set_len (t->rewrite, ...) size was computed with the IPv4 header size also for IPv6 tunnels.
Issues:
- This PR does not enable full support of the 3GPP specification.
In particular it only supports a single QoS/QFI flow for each tunnel.
It ignores all incoming extension header flags.
- API functions might change again when/if more support of the 3GPP TS 38.415 spec is added.
Note that I have bumped the API version to 2.1.0 as it seems to be the correct approach based on
my API changes.
Type: feature
Signed-off-by: Rune E. Jensen <runeerle@wgtwo.com>
Change-Id: I91cd2b31f2561f1b3fb1e46c4c34a5a3c71b4625
Diffstat (limited to 'src/plugins/gtpu/gtpu.api')
-rw-r--r-- | src/plugins/gtpu/gtpu.api | 196 |
1 files changed, 195 insertions, 1 deletions
diff --git a/src/plugins/gtpu/gtpu.api b/src/plugins/gtpu/gtpu.api index ec4933af197..7c5c137a840 100644 --- a/src/plugins/gtpu/gtpu.api +++ b/src/plugins/gtpu/gtpu.api @@ -13,10 +13,34 @@ * limitations under the License. */ -option version = "2.0.1"; +option version = "2.1.0"; import "vnet/interface_types.api"; import "vnet/ip/ip_types.api"; +enum gtpu_forwarding_type +{ + GTPU_API_FORWARDING_NONE = 0, + GTPU_API_FORWARDING_BAD_HEADER = 1, + GTPU_API_FORWARDING_UNKNOWN_TEID = 2, + GTPU_API_FORWARDING_UNKNOWN_TYPE = 4, +}; + +enum gtpu_decap_next_type +{ + GTPU_API_DECAP_NEXT_DROP = 0, + GTPU_API_DECAP_NEXT_L2 = 1, + GTPU_API_DECAP_NEXT_IP4 = 2, + GTPU_API_DECAP_NEXT_IP6 = 3, +}; + +typedef sw_if_counters +{ + u64 packets_rx; + u64 packets_tx; + u64 bytes_rx; + u64 bytes_tx; +}; + /** \brief Create or delete a GTPU tunnel @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -56,6 +80,53 @@ define gtpu_add_del_tunnel_reply vl_api_interface_index_t sw_if_index; }; +/** \brief Create or delete a GTPU tunnel + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param is_add - add address if non-zero, else delete + @param src_address - GTPU tunnel's source address. + @param dst_address - GTPU tunnel's destination address. + @param mcast_sw_if_index - version, O-bit and C-bit (see nsh_packet.h) + @param encap_vrf_id - fib identifier used for outgoing encapsulated packets + @param decap_next_index - the index of the next node if success + @param teid - Local (rx) Tunnel Endpoint Identifier + @param tteid - Remote (tx) Tunnel Endpoint Identifier + @param pdu_extension - add PDU session container extension to each packet + @param qfi - the QFI to set in the PDU session container, 6 bits only +*/ +define gtpu_add_del_tunnel_v2 +{ + u32 client_index; + u32 context; + bool is_add; + vl_api_address_t src_address; + vl_api_address_t dst_address; + vl_api_interface_index_t mcast_sw_if_index; + u32 encap_vrf_id; + vl_api_gtpu_decap_next_type_t decap_next_index; + u32 teid; + u32 tteid; + bool pdu_extension; + u8 qfi; + option vat_help = "src <ip-addr> {dst <ip-addr> | group <mcast-ip-addr> {<intfc> | mcast_sw_if_index <nn>}} teid <nn> [tteid <nn>] [encap-vrf-id <nn>] [decap-next <l2|nn>] [qfi <nn>] [del]"; + option in_progress; +}; + +/** \brief reply for set or delete an GTPU tunnel + @param context - sender context, to match reply w/ request + @param retval - return code + @param sw_if_index - software index of the interface + @param counters - Number of packets/bytes that is sent/received via this tunnel. Inaccurate (with in flight packets), sum for the entire set of per-thread counters. Zero for new tunnels. +*/ +define gtpu_add_del_tunnel_v2_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; + vl_api_sw_if_counters_t counters; + option in_progress; +}; + /** \brief Update GTPU tunnel TX TEID @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -112,6 +183,56 @@ define gtpu_tunnel_details u32 tteid; }; + +/** \brief Dump GTPU tunnel + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param sw_if_index - software index of the interface +*/ +define gtpu_tunnel_v2_dump +{ + u32 client_index; + u32 context; + vl_api_interface_index_t sw_if_index; + option vat_help = "[<intfc> | sw_if_index <nn>]"; + option in_progress; +}; + +/** \brief dump details of an GTPU tunnel + @param context - sender context, to match reply w/ request + @param sw_if_index - software index of the interface + @param src_address - GTPU tunnel's source address. + @param dst_address - GTPU tunnel's destination address. + @param mcast_sw_if_index - version, O-bit and C-bit (see nsh_packet.h) + @param encap_vrf_id - fib identifier used for outgoing encapsulated packets + @param decap_next_index - the index of the next node if success + @param teid - Local (rx) Tunnel Endpoint Identifier + @param tteid - Remote (tx) Tunnel Endpoint Identifier + @param pdu_extension - add PDU session container extension to each packet + @param qfi - the QFI to set in the PDU session container, 6 bits only + @param is_forwarding - tunnel used for forwarding packets + @param forwarding_type - the type of packets forwarded + @param counters - Number of packets/bytes that is sent/received via this tunnel. Inaccurate (with in flight packets), sum for the entire set of per-thread counters. +*/ +define gtpu_tunnel_v2_details +{ + u32 context; + vl_api_interface_index_t sw_if_index; + vl_api_address_t src_address; + vl_api_address_t dst_address; + vl_api_interface_index_t mcast_sw_if_index; + u32 encap_vrf_id; + vl_api_gtpu_decap_next_type_t decap_next_index; + u32 teid; + u32 tteid; + bool pdu_extension; + u8 qfi; + bool is_forwarding; + vl_api_gtpu_forwarding_type_t forwarding_type; + vl_api_sw_if_counters_t counters; + option in_progress; +}; + /** \brief Interface set gtpu-bypass request @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -146,6 +267,79 @@ autoreply define gtpu_offload_rx option vat_help = "hw <intfc> rx <tunnel-name> [del]"; }; +/** \brief Set gtpu-forward request + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param is_add - add address if non-zero, else delete + @param forwarding_type - forward filter (unknown teid, unknown message type or unknown header) + @param dst_address - forward destination address. + @param encap_vrf_id - fib identifier used for outgoing packets + @param decap_next_index - the index of the next node if success +*/ +define gtpu_add_del_forward +{ + u32 client_index; + u32 context; + bool is_add; + vl_api_address_t dst_address; + vl_api_gtpu_forwarding_type_t forwarding_type; + u32 encap_vrf_id; + vl_api_gtpu_decap_next_type_t decap_next_index; + option vat_help = "dst <ip-addr> {bad-header|unknown-teid|unknown-type} [decap-next <l2|nn>] [del]"; + option in_progress; +}; + +/** \brief reply for set or delete GTPU forwarding + @param context - sender context, to match reply w/ request + @param retval - return code + @param sw_if_index - software index of the interface +*/ +define gtpu_add_del_forward_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; + option in_progress; +}; + +/** \brief Get list of metrics, use for bulk transfer. + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param sw_if_index_start - software index of the first interface to return data on. + @param capacity - max number of interfaces returned. +*/ +define gtpu_get_transfer_counts +{ + u32 client_index; + u32 context; + vl_api_interface_index_t sw_if_index_start; + u32 capacity; + //option vat_help = "start_index <sw_if_index> count <nn>"; + option in_progress; +}; + +/** \brief reply for set or delete GTPU forwarding + @param context - sender context, to match reply w/ request + @param retval - return code + @param count - number of tunnel counters returned, sequential starting at sw_if_index_start. + @param tunnels - Number of packets/bytes that is sent/received via this tunnel. Inaccurate (with in flight packets), sum for the entire set of per-thread counters. +*/ +typedef tunnel_metrics +{ + vl_api_interface_index_t sw_if_index; + u32 reserved; + vl_api_sw_if_counters_t counters; +}; + +define gtpu_get_transfer_counts_reply +{ + u32 context; + i32 retval; + u32 count; + vl_api_tunnel_metrics_t tunnels[count]; + option in_progress; +}; + /* * Local Variables: * eval: (c-set-style "gnu") |