diff options
Diffstat (limited to 'include/rxrpc/packet.h')
-rw-r--r-- | include/rxrpc/packet.h | 119 |
1 files changed, 103 insertions, 16 deletions
diff --git a/include/rxrpc/packet.h b/include/rxrpc/packet.h index 1447f0aaa0eb..b69e6e173ea1 100644 --- a/include/rxrpc/packet.h +++ b/include/rxrpc/packet.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* packet.h: Rx packet layout and definitions | 1 | /* packet.h: Rx packet layout and definitions |
2 | * | 2 | * |
3 | * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. | 3 | * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved. |
4 | * Written by David Howells (dhowells@redhat.com) | 4 | * Written by David Howells (dhowells@redhat.com) |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or | 6 | * This program is free software; you can redistribute it and/or |
@@ -12,28 +12,25 @@ | |||
12 | #ifndef _LINUX_RXRPC_PACKET_H | 12 | #ifndef _LINUX_RXRPC_PACKET_H |
13 | #define _LINUX_RXRPC_PACKET_H | 13 | #define _LINUX_RXRPC_PACKET_H |
14 | 14 | ||
15 | #include <rxrpc/types.h> | 15 | typedef u32 rxrpc_seq_t; /* Rx message sequence number */ |
16 | 16 | typedef u32 rxrpc_serial_t; /* Rx message serial number */ | |
17 | #define RXRPC_IPUDP_SIZE 28 | 17 | typedef __be32 rxrpc_seq_net_t; /* on-the-wire Rx message sequence number */ |
18 | extern size_t RXRPC_MAX_PACKET_SIZE; | 18 | typedef __be32 rxrpc_serial_net_t; /* on-the-wire Rx message serial number */ |
19 | #define RXRPC_MAX_PACKET_DATA_SIZE (RXRPC_MAX_PACKET_SIZE - sizeof(struct rxrpc_header)) | ||
20 | #define RXRPC_LOCAL_PACKET_SIZE RXRPC_MAX_PACKET_SIZE | ||
21 | #define RXRPC_REMOTE_PACKET_SIZE (576 - RXRPC_IPUDP_SIZE) | ||
22 | 19 | ||
23 | /*****************************************************************************/ | 20 | /*****************************************************************************/ |
24 | /* | 21 | /* |
25 | * on-the-wire Rx packet header | 22 | * on-the-wire Rx packet header |
26 | * - all multibyte fields should be in network byte order | 23 | * - all multibyte fields should be in network byte order |
27 | */ | 24 | */ |
28 | struct rxrpc_header | 25 | struct rxrpc_header { |
29 | { | ||
30 | __be32 epoch; /* client boot timestamp */ | 26 | __be32 epoch; /* client boot timestamp */ |
31 | 27 | ||
32 | __be32 cid; /* connection and channel ID */ | 28 | __be32 cid; /* connection and channel ID */ |
33 | #define RXRPC_MAXCALLS 4 /* max active calls per conn */ | 29 | #define RXRPC_MAXCALLS 4 /* max active calls per conn */ |
34 | #define RXRPC_CHANNELMASK (RXRPC_MAXCALLS-1) /* mask for channel ID */ | 30 | #define RXRPC_CHANNELMASK (RXRPC_MAXCALLS-1) /* mask for channel ID */ |
35 | #define RXRPC_CIDMASK (~RXRPC_CHANNELMASK) /* mask for connection ID */ | 31 | #define RXRPC_CIDMASK (~RXRPC_CHANNELMASK) /* mask for connection ID */ |
36 | #define RXRPC_CIDSHIFT 2 /* shift for connection ID */ | 32 | #define RXRPC_CIDSHIFT ilog2(RXRPC_MAXCALLS) /* shift for connection ID */ |
33 | #define RXRPC_CID_INC (1 << RXRPC_CIDSHIFT) /* connection ID increment */ | ||
37 | 34 | ||
38 | __be32 callNumber; /* call ID (0 for connection-level packets) */ | 35 | __be32 callNumber; /* call ID (0 for connection-level packets) */ |
39 | #define RXRPC_PROCESS_MAXCALLS (1<<2) /* maximum number of active calls per conn (power of 2) */ | 36 | #define RXRPC_PROCESS_MAXCALLS (1<<2) /* maximum number of active calls per conn (power of 2) */ |
@@ -62,7 +59,10 @@ struct rxrpc_header | |||
62 | 59 | ||
63 | uint8_t userStatus; /* app-layer defined status */ | 60 | uint8_t userStatus; /* app-layer defined status */ |
64 | uint8_t securityIndex; /* security protocol ID */ | 61 | uint8_t securityIndex; /* security protocol ID */ |
65 | __be16 _rsvd; /* reserved (used by kerberos security as cksum) */ | 62 | union { |
63 | __be16 _rsvd; /* reserved */ | ||
64 | __be16 cksum; /* kerberos security checksum */ | ||
65 | }; | ||
66 | __be16 serviceId; /* service ID */ | 66 | __be16 serviceId; /* service ID */ |
67 | 67 | ||
68 | } __attribute__((packed)); | 68 | } __attribute__((packed)); |
@@ -81,8 +81,7 @@ extern const char *rxrpc_pkts[]; | |||
81 | * - new__rsvd = j__rsvd | 81 | * - new__rsvd = j__rsvd |
82 | * - duplicating all other fields | 82 | * - duplicating all other fields |
83 | */ | 83 | */ |
84 | struct rxrpc_jumbo_header | 84 | struct rxrpc_jumbo_header { |
85 | { | ||
86 | uint8_t flags; /* packet flags (as per rxrpc_header) */ | 85 | uint8_t flags; /* packet flags (as per rxrpc_header) */ |
87 | uint8_t pad; | 86 | uint8_t pad; |
88 | __be16 _rsvd; /* reserved (used by kerberos security as cksum) */ | 87 | __be16 _rsvd; /* reserved (used by kerberos security as cksum) */ |
@@ -95,8 +94,7 @@ struct rxrpc_jumbo_header | |||
95 | * on-the-wire Rx ACK packet data payload | 94 | * on-the-wire Rx ACK packet data payload |
96 | * - all multibyte fields should be in network byte order | 95 | * - all multibyte fields should be in network byte order |
97 | */ | 96 | */ |
98 | struct rxrpc_ackpacket | 97 | struct rxrpc_ackpacket { |
99 | { | ||
100 | __be16 bufferSpace; /* number of packet buffers available */ | 98 | __be16 bufferSpace; /* number of packet buffers available */ |
101 | __be16 maxSkew; /* diff between serno being ACK'd and highest serial no | 99 | __be16 maxSkew; /* diff between serno being ACK'd and highest serial no |
102 | * received */ | 100 | * received */ |
@@ -124,4 +122,93 @@ struct rxrpc_ackpacket | |||
124 | 122 | ||
125 | } __attribute__((packed)); | 123 | } __attribute__((packed)); |
126 | 124 | ||
125 | /* | ||
126 | * ACK packets can have a further piece of information tagged on the end | ||
127 | */ | ||
128 | struct rxrpc_ackinfo { | ||
129 | __be32 rxMTU; /* maximum Rx MTU size (bytes) [AFS 3.3] */ | ||
130 | __be32 maxMTU; /* maximum interface MTU size (bytes) [AFS 3.3] */ | ||
131 | __be32 rwind; /* Rx window size (packets) [AFS 3.4] */ | ||
132 | __be32 jumbo_max; /* max packets to stick into a jumbo packet [AFS 3.5] */ | ||
133 | }; | ||
134 | |||
135 | /*****************************************************************************/ | ||
136 | /* | ||
137 | * Kerberos security type-2 challenge packet | ||
138 | */ | ||
139 | struct rxkad_challenge { | ||
140 | __be32 version; /* version of this challenge type */ | ||
141 | __be32 nonce; /* encrypted random number */ | ||
142 | __be32 min_level; /* minimum security level */ | ||
143 | __be32 __padding; /* padding to 8-byte boundary */ | ||
144 | } __attribute__((packed)); | ||
145 | |||
146 | /*****************************************************************************/ | ||
147 | /* | ||
148 | * Kerberos security type-2 response packet | ||
149 | */ | ||
150 | struct rxkad_response { | ||
151 | __be32 version; /* version of this reponse type */ | ||
152 | __be32 __pad; | ||
153 | |||
154 | /* encrypted bit of the response */ | ||
155 | struct { | ||
156 | __be32 epoch; /* current epoch */ | ||
157 | __be32 cid; /* parent connection ID */ | ||
158 | __be32 checksum; /* checksum */ | ||
159 | __be32 securityIndex; /* security type */ | ||
160 | __be32 call_id[4]; /* encrypted call IDs */ | ||
161 | __be32 inc_nonce; /* challenge nonce + 1 */ | ||
162 | __be32 level; /* desired level */ | ||
163 | } encrypted; | ||
164 | |||
165 | __be32 kvno; /* Kerberos key version number */ | ||
166 | __be32 ticket_len; /* Kerberos ticket length */ | ||
167 | } __attribute__((packed)); | ||
168 | |||
169 | /*****************************************************************************/ | ||
170 | /* | ||
171 | * RxRPC-level abort codes | ||
172 | */ | ||
173 | #define RX_CALL_DEAD -1 /* call/conn has been inactive and is shut down */ | ||
174 | #define RX_INVALID_OPERATION -2 /* invalid operation requested / attempted */ | ||
175 | #define RX_CALL_TIMEOUT -3 /* call timeout exceeded */ | ||
176 | #define RX_EOF -4 /* unexpected end of data on read op */ | ||
177 | #define RX_PROTOCOL_ERROR -5 /* low-level protocol error */ | ||
178 | #define RX_USER_ABORT -6 /* generic user abort */ | ||
179 | #define RX_ADDRINUSE -7 /* UDP port in use */ | ||
180 | #define RX_DEBUGI_BADTYPE -8 /* bad debugging packet type */ | ||
181 | |||
182 | /* | ||
183 | * (un)marshalling abort codes (rxgen) | ||
184 | */ | ||
185 | #define RXGEN_CC_MARSHAL -450 | ||
186 | #define RXGEN_CC_UNMARSHAL -451 | ||
187 | #define RXGEN_SS_MARSHAL -452 | ||
188 | #define RXGEN_SS_UNMARSHAL -453 | ||
189 | #define RXGEN_DECODE -454 | ||
190 | #define RXGEN_OPCODE -455 | ||
191 | #define RXGEN_SS_XDRFREE -456 | ||
192 | #define RXGEN_CC_XDRFREE -457 | ||
193 | |||
194 | /* | ||
195 | * Rx kerberos security abort codes | ||
196 | * - unfortunately we have no generalised security abort codes to say things | ||
197 | * like "unsupported security", so we have to use these instead and hope the | ||
198 | * other side understands | ||
199 | */ | ||
200 | #define RXKADINCONSISTENCY 19270400 /* security module structure inconsistent */ | ||
201 | #define RXKADPACKETSHORT 19270401 /* packet too short for security challenge */ | ||
202 | #define RXKADLEVELFAIL 19270402 /* security level negotiation failed */ | ||
203 | #define RXKADTICKETLEN 19270403 /* ticket length too short or too long */ | ||
204 | #define RXKADOUTOFSEQUENCE 19270404 /* packet had bad sequence number */ | ||
205 | #define RXKADNOAUTH 19270405 /* caller not authorised */ | ||
206 | #define RXKADBADKEY 19270406 /* illegal key: bad parity or weak */ | ||
207 | #define RXKADBADTICKET 19270407 /* security object was passed a bad ticket */ | ||
208 | #define RXKADUNKNOWNKEY 19270408 /* ticket contained unknown key version number */ | ||
209 | #define RXKADEXPIRED 19270409 /* authentication expired */ | ||
210 | #define RXKADSEALEDINCON 19270410 /* sealed data inconsistent */ | ||
211 | #define RXKADDATALEN 19270411 /* user data too long */ | ||
212 | #define RXKADILLEGALLEVEL 19270412 /* caller not authorised to use encrypted conns */ | ||
213 | |||
127 | #endif /* _LINUX_RXRPC_PACKET_H */ | 214 | #endif /* _LINUX_RXRPC_PACKET_H */ |