openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

shr_pkt.h (9154B)


      1 
      2 /* 
      3  * 
      4  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      5  * 
      6  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      7  *
      8  * File:        shr_pkt.h
      9  * Purpose:     Common Packet Format definitions shared by
     10  *              SDK and UKERNEL
     11  */
     12 
     13 #ifndef   _SOC_SHARED_SHR_PKT_H_
     14 #define   _SOC_SHARED_SHR_PKT_H_
     15 
     16 #include <shared/pack.h>
     17 
     18 #include <bcm/types.h>
     19 
     20 /* LoopBack Header */
     21 #define SHR_LB_HEADER_LENGTH             16
     22 
     23 /* INT Header */
     24 #define SHR_INT_HEADER_LENGTH            28
     25 
     26 /* UDP Header */
     27 #define SHR_UDP_HEADER_LENGTH            8
     28 
     29 /* IPv4 Header */
     30 #define SHR_IPV4_VERSION                 4
     31 #define SHR_IPV4_HEADER_LENGTH           20    /* Bytes */
     32 #define SHR_IPV4_HEADER_LENGTH_WORDS     5     /* Words */
     33 
     34 /* IPv6 Header */
     35 #define SHR_IPV6_VERSION                 6
     36 
     37 /* L2 Header */
     38 #define SHR_L2_ETYPE_IPV4                  0x0800
     39 #define SHR_L2_ETYPE_IPV6                  0x86DD
     40 #define SHR_MAC_ADDR_LENGTH    (sizeof(bcm_mac_t))
     41 
     42 /* IP Protocols */
     43 #define SHR_IP_PROTOCOL_UDP              17
     44 
     45 /* Length of L2 CRC */
     46 #define SHR_L2_CRC_LENGTH 4
     47 
     48 /* Initial UDP Payload length. */
     49 #define SHR_UDP_PAYLOAD_LENGTH           0x10
     50 
     51 /* LoopBack Header */
     52 typedef struct shr_lb_header_s {   /* <num bits>: ... */
     53     uint8 start;             /* 8: Start    */
     54     uint8 input_pri;         /* 4: Input Priority    */
     55 
     56     uint8 common_hdr0;       /* 4: Common Header field    */
     57     uint8 common_hdr1;       /* 1: Common Header field    */
     58 
     59     uint8 source_type;       /* 1: Source Type    */
     60     uint8 source0;           /* 6: Source 0 Module Id    */
     61     uint8 source1;           /* 8: Source 1 Ingress port    */
     62     uint8 source2;           /* 2: Source 2 Ingress port    */
     63 
     64     uint8 visibility;        /* 1: Visibility    */
     65     uint8 pkt_profile;       /* 3: Packet Profile Details    */
     66 
     67     uint8 reserved0_0;       /* 2:  Reserved Field   */
     68     uint8 reserved0_1;       /* 8:  Reserved Field   */
     69     uint8 reserved1_0;       /* 8:  Reserved Field   */
     70     uint8 reserved1_1;       /* 2:  Reserved Field   */
     71 
     72     uint8 zero;              /* 1:  Zero   */
     73     uint8 reserved2;         /* 5:  Reserved Field   */
     74     uint8 reserved3;         /* 8:  Reserved Field   */
     75     uint8 reserved4;         /* 8:  Reserved Field   */
     76     uint8 reserved5;         /* 8:  Reserved Field   */
     77     uint8 reserved6;         /* 8:  Reserved Field   */
     78     uint8 reserved7;         /* 8:  Reserved Field   */
     79     uint8 reserved8;         /* 8:  Reserved Field   */
     80     uint8 reserved9;         /* 8:  Reserved Field   */
     81 
     82     uint8 pp_port;           /* 8:  Ingress port    */
     83 } shr_lb_header_t;
     84 
     85 /* INT Header */
     86 typedef struct shr_int_header_s {   /* <num bits>: ... */
     87     uint32  probemarker1;           /* 32: Probemerker1 value */
     88     uint32  probemarker2;           /* 32: Probemerker2 value */
     89     uint8   ver;                    /*  8: Version */
     90     uint8   type;                   /*  8: Type */
     91     uint16  flags;                  /* 16: Flags */
     92     uint32  requestvector;          /* 32: RequestVector */
     93     uint8   hoplimit;               /*  8: HopLimit */
     94     uint8   hopcount;               /*  8: HopCount */
     95     uint16  mustbezeros;            /* 16: MustBeZeros */
     96     uint16  maximumlength;          /* 16: MaximumLength of Payload */
     97     uint16  currentlength;          /* 16: CurrentLength of Payload */
     98     uint16  senderhandle;           /* 16: Sender Handle */
     99     uint16  seqnumber;              /* 16: Sequence Number */
    100 } shr_int_header_t;
    101 
    102 /* UDP Header */
    103 typedef struct shr_udp_header_s {  /* <num bits>: ... */
    104     uint16  src;         /* 16: Source Port Number */
    105     uint16  dst;         /* 16: Destination Port Number */
    106     uint16  length;      /* 16: Length */
    107     uint16  sum;         /* 16: Checksum */
    108 } shr_udp_header_t;
    109 
    110 /* IPv4 Header */
    111 typedef struct shr_ipv4_header_s {
    112     uint8   version;     /*  4: Version */
    113     uint8   h_length;    /*  4: Header length */
    114     uint8   dscp;        /*  6: Differentiated Services Code Point */
    115     uint8   ecn;         /*  2: Explicit Congestion Notification */
    116     uint16  length;      /* 16: Total Length bytes (header + data) */
    117     uint16  id;          /* 16: Identification */
    118     uint8   flags;       /*  3: Flags */
    119     uint16  f_offset;    /* 13: Fragment Offset */
    120     uint8   ttl;         /*  8: Time to Live */
    121     uint8   protocol;    /*  8: Protocol */
    122     uint16  sum;         /* 16: Header Checksum */
    123     uint32  src;         /* 32: Source IP Address */
    124     uint32  dst;         /* 32: Destination IP Address */
    125 } shr_ipv4_header_t;
    126 
    127 /* IPv6 Header */
    128 typedef struct shr_ipv6_header_s {
    129     uint8      version;        /*   4: Version */
    130     uint8      t_class;        /*   8: Traffic Class (6:dscp, 2:ecn) */
    131     uint32     f_label;        /*  20: Flow Label */
    132     uint16     p_length;       /*  16: Payload Length */
    133     uint8      next_header;    /*   8: Next Header */
    134     uint8      hop_limit;      /*   8: Hop Limit */
    135     bcm_ip6_t  src;            /* 128: Source IP Address */
    136     bcm_ip6_t  dst;            /* 128: Destination IP Address */
    137 } shr_ipv6_header_t;
    138 
    139 /* GRE - Generic Routing Encapsulation */
    140 typedef struct shr_gre_header_s {
    141     uint8   checksum;           /*  1: Checksum present */
    142     uint8   routing;            /*  1: Routing present */
    143     uint8   key;                /*  1: Key present */
    144     uint8   sequence_num;       /*  1: Sequence number present */
    145     uint8   strict_src_route;   /*  1: Strict Source Routing */
    146     uint8   recursion_control;  /*  3: Recursion Control */
    147     uint8   flags;              /*  5: Flags */
    148     uint8   version;            /*  3: Version */
    149     uint16  protocol;           /* 16: Protocol Type */
    150 } shr_gre_header_t;
    151 
    152 /* ACH - Associated Channel Header */
    153 typedef struct shr_ach_header_s {
    154     uint8   f_nibble;        /*  4: First nibble, must be 1 */
    155     uint8   version;         /*  4: Version */
    156     uint8   reserved;        /*  8: Reserved */
    157     uint16  channel_type;    /* 16: Channel Type */
    158 } shr_ach_header_t;
    159 
    160 /* MPLS - Multiprotocol Label Switching Label */
    161 typedef struct shr_mpls_label_s {
    162     uint32  label;    /* 20: Label */
    163     uint8   exp;      /*  3: Experimental, Traffic Class, ECN */
    164     uint8   s;        /*  1: Bottom of Stack */
    165     uint8   ttl;      /*  8: Time to Live */
    166 } shr_mpls_label_t;
    167 
    168 /* VLAN Tag - 802.1Q */
    169 typedef struct shr_vlan_tag_s {
    170     uint16      tpid;    /* 16: Tag Protocol Identifier */
    171     struct {
    172         uint8   prio;    /*  3: Priority Code Point */
    173         uint8   cfi;     /*  1: Canonical Format Indicator */
    174         uint16  vid;     /* 12: Vlan Identifier */
    175     } tci;               /* Tag Control Identifier */
    176 } shr_vlan_tag_t;
    177 
    178 /* L2 Header */
    179 typedef struct shr_l2_header_t {
    180     bcm_mac_t       dst_mac;      /* 48: Destination MAC */
    181     bcm_mac_t       src_mac;      /* 48: Source MAC */
    182     shr_vlan_tag_t  outer_vlan_tag;    /* VLAN Tag */
    183     shr_vlan_tag_t  inner_vlan_tag;    /* inner VLAN Tag */
    184     uint16          etype;        /* 16: Ether Type */
    185 } shr_l2_header_t;
    186 
    187 /* Ipfix Header */
    188 typedef struct shr_ipfix_header_s {
    189     uint16 version;         /* 16: version */
    190     uint16 length;          /* 16: Header and payload length */
    191     uint32 export_time;     /* 32: export time */
    192     uint32 sequence_num;    /* 32: sequcene number */
    193     uint32 observation_id;  /* 32: observation domain id */
    194 } shr_ipfix_header_t;
    195 
    196 /*******************************************
    197  * Pack/Unpack Macros
    198  * 
    199  * Data is packed/unpacked in/from Network byte order
    200  */
    201 #define SHR_PKT_PACK_U8(_buf, _var)     _SHR_PACK_U8(_buf, _var)
    202 #define SHR_PKT_PACK_U16(_buf, _var)    _SHR_PACK_U16(_buf, _var)
    203 #define SHR_PKT_PACK_U32(_buf, _var)    _SHR_PACK_U32(_buf, _var)
    204 #define SHR_PKT_UNPACK_U8(_buf, _var)   _SHR_UNPACK_U8(_buf, _var)
    205 #define SHR_PKT_UNPACK_U16(_buf, _var)  _SHR_UNPACK_U16(_buf, _var)
    206 #define SHR_PKT_UNPACK_U32(_buf, _var)  _SHR_UNPACK_U32(_buf, _var)
    207 
    208 /* Pack routines used to pack these header information into
    209  * provided buffers in network byte order.
    210  */
    211 uint8 *
    212 shr_lb_header_pack(uint8 *buffer, shr_lb_header_t *lb);
    213 uint8 *
    214 shr_int_header_pack(uint8 *buffer, shr_int_header_t *int_h);
    215 uint8 *
    216 shr_udp_header_pack(uint8 *buffer, shr_udp_header_t *udp);
    217 uint8 *
    218 shr_ipv4_header_pack(uint8 *buffer, shr_ipv4_header_t *ip);
    219 uint8 *
    220 shr_ipv6_header_pack(uint8 *buffer, shr_ipv6_header_t *ip);
    221 uint8 *
    222 shr_gre_header_pack(uint8 *buffer, shr_gre_header_t *gre);
    223 uint8 *
    224 shr_ach_header_pack(uint8 *buffer, shr_ach_header_t *ach);
    225 uint8 *
    226 shr_mpls_label_pack(uint8 *buffer, shr_mpls_label_t *mpls);
    227 uint8 *
    228 shr_l2_header_pack(uint8 *buffer, shr_l2_header_t *l2);
    229 uint8 *
    230 shr_ipfix_header_pack(uint8 *buffer, shr_ipfix_header_t *ipfix);
    231 
    232 /* Utility functions */
    233 uint32
    234 shr_initial_chksum_get(uint16 length, uint8 *data);
    235 
    236 uint32
    237 shr_udp_initial_checksum_get(int v6,
    238                              shr_ipv4_header_t *ipv4,
    239                              shr_ipv6_header_t *ipv6,
    240                              uint8 *payload,
    241                              shr_udp_header_t  *udp);
    242 
    243 #endif/* _SOC_SHARED_SHR_PKT_H_ */