brintos

brintos / linux-shallow public Read only

0
0
Text · 7.9 KiB · b8c56d7 Raw
290 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */2/*3 * Copyright (c) 2004 Topspin Corporation.  All rights reserved.4 */5 6#ifndef IB_PACK_H7#define IB_PACK_H8 9#include <rdma/ib_verbs.h>10#include <uapi/linux/if_ether.h>11 12enum {13	IB_LRH_BYTES		= 8,14	IB_ETH_BYTES		= 14,15	IB_VLAN_BYTES		= 4,16	IB_GRH_BYTES		= 40,17	IB_IP4_BYTES		= 20,18	IB_UDP_BYTES		= 8,19	IB_BTH_BYTES		= 12,20	IB_DETH_BYTES		= 8,21	IB_EXT_ATOMICETH_BYTES	= 28,22	IB_EXT_XRC_BYTES	= 4,23	IB_ICRC_BYTES		= 424};25 26struct ib_field {27	size_t struct_offset_bytes;28	size_t struct_size_bytes;29	int    offset_words;30	int    offset_bits;31	int    size_bits;32	char  *field_name;33};34 35#define RESERVED \36	.field_name          = "reserved"37 38/*39 * This macro cleans up the definitions of constants for BTH opcodes.40 * It is used to define constants such as IB_OPCODE_UD_SEND_ONLY,41 * which becomes IB_OPCODE_UD + IB_OPCODE_SEND_ONLY, and this gives42 * the correct value.43 *44 * In short, user code should use the constants defined using the45 * macro rather than worrying about adding together other constants.46*/47#define IB_OPCODE(transport, op) \48	IB_OPCODE_ ## transport ## _ ## op = \49		IB_OPCODE_ ## transport + IB_OPCODE_ ## op50 51enum {52	/* transport types -- just used to define real constants */53	IB_OPCODE_RC                                = 0x00,54	IB_OPCODE_UC                                = 0x20,55	IB_OPCODE_RD                                = 0x40,56	IB_OPCODE_UD                                = 0x60,57	/* per IBTA 1.3 vol 1 Table 38, A10.3.2 */58	IB_OPCODE_CNP                               = 0x80,59	/* Manufacturer specific */60	IB_OPCODE_MSP                               = 0xe0,61 62	/* operations -- just used to define real constants */63	IB_OPCODE_SEND_FIRST                        = 0x00,64	IB_OPCODE_SEND_MIDDLE                       = 0x01,65	IB_OPCODE_SEND_LAST                         = 0x02,66	IB_OPCODE_SEND_LAST_WITH_IMMEDIATE          = 0x03,67	IB_OPCODE_SEND_ONLY                         = 0x04,68	IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE          = 0x05,69	IB_OPCODE_RDMA_WRITE_FIRST                  = 0x06,70	IB_OPCODE_RDMA_WRITE_MIDDLE                 = 0x07,71	IB_OPCODE_RDMA_WRITE_LAST                   = 0x08,72	IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE    = 0x09,73	IB_OPCODE_RDMA_WRITE_ONLY                   = 0x0a,74	IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE    = 0x0b,75	IB_OPCODE_RDMA_READ_REQUEST                 = 0x0c,76	IB_OPCODE_RDMA_READ_RESPONSE_FIRST          = 0x0d,77	IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE         = 0x0e,78	IB_OPCODE_RDMA_READ_RESPONSE_LAST           = 0x0f,79	IB_OPCODE_RDMA_READ_RESPONSE_ONLY           = 0x10,80	IB_OPCODE_ACKNOWLEDGE                       = 0x11,81	IB_OPCODE_ATOMIC_ACKNOWLEDGE                = 0x12,82	IB_OPCODE_COMPARE_SWAP                      = 0x13,83	IB_OPCODE_FETCH_ADD                         = 0x14,84	/* opcode 0x15 is reserved */85	IB_OPCODE_SEND_LAST_WITH_INVALIDATE         = 0x16,86	IB_OPCODE_SEND_ONLY_WITH_INVALIDATE         = 0x17,87	IB_OPCODE_FLUSH                             = 0x1C,88	IB_OPCODE_ATOMIC_WRITE                      = 0x1D,89 90	/* real constants follow -- see comment about above IB_OPCODE()91	   macro for more details */92 93	/* RC */94	IB_OPCODE(RC, SEND_FIRST),95	IB_OPCODE(RC, SEND_MIDDLE),96	IB_OPCODE(RC, SEND_LAST),97	IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE),98	IB_OPCODE(RC, SEND_ONLY),99	IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE),100	IB_OPCODE(RC, RDMA_WRITE_FIRST),101	IB_OPCODE(RC, RDMA_WRITE_MIDDLE),102	IB_OPCODE(RC, RDMA_WRITE_LAST),103	IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE),104	IB_OPCODE(RC, RDMA_WRITE_ONLY),105	IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),106	IB_OPCODE(RC, RDMA_READ_REQUEST),107	IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST),108	IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE),109	IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST),110	IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY),111	IB_OPCODE(RC, ACKNOWLEDGE),112	IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE),113	IB_OPCODE(RC, COMPARE_SWAP),114	IB_OPCODE(RC, FETCH_ADD),115	IB_OPCODE(RC, SEND_LAST_WITH_INVALIDATE),116	IB_OPCODE(RC, SEND_ONLY_WITH_INVALIDATE),117	IB_OPCODE(RC, FLUSH),118	IB_OPCODE(RC, ATOMIC_WRITE),119 120	/* UC */121	IB_OPCODE(UC, SEND_FIRST),122	IB_OPCODE(UC, SEND_MIDDLE),123	IB_OPCODE(UC, SEND_LAST),124	IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE),125	IB_OPCODE(UC, SEND_ONLY),126	IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE),127	IB_OPCODE(UC, RDMA_WRITE_FIRST),128	IB_OPCODE(UC, RDMA_WRITE_MIDDLE),129	IB_OPCODE(UC, RDMA_WRITE_LAST),130	IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE),131	IB_OPCODE(UC, RDMA_WRITE_ONLY),132	IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),133 134	/* RD */135	IB_OPCODE(RD, SEND_FIRST),136	IB_OPCODE(RD, SEND_MIDDLE),137	IB_OPCODE(RD, SEND_LAST),138	IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE),139	IB_OPCODE(RD, SEND_ONLY),140	IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE),141	IB_OPCODE(RD, RDMA_WRITE_FIRST),142	IB_OPCODE(RD, RDMA_WRITE_MIDDLE),143	IB_OPCODE(RD, RDMA_WRITE_LAST),144	IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE),145	IB_OPCODE(RD, RDMA_WRITE_ONLY),146	IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE),147	IB_OPCODE(RD, RDMA_READ_REQUEST),148	IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST),149	IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE),150	IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST),151	IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY),152	IB_OPCODE(RD, ACKNOWLEDGE),153	IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE),154	IB_OPCODE(RD, COMPARE_SWAP),155	IB_OPCODE(RD, FETCH_ADD),156	IB_OPCODE(RD, FLUSH),157 158	/* UD */159	IB_OPCODE(UD, SEND_ONLY),160	IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE)161};162 163enum {164	IB_LNH_RAW        = 0,165	IB_LNH_IP         = 1,166	IB_LNH_IBA_LOCAL  = 2,167	IB_LNH_IBA_GLOBAL = 3168};169 170struct ib_unpacked_lrh {171	u8        virtual_lane;172	u8        link_version;173	u8        service_level;174	u8        link_next_header;175	__be16    destination_lid;176	__be16    packet_length;177	__be16    source_lid;178};179 180struct ib_unpacked_grh {181	u8    	     ip_version;182	u8    	     traffic_class;183	__be32 	     flow_label;184	__be16       payload_length;185	u8    	     next_header;186	u8    	     hop_limit;187	union ib_gid source_gid;188	union ib_gid destination_gid;189};190 191struct ib_unpacked_bth {192	u8           opcode;193	u8           solicited_event;194	u8           mig_req;195	u8           pad_count;196	u8           transport_header_version;197	__be16       pkey;198	__be32       destination_qpn;199	u8           ack_req;200	__be32       psn;201};202 203struct ib_unpacked_deth {204	__be32       qkey;205	__be32       source_qpn;206};207 208struct ib_unpacked_eth {209	u8	dmac_h[4];210	u8	dmac_l[2];211	u8	smac_h[2];212	u8	smac_l[4];213	__be16	type;214};215 216struct ib_unpacked_ip4 {217	u8	ver;218	u8	hdr_len;219	u8	tos;220	__be16	tot_len;221	__be16	id;222	__be16	frag_off;223	u8	ttl;224	u8	protocol;225	__sum16	check;226	__be32	saddr;227	__be32	daddr;228};229 230struct ib_unpacked_udp {231	__be16	sport;232	__be16	dport;233	__be16	length;234	__be16	csum;235};236 237struct ib_unpacked_vlan {238	__be16  tag;239	__be16  type;240};241 242struct ib_ud_header {243	int                     lrh_present;244	struct ib_unpacked_lrh  lrh;245	int			eth_present;246	struct ib_unpacked_eth	eth;247	int                     vlan_present;248	struct ib_unpacked_vlan vlan;249	int			grh_present;250	struct ib_unpacked_grh	grh;251	int			ipv4_present;252	struct ib_unpacked_ip4	ip4;253	int			udp_present;254	struct ib_unpacked_udp	udp;255	struct ib_unpacked_bth	bth;256	struct ib_unpacked_deth deth;257	int			immediate_present;258	__be32			immediate_data;259};260 261void ib_pack(const struct ib_field        *desc,262	     int                           desc_len,263	     void                         *structure,264	     void                         *buf);265 266void ib_unpack(const struct ib_field        *desc,267	       int                           desc_len,268	       void                         *buf,269	       void                         *structure);270 271__sum16 ib_ud_ip4_csum(struct ib_ud_header *header);272 273int ib_ud_header_init(int		    payload_bytes,274		      int		    lrh_present,275		      int		    eth_present,276		      int		    vlan_present,277		      int		    grh_present,278		      int		    ip_version,279		      int		    udp_present,280		      int		    immediate_present,281		      struct ib_ud_header *header);282 283int ib_ud_header_pack(struct ib_ud_header *header,284		      void                *buf);285 286int ib_ud_header_unpack(void                *buf,287			struct ib_ud_header *header);288 289#endif /* IB_PACK_H */290