mars/mars_net.h

132 lines
3.6 KiB
C
Raw Normal View History

2011-02-23 20:48:06 +00:00
// (c) 2011 Thomas Schoebel-Theuer / 1&1 Internet AG
#ifndef MARS_NET_H
#define MARS_NET_H
#include <net/sock.h>
#include <net/ipconfig.h>
#include <net/tcp.h>
#include "brick.h"
2012-08-06 13:04:32 +00:00
extern bool mars_net_is_alive;
2012-11-29 15:29:36 +00:00
#define MAX_FIELD_LEN 32
#define MAX_DESC_CACHE 16
struct mars_desc_cache {
u64 cache_sender_cookie;
u64 cache_recver_cookie;
s32 cache_items;
};
struct mars_desc_item {
char field_name[MAX_FIELD_LEN];
s32 field_type;
s32 field_size;
s32 field_sender_offset;
s32 field_recver_offset;
};
/* The original struct socket has no refcount. This leads to problems
* during long-lasting system calls when racing with socket shutdown.
2012-08-06 13:04:32 +00:00
*
2012-11-29 15:29:36 +00:00
* The original idea of struct mars_socket was just a small wrapper
2012-08-06 13:04:32 +00:00
* adding a refcount and some debugging aid.
2012-11-29 15:29:36 +00:00
* Later, some buffering was added in order to take advantage of
2012-08-06 13:04:32 +00:00
* kernel_sendpage().
2012-11-29 15:29:36 +00:00
* Caching of meta description has also been added.
*/
struct mars_socket {
struct socket *s_socket;
2012-08-06 13:04:32 +00:00
void *s_buffer;
atomic_t s_count;
2012-08-06 13:04:32 +00:00
int s_pos;
int s_debug_nr;
bool s_shutdown_on_err;
2013-01-10 07:40:33 +00:00
bool s_alive;
2012-11-29 15:29:36 +00:00
struct mars_desc_cache *s_desc_send[MAX_DESC_CACHE];
struct mars_desc_cache *s_desc_recv[MAX_DESC_CACHE];
};
2011-08-31 11:42:04 +00:00
2011-02-23 20:48:06 +00:00
struct mars_tcp_params {
int tcp_timeout;
int window_size;
int tcp_keepcnt;
int tcp_keepintvl;
int tcp_keepidle;
char tos;
};
extern struct mars_tcp_params default_tcp_params;
enum {
CMD_NOP,
2012-01-17 14:37:14 +00:00
CMD_NOTIFY,
CMD_CONNECT,
2011-02-23 20:48:06 +00:00
CMD_GETINFO,
CMD_GETENTS,
CMD_MREF,
CMD_CB,
};
2012-08-01 10:09:49 +00:00
#define CMD_FLAG_MASK 255
#define CMD_FLAG_HAS_DATA 256
2011-02-23 20:48:06 +00:00
struct mars_cmd {
struct timespec cmd_stamp; // for automatic lamport clock
int cmd_code;
int cmd_int1;
//int cmd_int2;
//int cmd_int3;
char *cmd_str1;
//char *cmd_str2;
//char *cmd_str3;
};
extern const struct meta mars_cmd_meta[];
2011-07-22 10:43:40 +00:00
extern char *(*mars_translate_hostname)(const char *name);
2011-02-27 14:17:58 +00:00
2011-02-23 20:48:06 +00:00
/* Low-level network traffic
*/
extern int mars_create_sockaddr(struct sockaddr_storage *addr, const char *spec);
2011-08-31 11:42:04 +00:00
extern int mars_create_socket(struct mars_socket *msock, struct sockaddr_storage *addr, bool is_server);
2012-01-19 12:09:22 +00:00
extern int mars_accept_socket(struct mars_socket *new_msock, struct mars_socket *old_msock);
extern bool mars_get_socket(struct mars_socket *msock);
2011-08-31 11:42:04 +00:00
extern void mars_put_socket(struct mars_socket *msock);
extern void mars_shutdown_socket(struct mars_socket *msock);
extern bool mars_socket_is_alive(struct mars_socket *msock);
2012-11-29 15:29:36 +00:00
extern int mars_send_raw(struct mars_socket *msock, const void *buf, int len, bool cork);
extern int mars_recv_raw(struct mars_socket *msock, void *buf, int minlen, int maxlen);
2011-02-23 20:48:06 +00:00
/* Mid-level generic field data exchange
*/
2012-11-29 15:29:36 +00:00
extern int mars_send_struct(struct mars_socket *msock, const void *data, const struct meta *meta);
2011-08-25 10:16:32 +00:00
#define mars_recv_struct(_sock_,_data_,_meta_) \
({ \
2012-11-29 15:29:36 +00:00
_mars_recv_struct(_sock_, _data_, _meta_, __LINE__); \
2011-08-25 10:16:32 +00:00
})
2012-11-29 15:29:36 +00:00
extern int _mars_recv_struct(struct mars_socket *msock, void *data, const struct meta *meta, int line);
2011-02-23 20:48:06 +00:00
/* High-level transport of mars structures
*/
2011-08-31 11:42:04 +00:00
extern int mars_send_dent_list(struct mars_socket *msock, struct list_head *anchor);
extern int mars_recv_dent_list(struct mars_socket *msock, struct list_head *anchor);
2011-02-23 20:48:06 +00:00
2011-08-31 11:42:04 +00:00
extern int mars_send_mref(struct mars_socket *msock, struct mref_object *mref);
2012-08-01 10:09:49 +00:00
extern int mars_recv_mref(struct mars_socket *msock, struct mref_object *mref, struct mars_cmd *cmd);
2011-08-31 11:42:04 +00:00
extern int mars_send_cb(struct mars_socket *msock, struct mref_object *mref);
2012-08-01 10:09:49 +00:00
extern int mars_recv_cb(struct mars_socket *msock, struct mref_object *mref, struct mars_cmd *cmd);
2011-02-23 20:48:06 +00:00
2011-08-25 10:16:32 +00:00
/////////////////////////////////////////////////////////////////////////
// init
extern int init_mars_net(void);
extern void exit_mars_net(void);
2011-02-23 20:48:06 +00:00
#endif