Struct riot_sys::gnrc_pktsnip

source ·
#[repr(C)]
pub struct gnrc_pktsnip { pub next: *mut gnrc_pktsnip, pub data: *mut c_void, pub size: size_t, pub users: c_uint, pub type_: gnrc_nettype_t, }
Expand description

@brief Type to represent parts (either headers or payload) of a packet, called snips. @details The idea behind the packet snips is that they either can represent protocol-specific headers or payload. A packet can be comprised of multiple pktsnip_t elements.

     Example:

                                                             buffer
         +---------------------------+                      +------+
         | size = 14                 | data +-------------->|      |
         | type = NETTYPE_ETHERNET   |------+               +------+
         +---------------------------+                      .      .
               | next                                       .      .
               v                                            +------+
         +---------------------------+         +----------->|      |
         | size = 40                 | data    |            |      |
         | type = NETTYPE_IPV6       |---------+            +------+
         +---------------------------+                      .      .
               | next                                       .      .
               v                                            +------+
         +---------------------------+            +-------->|      |
         | size = 8                  | data       |         +------+
         | type = NETTYPE_UDP        |------------+         .      .
         +---------------------------+                      .      .
               | next                                       +------+
               v                                     +----->|      |
         +---------------------------+               |      |      |
         | size = 59                 | data          |      .      .
         | type = NETTYPE_UNDEF      |---------------+      .      .
         +---------------------------+                      .      .

To keep data duplication as low as possible the order of the snips in a packet will be reversed depending on if you send the packet or if you received it. For sending the order is from (in the network stack) lowest protocol snip to the highest, for receiving the order is from highest snip to the lowest. This way, if a layer needs to duplicate the packet a tree is created rather than a duplication of the whole package.

A very extreme example for this (we only expect one or two duplications at maximum per package) can be seen here:

 Sending                          Receiving
 =======                          =========

 * Payload                        * L2 header
 ^                                ^
 |                                |
 |\                               |\
 | * L4 header 1                  | * L2.5 header 1
 | * L3 header 1                  | * L3 header 1
 | * netif header 1               | * L4 header 1
 * L4 header 2                    | * Payload 1
 ^                                * L3 header 2
 |                                ^
 |\                               |
 | * L3 header 2                  |\
 | * L2 header 2                  | * L4 header 2
 * L2 header 3                    | * Payload 2
 |\                               * Payload 3
 | * L2 header 3
 * L2 header 4

The first three fields (next, data, size) match iolist_t (named iol_next, iol_base and iol_len there). That means that any pktsnip can be casted to iolist_t for direct passing to e.g., netdev send() functions.

@note This type has no initializer on purpose. Please use @ref net_gnrc_pktbuf as factory.

Fields§

§next: *mut gnrc_pktsnip

< next snip in the packet

§data: *mut c_void

< pointer to the data of the snip

§size: size_t

< the length of the snip in byte

§users: c_uint

@brief Counter of threads currently having control over this packet.

@internal

§type_: gnrc_nettype_t

< protocol of the packet snip

Trait Implementations§

source§

impl Clone for gnrc_pktsnip

source§

fn clone(&self) -> gnrc_pktsnip

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for gnrc_pktsnip

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for gnrc_pktsnip

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl Copy for gnrc_pktsnip

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.