1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_IB_MGT_IBMF_IBMF_RMPP_H 28 #define _SYS_IB_MGT_IBMF_IBMF_RMPP_H 29 30 /* 31 * This file contains the IBMF RMPP implementation dependent structures 32 * and defines. 33 */ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* The RMPP context */ 40 typedef struct _ibmf_rmpp_ctx_t { 41 uint32_t rmpp_wf; /* first segment in window (send) */ 42 uint32_t rmpp_wl; /* last segment in window (send) */ 43 uint32_t rmpp_ns; /* next segment in window (send) */ 44 uint32_t rmpp_es; /* expected segment num (receive) */ 45 uint32_t rmpp_is_ds; /* direction change indicator */ 46 uint32_t rmpp_nwl; /* new window last */ 47 uint32_t rmpp_pyld_len; /* payload length */ 48 uint32_t rmpp_state; /* rmpp protocol state */ 49 uint32_t rmpp_retry_cnt; /* retry count */ 50 uint32_t rmpp_pkt_data_sz; /* data size in packet */ 51 uint32_t rmpp_last_pkt_sz; /* data size in last packet */ 52 uint32_t rmpp_num_pkts; /* number of packets needed */ 53 size_t rmpp_data_offset; /* offset in data buffer */ 54 uint32_t rmpp_word3; /* 3rd word of RMPP hdr */ 55 uint32_t rmpp_word4; /* 4th word of RMPP hdr */ 56 uint8_t rmpp_type; /* type of RMPP packet */ 57 uint8_t rmpp_respt; /* resp time for RMPP packet */ 58 uint8_t rmpp_flags; /* rmpp flags */ 59 uint8_t rmpp_status; /* status for RMPP packet */ 60 } ibmf_rmpp_ctx_t; 61 62 /* RMPP state definitions */ 63 #define IBMF_RMPP_STATE_UNDEFINED 0 64 #define IBMF_RMPP_STATE_SENDER_ACTIVE 1 65 #define IBMF_RMPP_STATE_SENDER_SWITCH 2 66 #define IBMF_RMPP_STATE_RECEVR_ACTIVE 3 67 #define IBMF_RMPP_STATE_RECEVR_TERMINATE 4 68 #define IBMF_RMPP_STATE_ABORT 5 69 #define IBMF_RMPP_STATE_DONE 6 70 71 /* RMPP context flags definition */ 72 #define IBMF_CTX_RMPP_FLAGS_DYN_PYLD 8 73 74 #define IBMF_RMPP_DEFAULT_RRESPT 0x1F 75 #define IBMF_RMPP_TERM_RRESPT 0xE 76 77 #define IBMF_RMPP_METHOD_RESP_BIT 0x80 78 79 /* RMPP header (IB Architecture Specification 1.1, Section 13.6.2) */ 80 #if defined(_BIT_FIELDS_HTOL) 81 typedef struct _ibmf_rmpp_hdr_t { 82 uint8_t rmpp_version; /* RMPP version = 1 */ 83 uint8_t rmpp_type; /* RMPP packet type */ 84 uint8_t rmpp_resp_time :5; /* response time val */ 85 uint8_t rmpp_flags :3; /* RMPP flags */ 86 uint8_t rmpp_status; /* RMPP status */ 87 88 uint32_t rmpp_segnum; /* packet ID */ 89 90 /* Payload len for data or, NewWindowLast for ack packets */ 91 uint32_t rmpp_pyldlen_nwl; 92 } ibmf_rmpp_hdr_t; 93 #else 94 typedef struct _ibmf_rmpp_hdr_t { 95 uint8_t rmpp_version; /* RMPP version = 1 */ 96 uint8_t rmpp_type; /* RMPP packet type */ 97 uint8_t rmpp_flags :3; /* RMPP flags */ 98 uint8_t rmpp_resp_time :5; /* response time val */ 99 uint8_t rmpp_status; /* RMPP status */ 100 101 uint32_t rmpp_segnum; /* packet ID */ 102 103 /* Payload len for data or, NewWindowLast for ack packets */ 104 uint32_t rmpp_pyldlen_nwl; 105 } ibmf_rmpp_hdr_t; 106 #endif 107 108 _NOTE(READ_ONLY_DATA(ibmf_rmpp_hdr_t)) 109 110 /* RMPP header type definitions */ 111 #define IBMF_RMPP_TYPE_NONE 0 112 #define IBMF_RMPP_TYPE_DATA 1 113 #define IBMF_RMPP_TYPE_ACK 2 114 #define IBMF_RMPP_TYPE_STOP 3 115 #define IBMF_RMPP_TYPE_ABORT 4 116 117 /* RMPP header flags definitions */ 118 #define IBMF_RMPP_FLAGS_ACTIVE 0x1 119 #define IBMF_RMPP_FLAGS_FIRST_PKT 0x2 120 #define IBMF_RMPP_FLAGS_LAST_PKT 0x4 121 122 /* RMPP_header status definitions */ 123 #define IBMF_RMPP_STATUS_NORMAL 0 /* Normal */ 124 #define IBMF_RMPP_STATUS_RESX 1 /* Resources exhausted */ 125 #define IBMF_RMPP_STATUS_T2L 118 /* Total time too long */ 126 127 /* Inconsistent last and payload length */ 128 #define IBMF_RMPP_STATUS_ILPL 119 129 130 /* Inconsistent first and segment number */ 131 #define IBMF_RMPP_STATUS_IFSN 120 132 133 #define IBMF_RMPP_STATUS_BADT 121 /* Bad RMPP type */ 134 #define IBMF_RMPP_STATUS_W2S 122 /* New window last too small */ 135 #define IBMF_RMPP_STATUS_S2B 123 /* Segment number too big */ 136 #define IBMF_RMPP_STATUS_IS 124 /* Illegal status */ 137 #define IBMF_RMPP_STATUS_UNV 125 /* Unsupported version */ 138 #define IBMF_RMPP_STATUS_TMR 126 /* Too many retries */ 139 #define IBMF_RMPP_STATUS_USP 127 /* Unspecified error */ 140 141 #define IBMF_RMPP_VERSION 1 142 #define IBMF_RMPP_DEFAULT_WIN_SZ 5 143 #define IBMF_NO_BLOCK 0 144 145 #ifdef __cplusplus 146 } 147 #endif 148 149 #endif /* _SYS_IB_MGT_IBMF_IBMF_RMPP_H */ 150