home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / rdma / ib_pack.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.6 KB  |  246 lines

  1. /*
  2.  * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
  3.  *
  4.  * This software is available to you under a choice of one of two
  5.  * licenses.  You may choose to be licensed under the terms of the GNU
  6.  * General Public License (GPL) Version 2, available from the file
  7.  * COPYING in the main directory of this source tree, or the
  8.  * OpenIB.org BSD license below:
  9.  *
  10.  *     Redistribution and use in source and binary forms, with or
  11.  *     without modification, are permitted provided that the following
  12.  *     conditions are met:
  13.  *
  14.  *      - Redistributions of source code must retain the above
  15.  *        copyright notice, this list of conditions and the following
  16.  *        disclaimer.
  17.  *
  18.  *      - Redistributions in binary form must reproduce the above
  19.  *        copyright notice, this list of conditions and the following
  20.  *        disclaimer in the documentation and/or other materials
  21.  *        provided with the distribution.
  22.  *
  23.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30.  * SOFTWARE.
  31.  *
  32.  * $Id: ib_pack.h 1349 2004-12-16 21:09:43Z roland $
  33.  */
  34.  
  35. #ifndef IB_PACK_H
  36. #define IB_PACK_H
  37.  
  38. #include <rdma/ib_verbs.h>
  39.  
  40. enum {
  41.     IB_LRH_BYTES  = 8,
  42.     IB_GRH_BYTES  = 40,
  43.     IB_BTH_BYTES  = 12,
  44.     IB_DETH_BYTES = 8
  45. };
  46.  
  47. struct ib_field {
  48.     size_t struct_offset_bytes;
  49.     size_t struct_size_bytes;
  50.     int    offset_words;
  51.     int    offset_bits;
  52.     int    size_bits;
  53.     char  *field_name;
  54. };
  55.  
  56. #define RESERVED \
  57.     .field_name          = "reserved"
  58.  
  59. /*
  60.  * This macro cleans up the definitions of constants for BTH opcodes.
  61.  * It is used to define constants such as IB_OPCODE_UD_SEND_ONLY,
  62.  * which becomes IB_OPCODE_UD + IB_OPCODE_SEND_ONLY, and this gives
  63.  * the correct value.
  64.  *
  65.  * In short, user code should use the constants defined using the
  66.  * macro rather than worrying about adding together other constants.
  67. */
  68. #define IB_OPCODE(transport, op) \
  69.     IB_OPCODE_ ## transport ## _ ## op = \
  70.         IB_OPCODE_ ## transport + IB_OPCODE_ ## op
  71.  
  72. enum {
  73.     /* transport types -- just used to define real constants */
  74.     IB_OPCODE_RC                                = 0x00,
  75.     IB_OPCODE_UC                                = 0x20,
  76.     IB_OPCODE_RD                                = 0x40,
  77.     IB_OPCODE_UD                                = 0x60,
  78.  
  79.     /* operations -- just used to define real constants */
  80.     IB_OPCODE_SEND_FIRST                        = 0x00,
  81.     IB_OPCODE_SEND_MIDDLE                       = 0x01,
  82.     IB_OPCODE_SEND_LAST                         = 0x02,
  83.     IB_OPCODE_SEND_LAST_WITH_IMMEDIATE          = 0x03,
  84.     IB_OPCODE_SEND_ONLY                         = 0x04,
  85.     IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE          = 0x05,
  86.     IB_OPCODE_RDMA_WRITE_FIRST                  = 0x06,
  87.     IB_OPCODE_RDMA_WRITE_MIDDLE                 = 0x07,
  88.     IB_OPCODE_RDMA_WRITE_LAST                   = 0x08,
  89.     IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE    = 0x09,
  90.     IB_OPCODE_RDMA_WRITE_ONLY                   = 0x0a,
  91.     IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE    = 0x0b,
  92.     IB_OPCODE_RDMA_READ_REQUEST                 = 0x0c,
  93.     IB_OPCODE_RDMA_READ_RESPONSE_FIRST          = 0x0d,
  94.     IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE         = 0x0e,
  95.     IB_OPCODE_RDMA_READ_RESPONSE_LAST           = 0x0f,
  96.     IB_OPCODE_RDMA_READ_RESPONSE_ONLY           = 0x10,
  97.     IB_OPCODE_ACKNOWLEDGE                       = 0x11,
  98.     IB_OPCODE_ATOMIC_ACKNOWLEDGE                = 0x12,
  99.     IB_OPCODE_COMPARE_SWAP                      = 0x13,
  100.     IB_OPCODE_FETCH_ADD                         = 0x14,
  101.  
  102.     /* real constants follow -- see comment about above IB_OPCODE()
  103.        macro for more details */
  104.  
  105.     /* RC */
  106.     IB_OPCODE(RC, SEND_FIRST),
  107.     IB_OPCODE(RC, SEND_MIDDLE),
  108.     IB_OPCODE(RC, SEND_LAST),
  109.     IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE),
  110.     IB_OPCODE(RC, SEND_ONLY),
  111.     IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE),
  112.     IB_OPCODE(RC, RDMA_WRITE_FIRST),
  113.     IB_OPCODE(RC, RDMA_WRITE_MIDDLE),
  114.     IB_OPCODE(RC, RDMA_WRITE_LAST),
  115.     IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
  116.     IB_OPCODE(RC, RDMA_WRITE_ONLY),
  117.     IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
  118.     IB_OPCODE(RC, RDMA_READ_REQUEST),
  119.     IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST),
  120.     IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE),
  121.     IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST),
  122.     IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY),
  123.     IB_OPCODE(RC, ACKNOWLEDGE),
  124.     IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE),
  125.     IB_OPCODE(RC, COMPARE_SWAP),
  126.     IB_OPCODE(RC, FETCH_ADD),
  127.  
  128.     /* UC */
  129.     IB_OPCODE(UC, SEND_FIRST),
  130.     IB_OPCODE(UC, SEND_MIDDLE),
  131.     IB_OPCODE(UC, SEND_LAST),
  132.     IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE),
  133.     IB_OPCODE(UC, SEND_ONLY),
  134.     IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE),
  135.     IB_OPCODE(UC, RDMA_WRITE_FIRST),
  136.     IB_OPCODE(UC, RDMA_WRITE_MIDDLE),
  137.     IB_OPCODE(UC, RDMA_WRITE_LAST),
  138.     IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
  139.     IB_OPCODE(UC, RDMA_WRITE_ONLY),
  140.     IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
  141.  
  142.     /* RD */
  143.     IB_OPCODE(RD, SEND_FIRST),
  144.     IB_OPCODE(RD, SEND_MIDDLE),
  145.     IB_OPCODE(RD, SEND_LAST),
  146.     IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE),
  147.     IB_OPCODE(RD, SEND_ONLY),
  148.     IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE),
  149.     IB_OPCODE(RD, RDMA_WRITE_FIRST),
  150.     IB_OPCODE(RD, RDMA_WRITE_MIDDLE),
  151.     IB_OPCODE(RD, RDMA_WRITE_LAST),
  152.     IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE),
  153.     IB_OPCODE(RD, RDMA_WRITE_ONLY),
  154.     IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
  155.     IB_OPCODE(RD, RDMA_READ_REQUEST),
  156.     IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST),
  157.     IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE),
  158.     IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST),
  159.     IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY),
  160.     IB_OPCODE(RD, ACKNOWLEDGE),
  161.     IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE),
  162.     IB_OPCODE(RD, COMPARE_SWAP),
  163.     IB_OPCODE(RD, FETCH_ADD),
  164.  
  165.     /* UD */
  166.     IB_OPCODE(UD, SEND_ONLY),
  167.     IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE)
  168. };
  169.  
  170. enum {
  171.     IB_LNH_RAW        = 0,
  172.     IB_LNH_IP         = 1,
  173.     IB_LNH_IBA_LOCAL  = 2,
  174.     IB_LNH_IBA_GLOBAL = 3
  175. };
  176.  
  177. struct ib_unpacked_lrh {
  178.     u8        virtual_lane;
  179.     u8        link_version;
  180.     u8        service_level;
  181.     u8        link_next_header;
  182.     __be16    destination_lid;
  183.     __be16    packet_length;
  184.     __be16    source_lid;
  185. };
  186.  
  187. struct ib_unpacked_grh {
  188.     u8             ip_version;
  189.     u8             traffic_class;
  190.     __be32          flow_label;
  191.     __be16       payload_length;
  192.     u8             next_header;
  193.     u8             hop_limit;
  194.     union ib_gid source_gid;
  195.     union ib_gid destination_gid;
  196. };
  197.  
  198. struct ib_unpacked_bth {
  199.     u8           opcode;
  200.     u8           solicited_event;
  201.     u8           mig_req;
  202.     u8           pad_count;
  203.     u8           transport_header_version;
  204.     __be16       pkey;
  205.     __be32       destination_qpn;
  206.     u8           ack_req;
  207.     __be32       psn;
  208. };
  209.  
  210. struct ib_unpacked_deth {
  211.     __be32       qkey;
  212.     __be32       source_qpn;
  213. };
  214.  
  215. struct ib_ud_header {
  216.     struct ib_unpacked_lrh  lrh;
  217.     int                     grh_present;
  218.     struct ib_unpacked_grh  grh;
  219.     struct ib_unpacked_bth  bth;
  220.     struct ib_unpacked_deth deth;
  221.     int                    immediate_present;
  222.     __be32                 immediate_data;
  223. };
  224.  
  225. void ib_pack(const struct ib_field        *desc,
  226.          int                           desc_len,
  227.          void                         *structure,
  228.          void                         *buf);
  229.  
  230. void ib_unpack(const struct ib_field        *desc,
  231.            int                           desc_len,
  232.            void                         *buf,
  233.            void                         *structure);
  234.  
  235. void ib_ud_header_init(int                payload_bytes,
  236.                int               grh_present,
  237.                struct ib_ud_header *header);
  238.  
  239. int ib_ud_header_pack(struct ib_ud_header *header,
  240.               void                *buf);
  241.  
  242. int ib_ud_header_unpack(void                *buf,
  243.             struct ib_ud_header *header);
  244.  
  245. #endif /* IB_PACK_H */
  246.