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_ */