Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /* packet.h: Rx packet layout and definitions
0003  *
0004  * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
0006  */
0007 
0008 #ifndef _LINUX_RXRPC_PACKET_H
0009 #define _LINUX_RXRPC_PACKET_H
0010 
0011 typedef u32 rxrpc_seq_t;    /* Rx message sequence number */
0012 typedef u32 rxrpc_serial_t; /* Rx message serial number */
0013 typedef __be32  rxrpc_seq_net_t; /* on-the-wire Rx message sequence number */
0014 typedef __be32  rxrpc_serial_net_t; /* on-the-wire Rx message serial number */
0015 
0016 /*****************************************************************************/
0017 /*
0018  * on-the-wire Rx packet header
0019  * - all multibyte fields should be in network byte order
0020  */
0021 struct rxrpc_wire_header {
0022     __be32      epoch;      /* client boot timestamp */
0023 #define RXRPC_RANDOM_EPOCH  0x80000000  /* Random if set, date-based if not */
0024 
0025     __be32      cid;        /* connection and channel ID */
0026 #define RXRPC_MAXCALLS      4           /* max active calls per conn */
0027 #define RXRPC_CHANNELMASK   (RXRPC_MAXCALLS-1)  /* mask for channel ID */
0028 #define RXRPC_CIDMASK       (~RXRPC_CHANNELMASK)    /* mask for connection ID */
0029 #define RXRPC_CIDSHIFT      ilog2(RXRPC_MAXCALLS)   /* shift for connection ID */
0030 #define RXRPC_CID_INC       (1 << RXRPC_CIDSHIFT)   /* connection ID increment */
0031 
0032     __be32      callNumber; /* call ID (0 for connection-level packets) */
0033     __be32      seq;        /* sequence number of pkt in call stream */
0034     __be32      serial;     /* serial number of pkt sent to network */
0035 
0036     uint8_t     type;       /* packet type */
0037 #define RXRPC_PACKET_TYPE_DATA      1   /* data */
0038 #define RXRPC_PACKET_TYPE_ACK       2   /* ACK */
0039 #define RXRPC_PACKET_TYPE_BUSY      3   /* call reject */
0040 #define RXRPC_PACKET_TYPE_ABORT     4   /* call/connection abort */
0041 #define RXRPC_PACKET_TYPE_ACKALL    5   /* ACK all outstanding packets on call */
0042 #define RXRPC_PACKET_TYPE_CHALLENGE 6   /* connection security challenge (SRVR->CLNT) */
0043 #define RXRPC_PACKET_TYPE_RESPONSE  7   /* connection secutity response (CLNT->SRVR) */
0044 #define RXRPC_PACKET_TYPE_DEBUG     8   /* debug info request */
0045 #define RXRPC_PACKET_TYPE_PARAMS    9   /* Parameter negotiation (unspec'd, ignore) */
0046 #define RXRPC_PACKET_TYPE_10        10  /* Ignored */
0047 #define RXRPC_PACKET_TYPE_11        11  /* Ignored */
0048 #define RXRPC_PACKET_TYPE_VERSION   13  /* version string request */
0049 
0050     uint8_t     flags;      /* packet flags */
0051 #define RXRPC_CLIENT_INITIATED  0x01        /* signifies a packet generated by a client */
0052 #define RXRPC_REQUEST_ACK   0x02        /* request an unconditional ACK of this packet */
0053 #define RXRPC_LAST_PACKET   0x04        /* the last packet from this side for this call */
0054 #define RXRPC_MORE_PACKETS  0x08        /* more packets to come */
0055 #define RXRPC_JUMBO_PACKET  0x20        /* [DATA] this is a jumbo packet */
0056 #define RXRPC_SLOW_START_OK 0x20        /* [ACK] slow start supported */
0057 
0058     uint8_t     userStatus; /* app-layer defined status */
0059 #define RXRPC_USERSTATUS_SERVICE_UPGRADE 0x01   /* AuriStor service upgrade request */
0060 
0061     uint8_t     securityIndex;  /* security protocol ID */
0062     union {
0063         __be16  _rsvd;      /* reserved */
0064         __be16  cksum;      /* kerberos security checksum */
0065     };
0066     __be16      serviceId;  /* service ID */
0067 
0068 } __packed;
0069 
0070 /*****************************************************************************/
0071 /*
0072  * jumbo packet secondary header
0073  * - can be mapped to read header by:
0074  *   - new_serial = serial + 1
0075  *   - new_seq = seq + 1
0076  *   - new_flags = j_flags
0077  *   - new__rsvd = j__rsvd
0078  *   - duplicating all other fields
0079  */
0080 struct rxrpc_jumbo_header {
0081     uint8_t     flags;      /* packet flags (as per rxrpc_header) */
0082     uint8_t     pad;
0083     union {
0084         __be16  _rsvd;      /* reserved */
0085         __be16  cksum;      /* kerberos security checksum */
0086     };
0087 };
0088 
0089 #define RXRPC_JUMBO_DATALEN 1412    /* non-terminal jumbo packet data length */
0090 #define RXRPC_JUMBO_SUBPKTLEN   (RXRPC_JUMBO_DATALEN + sizeof(struct rxrpc_jumbo_header))
0091 
0092 /*
0093  * The maximum number of subpackets that can possibly fit in a UDP packet is:
0094  *
0095  *  ((max_IP - IP_hdr - UDP_hdr) / RXRPC_JUMBO_SUBPKTLEN) + 1
0096  *  = ((65535 - 28 - 28) / 1416) + 1
0097  *  = 46 non-terminal packets and 1 terminal packet.
0098  */
0099 #define RXRPC_MAX_NR_JUMBO  47
0100 
0101 /*****************************************************************************/
0102 /*
0103  * on-the-wire Rx ACK packet data payload
0104  * - all multibyte fields should be in network byte order
0105  */
0106 struct rxrpc_ackpacket {
0107     __be16      bufferSpace;    /* number of packet buffers available */
0108     __be16      maxSkew;    /* diff between serno being ACK'd and highest serial no
0109                      * received */
0110     __be32      firstPacket;    /* sequence no of first ACK'd packet in attached list */
0111     __be32      previousPacket; /* sequence no of previous packet received */
0112     __be32      serial;     /* serial no of packet that prompted this ACK */
0113 
0114     uint8_t     reason;     /* reason for ACK */
0115 #define RXRPC_ACK_REQUESTED     1   /* ACK was requested on packet */
0116 #define RXRPC_ACK_DUPLICATE     2   /* duplicate packet received */
0117 #define RXRPC_ACK_OUT_OF_SEQUENCE   3   /* out of sequence packet received */
0118 #define RXRPC_ACK_EXCEEDS_WINDOW    4   /* packet received beyond end of ACK window */
0119 #define RXRPC_ACK_NOSPACE       5   /* packet discarded due to lack of buffer space */
0120 #define RXRPC_ACK_PING          6   /* keep alive ACK */
0121 #define RXRPC_ACK_PING_RESPONSE     7   /* response to RXRPC_ACK_PING */
0122 #define RXRPC_ACK_DELAY         8   /* nothing happened since received packet */
0123 #define RXRPC_ACK_IDLE          9   /* ACK due to fully received ACK window */
0124 #define RXRPC_ACK__INVALID      10  /* Representation of invalid ACK reason */
0125 
0126     uint8_t     nAcks;      /* number of ACKs */
0127 #define RXRPC_MAXACKS   255
0128 
0129     uint8_t     acks[0];    /* list of ACK/NAKs */
0130 #define RXRPC_ACK_TYPE_NACK     0
0131 #define RXRPC_ACK_TYPE_ACK      1
0132 
0133 } __packed;
0134 
0135 /* Some ACKs refer to specific packets and some are general and can be updated. */
0136 #define RXRPC_ACK_UPDATEABLE ((1 << RXRPC_ACK_REQUESTED)    |   \
0137                   (1 << RXRPC_ACK_PING_RESPONSE)    |   \
0138                   (1 << RXRPC_ACK_DELAY)        |   \
0139                   (1 << RXRPC_ACK_IDLE))
0140 
0141 
0142 /*
0143  * ACK packets can have a further piece of information tagged on the end
0144  */
0145 struct rxrpc_ackinfo {
0146     __be32      rxMTU;      /* maximum Rx MTU size (bytes) [AFS 3.3] */
0147     __be32      maxMTU;     /* maximum interface MTU size (bytes) [AFS 3.3] */
0148     __be32      rwind;      /* Rx window size (packets) [AFS 3.4] */
0149     __be32      jumbo_max;  /* max packets to stick into a jumbo packet [AFS 3.5] */
0150 };
0151 
0152 /*****************************************************************************/
0153 /*
0154  * Kerberos security type-2 challenge packet
0155  */
0156 struct rxkad_challenge {
0157     __be32      version;    /* version of this challenge type */
0158     __be32      nonce;      /* encrypted random number */
0159     __be32      min_level;  /* minimum security level */
0160     __be32      __padding;  /* padding to 8-byte boundary */
0161 } __packed;
0162 
0163 /*****************************************************************************/
0164 /*
0165  * Kerberos security type-2 response packet
0166  */
0167 struct rxkad_response {
0168     __be32      version;    /* version of this response type */
0169     __be32      __pad;
0170 
0171     /* encrypted bit of the response */
0172     struct {
0173         __be32      epoch;      /* current epoch */
0174         __be32      cid;        /* parent connection ID */
0175         __be32      checksum;   /* checksum */
0176         __be32      securityIndex;  /* security type */
0177         __be32      call_id[4]; /* encrypted call IDs */
0178         __be32      inc_nonce;  /* challenge nonce + 1 */
0179         __be32      level;      /* desired level */
0180     } encrypted;
0181 
0182     __be32      kvno;       /* Kerberos key version number */
0183     __be32      ticket_len; /* Kerberos ticket length  */
0184 } __packed;
0185 
0186 #endif /* _LINUX_RXRPC_PACKET_H */