Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
0002 /*
0003  * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
0004  */
0005 
0006 #ifndef IB_PACK_H
0007 #define IB_PACK_H
0008 
0009 #include <rdma/ib_verbs.h>
0010 #include <uapi/linux/if_ether.h>
0011 
0012 enum {
0013     IB_LRH_BYTES        = 8,
0014     IB_ETH_BYTES        = 14,
0015     IB_VLAN_BYTES       = 4,
0016     IB_GRH_BYTES        = 40,
0017     IB_IP4_BYTES        = 20,
0018     IB_UDP_BYTES        = 8,
0019     IB_BTH_BYTES        = 12,
0020     IB_DETH_BYTES       = 8,
0021     IB_EXT_ATOMICETH_BYTES  = 28,
0022     IB_EXT_XRC_BYTES    = 4,
0023     IB_ICRC_BYTES       = 4
0024 };
0025 
0026 struct ib_field {
0027     size_t struct_offset_bytes;
0028     size_t struct_size_bytes;
0029     int    offset_words;
0030     int    offset_bits;
0031     int    size_bits;
0032     char  *field_name;
0033 };
0034 
0035 #define RESERVED \
0036     .field_name          = "reserved"
0037 
0038 /*
0039  * This macro cleans up the definitions of constants for BTH opcodes.
0040  * It is used to define constants such as IB_OPCODE_UD_SEND_ONLY,
0041  * which becomes IB_OPCODE_UD + IB_OPCODE_SEND_ONLY, and this gives
0042  * the correct value.
0043  *
0044  * In short, user code should use the constants defined using the
0045  * macro rather than worrying about adding together other constants.
0046 */
0047 #define IB_OPCODE(transport, op) \
0048     IB_OPCODE_ ## transport ## _ ## op = \
0049         IB_OPCODE_ ## transport + IB_OPCODE_ ## op
0050 
0051 enum {
0052     /* transport types -- just used to define real constants */
0053     IB_OPCODE_RC                                = 0x00,
0054     IB_OPCODE_UC                                = 0x20,
0055     IB_OPCODE_RD                                = 0x40,
0056     IB_OPCODE_UD                                = 0x60,
0057     /* per IBTA 1.3 vol 1 Table 38, A10.3.2 */
0058     IB_OPCODE_CNP                               = 0x80,
0059     /* Manufacturer specific */
0060     IB_OPCODE_MSP                               = 0xe0,
0061 
0062     /* operations -- just used to define real constants */
0063     IB_OPCODE_SEND_FIRST                        = 0x00,
0064     IB_OPCODE_SEND_MIDDLE                       = 0x01,
0065     IB_OPCODE_SEND_LAST                         = 0x02,
0066     IB_OPCODE_SEND_LAST_WITH_IMMEDIATE          = 0x03,
0067     IB_OPCODE_SEND_ONLY                         = 0x04,
0068     IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE          = 0x05,
0069     IB_OPCODE_RDMA_WRITE_FIRST                  = 0x06,
0070     IB_OPCODE_RDMA_WRITE_MIDDLE                 = 0x07,
0071     IB_OPCODE_RDMA_WRITE_LAST                   = 0x08,
0072     IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE    = 0x09,
0073     IB_OPCODE_RDMA_WRITE_ONLY                   = 0x0a,
0074     IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE    = 0x0b,
0075     IB_OPCODE_RDMA_READ_REQUEST                 = 0x0c,
0076     IB_OPCODE_RDMA_READ_RESPONSE_FIRST          = 0x0d,
0077     IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE         = 0x0e,
0078     IB_OPCODE_RDMA_READ_RESPONSE_LAST           = 0x0f,
0079     IB_OPCODE_RDMA_READ_RESPONSE_ONLY           = 0x10,
0080     IB_OPCODE_ACKNOWLEDGE                       = 0x11,
0081     IB_OPCODE_ATOMIC_ACKNOWLEDGE                = 0x12,
0082     IB_OPCODE_COMPARE_SWAP                      = 0x13,
0083     IB_OPCODE_FETCH_ADD                         = 0x14,
0084     /* opcode 0x15 is reserved */
0085     IB_OPCODE_SEND_LAST_WITH_INVALIDATE         = 0x16,
0086     IB_OPCODE_SEND_ONLY_WITH_INVALIDATE         = 0x17,
0087 
0088     /* real constants follow -- see comment about above IB_OPCODE()
0089        macro for more details */
0090 
0091     /* RC */
0092     IB_OPCODE(RC, SEND_FIRST),
0093     IB_OPCODE(RC, SEND_MIDDLE),
0094     IB_OPCODE(RC, SEND_LAST),
0095     IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE),
0096     IB_OPCODE(RC, SEND_ONLY),
0097     IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE),
0098     IB_OPCODE(RC, RDMA_WRITE_FIRST),
0099     IB_OPCODE(RC, RDMA_WRITE_MIDDLE),
0100     IB_OPCODE(RC, RDMA_WRITE_LAST),
0101     IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
0102     IB_OPCODE(RC, RDMA_WRITE_ONLY),
0103     IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
0104     IB_OPCODE(RC, RDMA_READ_REQUEST),
0105     IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST),
0106     IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE),
0107     IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST),
0108     IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY),
0109     IB_OPCODE(RC, ACKNOWLEDGE),
0110     IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE),
0111     IB_OPCODE(RC, COMPARE_SWAP),
0112     IB_OPCODE(RC, FETCH_ADD),
0113     IB_OPCODE(RC, SEND_LAST_WITH_INVALIDATE),
0114     IB_OPCODE(RC, SEND_ONLY_WITH_INVALIDATE),
0115 
0116     /* UC */
0117     IB_OPCODE(UC, SEND_FIRST),
0118     IB_OPCODE(UC, SEND_MIDDLE),
0119     IB_OPCODE(UC, SEND_LAST),
0120     IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE),
0121     IB_OPCODE(UC, SEND_ONLY),
0122     IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE),
0123     IB_OPCODE(UC, RDMA_WRITE_FIRST),
0124     IB_OPCODE(UC, RDMA_WRITE_MIDDLE),
0125     IB_OPCODE(UC, RDMA_WRITE_LAST),
0126     IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
0127     IB_OPCODE(UC, RDMA_WRITE_ONLY),
0128     IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
0129 
0130     /* RD */
0131     IB_OPCODE(RD, SEND_FIRST),
0132     IB_OPCODE(RD, SEND_MIDDLE),
0133     IB_OPCODE(RD, SEND_LAST),
0134     IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE),
0135     IB_OPCODE(RD, SEND_ONLY),
0136     IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE),
0137     IB_OPCODE(RD, RDMA_WRITE_FIRST),
0138     IB_OPCODE(RD, RDMA_WRITE_MIDDLE),
0139     IB_OPCODE(RD, RDMA_WRITE_LAST),
0140     IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE),
0141     IB_OPCODE(RD, RDMA_WRITE_ONLY),
0142     IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
0143     IB_OPCODE(RD, RDMA_READ_REQUEST),
0144     IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST),
0145     IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE),
0146     IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST),
0147     IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY),
0148     IB_OPCODE(RD, ACKNOWLEDGE),
0149     IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE),
0150     IB_OPCODE(RD, COMPARE_SWAP),
0151     IB_OPCODE(RD, FETCH_ADD),
0152 
0153     /* UD */
0154     IB_OPCODE(UD, SEND_ONLY),
0155     IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE)
0156 };
0157 
0158 enum {
0159     IB_LNH_RAW        = 0,
0160     IB_LNH_IP         = 1,
0161     IB_LNH_IBA_LOCAL  = 2,
0162     IB_LNH_IBA_GLOBAL = 3
0163 };
0164 
0165 struct ib_unpacked_lrh {
0166     u8        virtual_lane;
0167     u8        link_version;
0168     u8        service_level;
0169     u8        link_next_header;
0170     __be16    destination_lid;
0171     __be16    packet_length;
0172     __be16    source_lid;
0173 };
0174 
0175 struct ib_unpacked_grh {
0176     u8           ip_version;
0177     u8           traffic_class;
0178     __be32       flow_label;
0179     __be16       payload_length;
0180     u8           next_header;
0181     u8           hop_limit;
0182     union ib_gid source_gid;
0183     union ib_gid destination_gid;
0184 };
0185 
0186 struct ib_unpacked_bth {
0187     u8           opcode;
0188     u8           solicited_event;
0189     u8           mig_req;
0190     u8           pad_count;
0191     u8           transport_header_version;
0192     __be16       pkey;
0193     __be32       destination_qpn;
0194     u8           ack_req;
0195     __be32       psn;
0196 };
0197 
0198 struct ib_unpacked_deth {
0199     __be32       qkey;
0200     __be32       source_qpn;
0201 };
0202 
0203 struct ib_unpacked_eth {
0204     u8  dmac_h[4];
0205     u8  dmac_l[2];
0206     u8  smac_h[2];
0207     u8  smac_l[4];
0208     __be16  type;
0209 };
0210 
0211 struct ib_unpacked_ip4 {
0212     u8  ver;
0213     u8  hdr_len;
0214     u8  tos;
0215     __be16  tot_len;
0216     __be16  id;
0217     __be16  frag_off;
0218     u8  ttl;
0219     u8  protocol;
0220     __sum16 check;
0221     __be32  saddr;
0222     __be32  daddr;
0223 };
0224 
0225 struct ib_unpacked_udp {
0226     __be16  sport;
0227     __be16  dport;
0228     __be16  length;
0229     __be16  csum;
0230 };
0231 
0232 struct ib_unpacked_vlan {
0233     __be16  tag;
0234     __be16  type;
0235 };
0236 
0237 struct ib_ud_header {
0238     int                     lrh_present;
0239     struct ib_unpacked_lrh  lrh;
0240     int         eth_present;
0241     struct ib_unpacked_eth  eth;
0242     int                     vlan_present;
0243     struct ib_unpacked_vlan vlan;
0244     int         grh_present;
0245     struct ib_unpacked_grh  grh;
0246     int         ipv4_present;
0247     struct ib_unpacked_ip4  ip4;
0248     int         udp_present;
0249     struct ib_unpacked_udp  udp;
0250     struct ib_unpacked_bth  bth;
0251     struct ib_unpacked_deth deth;
0252     int         immediate_present;
0253     __be32          immediate_data;
0254 };
0255 
0256 void ib_pack(const struct ib_field        *desc,
0257          int                           desc_len,
0258          void                         *structure,
0259          void                         *buf);
0260 
0261 void ib_unpack(const struct ib_field        *desc,
0262            int                           desc_len,
0263            void                         *buf,
0264            void                         *structure);
0265 
0266 __sum16 ib_ud_ip4_csum(struct ib_ud_header *header);
0267 
0268 int ib_ud_header_init(int           payload_bytes,
0269               int           lrh_present,
0270               int           eth_present,
0271               int           vlan_present,
0272               int           grh_present,
0273               int           ip_version,
0274               int           udp_present,
0275               int           immediate_present,
0276               struct ib_ud_header *header);
0277 
0278 int ib_ud_header_pack(struct ib_ud_header *header,
0279               void                *buf);
0280 
0281 int ib_ud_header_unpack(void                *buf,
0282             struct ib_ud_header *header);
0283 
0284 #endif /* IB_PACK_H */