#endif
#endif /* KERNEL */
-#include "rx_queue.h"
+#include <opr/queue.h>
+
#include "rx_clock.h"
#include "rx_event.h"
#include "rx_misc.h"
/* Connection management */
-extern void rx_SetConnectionEpoch(struct rx_connection *conn, int epoch);
-extern int rx_GetConnectionEpoch(struct rx_connection *conn);
-extern void rx_SetConnectionId(struct rx_connection *conn, int id);
-extern int rx_GetConnectionId(struct rx_connection *conn);
+extern afs_uint32 rx_GetConnectionEpoch(struct rx_connection *conn);
+extern afs_uint32 rx_GetConnectionId(struct rx_connection *conn);
extern void *rx_GetSecurityData(struct rx_connection *conn);
extern void rx_SetSecurityData(struct rx_connection *conn, void *data);
extern int rx_IsUsingPktCksum(struct rx_connection *conn);
-extern void rx_SetSecurityHeaderSize(struct rx_connection *conn, int size);
-extern int rx_GetSecurityHeaderSize(struct rx_connection *conn);
-extern void rx_SetSecurityMaxTrailerSize(struct rx_connection *conn, int size);
-extern int rx_GetSecurityMaxTrailerSize(struct rx_connection *conn);
+extern void rx_SetSecurityHeaderSize(struct rx_connection *conn, afs_uint32 size);
+extern afs_uint32 rx_GetSecurityHeaderSize(struct rx_connection *conn);
+extern void rx_SetSecurityMaxTrailerSize(struct rx_connection *conn, afs_uint32 size);
+extern afs_uint32 rx_GetSecurityMaxTrailerSize(struct rx_connection *conn);
extern void rx_SetMsgsizeRetryErr(struct rx_connection *conn, int err);
extern int rx_IsServerConn(struct rx_connection *conn);
extern int rx_IsClientConn(struct rx_connection *conn);
unsigned int totalFunc,
int isServer);
+extern void rx_GetCallStatus(struct rx_call *call,
+ afs_int32 *readNext,
+ afs_int32 *transmitNext,
+ int *lastSendTime,
+ int *lastReceiveTime);
/* Peer management */
extern afs_uint32 rx_HostOf(struct rx_peer *peer);
extern u_short rx_PortOf(struct rx_peer *peer);
#define RX_CALL_IOVEC_WAIT 16384 /* waiting thread is using an iovec */
#define RX_CALL_HAVE_LAST 32768 /* Last packet has been received */
#define RX_CALL_NEED_START 0x10000 /* tells rxi_Start to start again */
-#define RX_CALL_PEER_BUSY 0x20000 /* the last packet we received on this call was a
- * BUSY packet; i.e. the channel for this call is busy */
+/* 0x20000 was RX_CALL_PEER_BUSY */
#define RX_CALL_ACKALL_SENT 0x40000 /* ACKALL has been sent on the call */
-
+#define RX_CALL_FLUSH 0x80000 /* Transmit queue should be flushed to peer */
#endif
/* Define procedure to set service dead time */
#define rx_SetIdleDeadTime(service,time) ((service)->idleDeadTime = (time))
-/*
- * Define error to return in server connections when failing to answer.
- * (server only) For example, AFS viced sends VNOSERVICE.
- */
-#define rx_SetServerIdleDeadErr(service,err) ((service)->idleDeadErr = (err))
-
/* Define procedures for getting and setting before and after execute-request procs */
#define rx_SetAfterProc(service,proc) ((service)->afterProc = (proc))
#define rx_SetBeforeProc(service,proc) ((service)->beforeProc = (proc))
u_short connDeadTime; /* Seconds until a client of this service will be declared dead, if it is not responding */
u_short idleDeadTime; /* Time a server will wait for I/O to start up again */
u_char checkReach; /* Check for asymmetric clients? */
- afs_int32 idleDeadErr;
int nSpecific; /* number entries in specific data */
void **specific; /* pointer to connection specific data */
#ifdef RX_ENABLE_LOCKS
#define RX_CHECKREACH_TTL 60 /* Re-check reachability this often */
/*
+ * rx_GetNetworkError 'origin' constants. These define the meaning of the
+ * 'type' and 'code' values returned by rx_GetNetworkError.
+ */
+
+/* Used for ICMP errors; the type and code are the ICMP type and code,
+ * respectively */
+#define RX_NETWORK_ERROR_ORIGIN_ICMP (0)
+
+/*
* RX error codes. RX uses error codes from -1 to -64 and -100.
* Rxgen uses other error codes < -64 (see src/rxgen/rpc_errors.h);
* user programs are expected to return positive error codes
/* EMSGSIZE returned from network. Packet too big, must fragment */
#define RX_MSGSIZE (-8)
-/*
- * Idle dead timeout error. This error is never sent on the wire.
- * rxi_SendCallAbort() translates RX_CALL_IDLE to RX_CALL_TIMEOUT.
- */
-#define RX_CALL_IDLE (-9)
+/* The value -9 was previously used for RX_CALL_IDLE but is now free for
+ * reuse. */
-/*
- * Busy call channel error. This error is never sent on the wire.
- * rxi_SendCallAbort() translates RX_CALL_BUSY to RX_CALL_TIMEOUT.
- */
-#define RX_CALL_BUSY (-10)
+/* The value -10 was previously used for RX_CALL_BUSY but is now free for
+ * reuse. */
/* transient failure detected ( possibly the server is restarting ) */
/* this should be equal to VRESTARTING ( util/errors.h ) for old clients to work */
#define RX_RESTARTING (-100)
typedef enum {
- RX_SECIDX_NULL = 0,
- RX_SECIDX_KAD = 2,
- RX_SECIDX_GK = 4,
- RX_SECIDX_K5 = 5,
+ RX_SECIDX_NULL = 0, /** rxnull, no security. */
+ RX_SECIDX_VAB = 1, /** vice tokens with bcrypt. Unused. */
+ RX_SECIDX_KAD = 2, /** kerberos/DES. */
+ RX_SECIDX_KAE = 3, /** rxkad, but always encrypt. */
+ RX_SECIDX_GK = 4, /** rxgk, RFC 3961 crypto. */
+ RX_SECIDX_K5 = 5, /** kerberos 5 tickets as tokens. */
} rx_securityIndex;
+/*
+ * We use an enum for the symbol definitions but have no need for a typedef
+ * because the enum is at least as wide as 'int' and these have to fit into
+ * a field of type 'char'. Direct assigment will do the right thing if the
+ * enum value fits into that type.
+ */
+enum {
+ RX_SECTYPE_UNK = 0,
+ RX_SECTYPE_NULL = 1,
+ RX_SECTYPE_VAB = 2,
+ RX_SECTYPE_KAD = 3,
+ RX_SECTYPE_GK = 4,
+};
struct rx_securityObjectStats {
- char type; /* 0:unk 1:null,2:vab 3:kad */
+ char type; /* An RX_SECTYPE_* value */
char level;
char sparec[10]; /* force correct alignment */
afs_int32 flags; /* 1=>unalloc, 2=>auth, 4=>expired */
int (*op_CheckPacket) (struct rx_securityClass * aobj,
struct rx_call * acall,
struct rx_packet * apacket);
- int (*op_DestroyConnection) (struct rx_securityClass * aobj,
- struct rx_connection * aconn);
+ void (*op_DestroyConnection) (struct rx_securityClass * aobj,
+ struct rx_connection * aconn);
int (*op_GetStats) (struct rx_securityClass * aobj,
struct rx_connection * aconn,
struct rx_securityObjectStats * astats);
};
#define RXS_OP(obj,op,args) ((obj && (obj->ops->op_ ## op)) ? (*(obj)->ops->op_ ## op)args : 0)
+#define RXS_OP_VOID(obj,op,args) do { \
+ if (obj && (obj->ops->op_ ## op)) \
+ (*(obj)->ops->op_ ## op)args; \
+} while (0)
#define RXS_Close(obj) RXS_OP(obj,Close,(obj))
#define RXS_NewConnection(obj,conn) RXS_OP(obj,NewConnection,(obj,conn))
#define RXS_GetResponse(obj,conn,packet) RXS_OP(obj,GetResponse,(obj,conn,packet))
#define RXS_CheckResponse(obj,conn,packet) RXS_OP(obj,CheckResponse,(obj,conn,packet))
#define RXS_CheckPacket(obj,call,packet) RXS_OP(obj,CheckPacket,(obj,call,packet))
-#define RXS_DestroyConnection(obj,conn) RXS_OP(obj,DestroyConnection,(obj,conn))
+#define RXS_DestroyConnection(obj,conn) RXS_OP_VOID(obj,DestroyConnection,(obj,conn))
#define RXS_GetStats(obj,conn,stats) RXS_OP(obj,GetStats,(obj,conn,stats))
#define RXS_SetConfiguration(obj, conn, type, value, currentValue) RXS_OP(obj, SetConfiguration,(obj,conn,type,value,currentValue))
#define RX_STATS_RETRIEVAL_FIRST_EDITION 1 /* first implementation */
typedef struct rx_interface_stat {
- struct rx_queue queue_header;
- struct rx_queue all_peers;
+ struct opr_queue entry;
+ struct opr_queue entryPeers;
rx_function_entry_v1_t stats[1]; /* make sure this is aligned correctly */
} rx_interface_stat_t, *rx_interface_stat_p;