CScpp/CS.h
author hh
Thu, 21 Nov 2019 14:55:10 +0100
changeset 0 5c129dd80d4f
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
#ifndef _CSH_
hh
parents:
diff changeset
     2
#define _CSH_ 1
hh
parents:
diff changeset
     3
hh
parents:
diff changeset
     4
using namespace std;
hh
parents:
diff changeset
     5
#include <string>
hh
parents:
diff changeset
     6
#include <iostream>
hh
parents:
diff changeset
     7
#include <thread>
hh
parents:
diff changeset
     8
#include <string.h>
hh
parents:
diff changeset
     9
#include <stdlib.h>
hh
parents:
diff changeset
    10
#include <stdio.h>
hh
parents:
diff changeset
    11
#include <unistd.h>
hh
parents:
diff changeset
    12
#include <signal.h>
hh
parents:
diff changeset
    13
#include <errno.h>
hh
parents:
diff changeset
    14
#include <time.h>
hh
parents:
diff changeset
    15
#include <sys/types.h>
hh
parents:
diff changeset
    16
#include <sys/socket.h>
hh
parents:
diff changeset
    17
#include <netdb.h>
hh
parents:
diff changeset
    18
#include <sys/time.h>
hh
parents:
diff changeset
    19
#include <openssl/ssl.h>
hh
parents:
diff changeset
    20
#include <openssl/bio.h>
hh
parents:
diff changeset
    21
#include <openssl/err.h>
hh
parents:
diff changeset
    22
#include <sys/wait.h>
hh
parents:
diff changeset
    23
#include <sys/select.h>
hh
parents:
diff changeset
    24
#include <sys/mman.h>
hh
parents:
diff changeset
    25
#include <semaphore.h>
hh
parents:
diff changeset
    26
#include <libgen.h>
hh
parents:
diff changeset
    27
#include <math.h>
hh
parents:
diff changeset
    28
#include "Debug.h"
hh
parents:
diff changeset
    29
hh
parents:
diff changeset
    30
typedef struct ShareS {			// shared items between procs or threads
hh
parents:
diff changeset
    31
	int conns;						// overall connections# both in ring and mash
hh
parents:
diff changeset
    32
	int msgs;						// overall forwards#	   both in ring and mash
hh
parents:
diff changeset
    33
	int act;							//	active nodes#		   both in ring and mash
hh
parents:
diff changeset
    34
	sem_t counterSem;				// semaphore for counters
hh
parents:
diff changeset
    35
} ShareT, *ShareP;
hh
parents:
diff changeset
    36
#define ShareA(v) if((v = (ShareP) mmap(NULL, sizeof(ShareT), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)) < 0) SYSERR("mmap")
hh
parents:
diff changeset
    37
hh
parents:
diff changeset
    38
typedef struct CSS {				// top level attributes
hh
parents:
diff changeset
    39
	string text;					// text to be sent in messages
hh
parents:
diff changeset
    40
	int ttl;							// TTL for circulating msgs
hh
parents:
diff changeset
    41
	int mp0;							// TCP port of first mash node
hh
parents:
diff changeset
    42
	int mn;							// intended # of nodes in mash
hh
parents:
diff changeset
    43
	int rp0;							// TCP port of first ring node
hh
parents:
diff changeset
    44
	int rn;							// intended # of nodes in ring
hh
parents:
diff changeset
    45
   struct timespec pace;		// pacing time quantum
hh
parents:
diff changeset
    46
   int pacing;						// pacing indicator
hh
parents:
diff changeset
    47
	int issl;						// ssl switch: 0=no_ssl, 1=ssl, 2=both
hh
parents:
diff changeset
    48
	int connThreshold;			// connection retry threshhold
hh
parents:
diff changeset
    49
	int connTO;						// connection timeout in usecs
hh
parents:
diff changeset
    50
	int selTO;						// selection timeout in secs
hh
parents:
diff changeset
    51
	string cePath;					// SSL certs path
hh
parents:
diff changeset
    52
	string caPath;					// CA  certs path
hh
parents:
diff changeset
    53
	ShareP shP;
hh
parents:
diff changeset
    54
	CSS(DebugP, char*);
hh
parents:
diff changeset
    55
} *CSP;
hh
parents:
diff changeset
    56
hh
parents:
diff changeset
    57
typedef struct HeaderS {		// container header
hh
parents:
diff changeset
    58
	int ttl;
hh
parents:
diff changeset
    59
	int ts;
hh
parents:
diff changeset
    60
	int remPort;
hh
parents:
diff changeset
    61
hh
parents:
diff changeset
    62
	HeaderS();
hh
parents:
diff changeset
    63
	HeaderS(int);
hh
parents:
diff changeset
    64
	int len();
hh
parents:
diff changeset
    65
} *HeaderP;
hh
parents:
diff changeset
    66
hh
parents:
diff changeset
    67
typedef struct PayloadS {		// payload structure
hh
parents:
diff changeset
    68
	time_t ts;
hh
parents:
diff changeset
    69
	char text;
hh
parents:
diff changeset
    70
hh
parents:
diff changeset
    71
	PayloadS();
hh
parents:
diff changeset
    72
	PayloadS(const char *);
hh
parents:
diff changeset
    73
	int check(PayloadS*);
hh
parents:
diff changeset
    74
	char *deliver();
hh
parents:
diff changeset
    75
	string digest();
hh
parents:
diff changeset
    76
	void sabotage();
hh
parents:
diff changeset
    77
	int len();
hh
parents:
diff changeset
    78
} *PayloadP;
hh
parents:
diff changeset
    79
hh
parents:
diff changeset
    80
typedef struct ContainerS {	// data container sent throug mash or ring
hh
parents:
diff changeset
    81
	HeaderS hdr;
hh
parents:
diff changeset
    82
	PayloadS payl;
hh
parents:
diff changeset
    83
	int len();
hh
parents:
diff changeset
    84
} ContainerT, *ContainerP;
hh
parents:
diff changeset
    85
hh
parents:
diff changeset
    86
typedef class DataC {			// data sent and received
hh
parents:
diff changeset
    87
public:
hh
parents:
diff changeset
    88
	DebugP deP;
hh
parents:
diff changeset
    89
	ContainerP contP;
hh
parents:
diff changeset
    90
	int dataLen;
hh
parents:
diff changeset
    91
//	int transferLen;
hh
parents:
diff changeset
    92
hh
parents:
diff changeset
    93
	DataC();
hh
parents:
diff changeset
    94
	DataC(DebugP);
hh
parents:
diff changeset
    95
	int dttl();
hh
parents:
diff changeset
    96
	int ttl();
hh
parents:
diff changeset
    97
	void load(int, const char*);
hh
parents:
diff changeset
    98
	string unld();
hh
parents:
diff changeset
    99
	string digest();
hh
parents:
diff changeset
   100
	bool dataOk();
hh
parents:
diff changeset
   101
	int ts();
hh
parents:
diff changeset
   102
	int remPort();
hh
parents:
diff changeset
   103
	int remPort(int);
hh
parents:
diff changeset
   104
} *DataP;
hh
parents:
diff changeset
   105
hh
parents:
diff changeset
   106
typedef struct SocketS {		// info about sockets allocated in node
hh
parents:
diff changeset
   107
	int remPort;
hh
parents:
diff changeset
   108
	int sc;
hh
parents:
diff changeset
   109
	SSL *sslP;
hh
parents:
diff changeset
   110
} *SocketP;
hh
parents:
diff changeset
   111
hh
parents:
diff changeset
   112
typedef enum{ring, mash} topology;
hh
parents:
diff changeset
   113
typedef enum{client, server} nodeside;
hh
parents:
diff changeset
   114
class ConstellationC {			// constellation of communication nodes (mash or ring)
hh
parents:
diff changeset
   115
	DebugP deP;
hh
parents:
diff changeset
   116
public:
hh
parents:
diff changeset
   117
	topology topo;
hh
parents:
diff changeset
   118
	int ssl, first, nodes, *forwP;
hh
parents:
diff changeset
   119
hh
parents:
diff changeset
   120
	ConstellationC();
hh
parents:
diff changeset
   121
	ConstellationC(topology, int);
hh
parents:
diff changeset
   122
	int run();
hh
parents:
diff changeset
   123
};
hh
parents:
diff changeset
   124
typedef ConstellationC *ConstellationP;
hh
parents:
diff changeset
   125
hh
parents:
diff changeset
   126
class NodeC : public ConstellationC {	// attributes and operations of one node of constellation (mash or ring)
hh
parents:
diff changeset
   127
public:
hh
parents:
diff changeset
   128
	DebugP deP;
hh
parents:
diff changeset
   129
	int locPort;
hh
parents:
diff changeset
   130
	int last;
hh
parents:
diff changeset
   131
	int kicker;
hh
parents:
diff changeset
   132
	int closing;
hh
parents:
diff changeset
   133
	thread closingThread;		// thread to close client side sockets
hh
parents:
diff changeset
   134
	DataC data;
hh
parents:
diff changeset
   135
	int len;
hh
parents:
diff changeset
   136
	int ssc;
hh
parents:
diff changeset
   137
	SocketP cliSides;
hh
parents:
diff changeset
   138
	SocketP srvSides;
hh
parents:
diff changeset
   139
	SSL_CTX *ctxP;
hh
parents:
diff changeset
   140
hh
parents:
diff changeset
   141
	NodeC(ConstellationP, int);
hh
parents:
diff changeset
   142
	int run();
hh
parents:
diff changeset
   143
	void mainLoop();
hh
parents:
diff changeset
   144
	void bindN();
hh
parents:
diff changeset
   145
	void conn(int, int);
hh
parents:
diff changeset
   146
	void acc(int);
hh
parents:
diff changeset
   147
	void closeSocket(int, nodeside);
hh
parents:
diff changeset
   148
	int getN(int);
hh
parents:
diff changeset
   149
	int readN(int);
hh
parents:
diff changeset
   150
	int putN(int);
hh
parents:
diff changeset
   151
	int writeN(int);
hh
parents:
diff changeset
   152
	int next_node();
hh
parents:
diff changeset
   153
	void forward(int);
hh
parents:
diff changeset
   154
	void closeClients();
hh
parents:
diff changeset
   155
};
hh
parents:
diff changeset
   156
typedef NodeC *NodeP;
hh
parents:
diff changeset
   157
hh
parents:
diff changeset
   158
extern char *gpa(struct sockaddr *);
hh
parents:
diff changeset
   159
extern void gai(int, struct addrinfo *ai, DebugP);
hh
parents:
diff changeset
   160
#define GAI(level, ai) gai(level, ai, deP)
hh
parents:
diff changeset
   161
extern void ssl_err(char*);
hh
parents:
diff changeset
   162
extern void abend();
hh
parents:
diff changeset
   163
hh
parents:
diff changeset
   164
#define SYSERR(e) LOG(0, "%s: %s (%d)", (char*)e, strerror(errno), errno), abend(deP)
hh
parents:
diff changeset
   165
#define SSLERR(e) ssl_err((char*)e, deP), abend(deP)
hh
parents:
diff changeset
   166
#define SOFTERR(e) LOG(0, e), fflush(stderr)
hh
parents:
diff changeset
   167
#define HARDERR(e) SOFTERR(e), abend(deP);
hh
parents:
diff changeset
   168
hh
parents:
diff changeset
   169
extern CSP csP;
hh
parents:
diff changeset
   170
hh
parents:
diff changeset
   171
#endif