/*
* Copyright 2006-2008, Sine Nomine Associates and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
*/
#ifndef _AFS_VOL_DAEMON_COM_H
-#define _AFS_VOL_DAEMON_COM_H
+#define _AFS_VOL_DAEMON_COM_H 1
-/*
+/*
* SYNC protocol constants
*/
#define SYNC_COM_CODE_USER_BASE 65536
#define SYNC_COM_CODE_DECL(code) (SYNC_COM_CODE_USER_BASE+(code))
-/**
+/**
* general command codes.
*/
enum SYNCOpCode {
SYNC_COM_CHANNEL_CLOSE = 0, /**< request sync channel shutdown */
+ SYNC_OP_CODE_END
};
/* SYNC protocol response codes
*
- * response codes 0-65535 are reserved for
+ * response codes 0-65535 are reserved for
* global SYNC package response codes
*/
#define SYNC_RES_CODE_USER_BASE 65536
SYNC_COM_ERROR = 2, /**< sync protocol communicaions error */
SYNC_BAD_COMMAND = 3, /**< sync command code not implemented by server */
SYNC_FAILED = 4, /**< sync server-side procedure failed */
+ SYNC_RESPONSE_CODE_END
};
/* SYNC protocol reason codes
/* general reason codes */
#define SYNC_REASON_NONE 0
-#define SYNC_REASON_MALFORMED_PACKET 1
-#define SYNC_REASON_NOMEM 2
+#define SYNC_REASON_MALFORMED_PACKET 1 /**< command packet was malformed */
+#define SYNC_REASON_NOMEM 2 /**< sync server out of memory */
#define SYNC_REASON_ENCODING_ERROR 3
+#define SYNC_REASON_PAYLOAD_TOO_BIG 4 /**< payload too big for response packet buffer */
/* SYNC protocol flags
*
afs_int64 _##buf##_l[SYNC_PROTO_MAX_LEN/sizeof(afs_int64)]; \
char * buf = (char *)(_##buf##_l)
+#ifdef AFS_LINUX26_ENV
+/* Some Linux kernels have a bug where we are not woken up immediately from a
+ * select() when data is available. Work around this by having a low select()
+ * timeout, so we don't hang in those situations. */
+# define SYNC_SELECT_TIMEOUT 10
+#else
+# define SYNC_SELECT_TIMEOUT 86400
+#endif
+
#ifdef USE_UNIX_SOCKETS
#include <afs/afsutil.h>
#include <sys/un.h>
* SYNC server state structure.
*/
typedef struct SYNC_server_state {
- int fd; /**< listening socket descriptor */
+ osi_socket fd; /**< listening socket descriptor */
SYNC_endpoint_t endpoint; /**< server endpoint address */
afs_uint32 proto_version; /**< our protocol version */
int bind_retry_limit; /**< upper limit on times to retry socket bind() */
int listen_depth; /**< socket listen queue depth */
char * proto_name; /**< sync protocol associated with this conn */
SYNC_sockaddr_t addr; /**< server listen socket sockaddr */
+ afs_uint32 pkt_seq; /**< packet xmit sequence counter */
+ afs_uint32 res_seq; /**< response xmit sequence counter */
} SYNC_server_state_t;
/**
* SYNC client state structure.
*/
typedef struct SYNC_client_state {
- int fd; /**< client socket descriptor */
+ osi_socket fd; /**< client socket descriptor */
SYNC_endpoint_t endpoint; /**< address of sync server */
afs_uint32 proto_version; /**< our protocol version */
int retry_limit; /**< max number of times for SYNC_ask to retry */
afs_int32 hard_timeout; /**< upper limit on time to keep trying */
char * proto_name; /**< sync protocol associated with this conn */
- byte fatal_error; /**< nonzer if fatal error on this client conn */
+ afs_uint32 pkt_seq; /**< packet xmit sequence counter */
+ afs_uint32 com_seq; /**< command xmit sequence counter */
} SYNC_client_state;
/* wire types */
+/**
+ * on-wire command packet header.
+ */
typedef struct SYNC_command_hdr {
- afs_uint32 proto_version; /* sync protocol version */
- afs_int32 programType; /* type of program issuing the request */
- afs_int32 command; /* request type */
- afs_int32 reason; /* reason for request */
- afs_uint32 command_len; /* entire length of command */
- afs_uint32 flags;
+ afs_uint32 proto_version; /**< sync protocol version */
+ afs_uint32 pkt_seq; /**< packet sequence number */
+ afs_uint32 com_seq; /**< command sequence number */
+ afs_int32 programType; /**< type of program issuing the request */
+ afs_int32 pid; /**< pid of requestor */
+ afs_int32 tid; /**< thread id of requestor */
+ afs_int32 command; /**< request type */
+ afs_int32 reason; /**< reason for request */
+ afs_uint32 command_len; /**< entire length of command */
+ afs_uint32 flags; /**< miscellanous control flags */
} SYNC_command_hdr;
+/**
+ * on-wire response packet header.
+ */
typedef struct SYNC_response_hdr {
- afs_uint32 proto_version; /* sync protocol version */
- afs_uint32 response_len; /* entire length of response */
- afs_int32 response; /* response code */
- afs_int32 reason; /* reason for response */
- afs_uint32 flags;
+ afs_uint32 proto_version; /**< sync protocol version */
+ afs_uint32 pkt_seq; /**< packet sequence number */
+ afs_uint32 com_seq; /**< in response to com_seq... */
+ afs_uint32 res_seq; /**< response sequence number */
+ afs_uint32 response_len; /**< entire length of response */
+ afs_int32 response; /**< response code */
+ afs_int32 reason; /**< reason for response */
+ afs_uint32 flags; /**< miscellanous control flags */
} SYNC_response_hdr;
} SYNC_response;
/* general prototypes */
-extern int SYNC_getSock(SYNC_endpoint_t * endpoint);
+extern osi_socket SYNC_getSock(SYNC_endpoint_t * endpoint);
extern void SYNC_getAddr(SYNC_endpoint_t * endpoint, SYNC_sockaddr_t * addr);
/* client-side prototypes */
extern int SYNC_reconnect(SYNC_client_state *); /* do a reconnect after a protocol error, or from a forked child */
/* server-side prototypes */
-extern int SYNC_getCom(int fd, SYNC_command * com);
-extern int SYNC_putRes(int fd, SYNC_response * res);
+extern int SYNC_getCom(SYNC_server_state_t *, osi_socket fd, SYNC_command * com);
+extern int SYNC_putRes(SYNC_server_state_t *, osi_socket fd, SYNC_response * res);
extern int SYNC_verifyProtocolString(char * buf, size_t len);
extern void SYNC_cleanupSock(SYNC_server_state_t * state);
extern int SYNC_bindSock(SYNC_server_state_t * state);