Hi Raslan, On Sun, Apr 04, 2021 at 10:45:51AM +0300, Raslan Darawsheh wrote: > Define new rte header for gtp PDU session container > based on RFC 38415-g30
Do you have a link to this RFC? > Signed-off-by: Raslan Darawsheh <rasl...@nvidia.com> > --- > lib/librte_net/rte_gtp.h | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/lib/librte_net/rte_gtp.h b/lib/librte_net/rte_gtp.h > index 6a6f9b238d..088b0b5a53 100644 > --- a/lib/librte_net/rte_gtp.h > +++ b/lib/librte_net/rte_gtp.h > @@ -61,6 +61,40 @@ struct rte_gtp_hdr_ext_word { > uint8_t next_ext; /**< Next Extension Header Type. */ > } __rte_packed; > > +/** > + * Optional extension for GTP with next_ext set to 0x85 > + * defined based on RFC 38415-g30. > + */ > +__extension__ > +struct rte_gtp_psc_hdr { > + uint8_t ext_hdr_len; /**< PDU ext hdr len in multiples of 4 bytes */ > + uint8_t type:4; /**< PDU type */ > + uint8_t qmp:1; /**< Qos Monitoring Packet */ > + union { > + struct { > + uint8_t snp:1; /**< Sequence number presence */ > + uint8_t spare_dl1:2; /**< spare down link bits */ > + }; > + struct { > + uint8_t dl_delay_ind:1; /**< dl delay result presence */ > + uint8_t ul_delay_ind:1; /**< ul delay result presence */ > + uint8_t snp_ul1:1; /**< Sequence number presence ul */ > + }; > + }; > + union { > + struct { > + uint8_t ppp:1; /**< Paging policy presence */ > + uint8_t rqi:1; /**< Reflective Qos Indicator */ > + }; > + struct { > + uint8_t n_delay_ind:1; /**< N3/N9 delay result presence > */ > + uint8_t spare_ul2:1; /**< spare up link bits */ > + }; > + }; > + uint8_t qfi:6; /**< Qos Flow Identifier */ > + uint8_t data[0]; /**< data feilds */ > +} __rte_packed; With this header, sizeof(rte_gtp_psc_hdr) = 5, is it really expected? It would help to see the specification to have a better idea of how to split, but a possible solution is to do something like this: struct rte_gtp_psc_generic_hdr { uint8_t ext_hdr_len; uint8_t type:4 uint8_t qmp:1; uint8_t pad:3; }; struct rte_gtp_psc_<name1>_hdr { uint8_t ext_hdr_len; uint8_t type:4 uint8_t qmp:1; uint8_t uint8_t snp:1; uint8_t spare_dl1:2; ... }; ... struct rte_gtp_psc_hdr { union { struct rte_gtp_psc_generic_hdr generic; struct rte_gtp_psc_<name1>_hdr <name1>; struct rte_gtp_psc_<name2>_hdr <name2>; }; }; Also, you need to take care about endianness. Regards, Olivier