plebble
datagram.h
Go to the documentation of this file.
1 /*
2 -------------------------------------------------------------------------------
3  PLEBBLE
4 -------------------------------------------------------------------------------
5  Copyright (C) 2019-2020 KATLAS Technology. (http://katlastechnology.com)
6  Copyright (C) 2017-2020 Marcos Mayorga. (mm@mm-studios.com)
7 
8  This file is part of our Plebble(R) Platform.
9 
10  The code below cannot be copied, used for any purpose other than the one
11  agreed and/or distributed without the express permission of
12  KATLAS Technology.
13 -------------------------------------------------------------------------------
14 
15 
16 */
17 #ifndef USGOV_39bdfeac516fc1718aed51b86fa8d93d0d07d38ad969652da578521c0fd96067
18 #define USGOV_39bdfeac516fc1718aed51b86fa8d93d0d07d38ad969652da578521c0fd96067
19 
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
23 #include <string>
24 #include <vector>
25 #include <unordered_map>
26 #include <csignal>
27 #include <cassert>
28 #include <memory>
29 #include <mutex>
31 #include <us/gov/crypto/sha256.h>
32 #include <us/gov/crypto/ec.h>
33 #include <us/gov/id/protocol.h>
34 #include <us/gov/socket/protocol.h>
35 #include <us/gov/likely.h>
36 #include <us/gov/config.h>
37 #include <atomic>
38 #include <type_traits>
39 
40 namespace us { namespace gov {
41 namespace socket {
42  using namespace std;
43 
44  struct datagram final:vector<uint8_t> {
45  typedef vector<uint8_t> b;
48  typedef int64_t cash_t;
53 
54  static const char *KO_0001;
55  static const char *KO_0002;
56  static const char *KO_0003;
57  static const char *KO_4038;
58  static const char *KO_4921;
59  static const char *KO_9021;
60 
61  struct dispatcher_t {
62  virtual ~dispatcher_t() {}
63  virtual void dispatch(datagram*);
64  };
65 
66  #if CFG_COUNTERS==1
67  struct iodata {
68  iodata() {}
69  struct data {
70  void dump(ostream& os) const;
71  void to_stream(ostream& os) const;
72  atomic<uint32_t> num{0};
73  atomic<uint32_t> bytes{0};
74  };
75  void dump(ostream& os) const;
76  void to_stream(ostream& os) const;
77  data sent;
78  data received;
79  };
80 
81  struct counters_t:unordered_map<uint16_t,iodata*> {
82  counters_t();
83  ~counters_t();
84  uint32_t wrong_channel{0};
85  uint32_t closed_connection{0};
86  uint32_t peer_timeout{0};
87  uint32_t peer_ended{0};
88  uint32_t infraheader_datagram{0};
89  uint32_t wrong_size{};
90  uint32_t valid_dgram_fragment1{0};
91  uint32_t valid_dgram_fragment2{0};
92  uint64_t bytes_received{0};
93  void update(const datagram& d, bool send);
94  void dump(ostream& os) const;
95  void dump_bw(const chrono::system_clock::time_point&, ostream& os) const;
96  void to_stream_io(ostream& os) const;
97  pair<uint32_t,uint32_t> totals() const;
98  };
99  static counters_t counters;
100  #endif
101 
102  static constexpr size_t offset_channel{0};
103  static constexpr size_t size_channel{sizeof(uint16_t)};
104  static constexpr size_t offset_size{offset_channel+size_channel};
105  static constexpr size_t size_size{sizeof(uint32_t)};
106  static constexpr size_t offset_service{offset_size+size_size};
107  static constexpr size_t size_service{sizeof(uint16_t)};
108  static constexpr size_t offset_sequence{offset_size+size_size+size_service};
109  static constexpr size_t size_sequence{sizeof(uint16_t)};
110 
111  static constexpr size_t h{size_channel+size_size+size_service+size_sequence};
112  static constexpr size_t maxsize{CFG_MAX_SIZE_DATAGRAM};
113  static string service_str(uint16_t svc);
114 
118  void constructor(uint16_t service, uint16_t sequence, uint32_t size);
119 
120  //datagram(uint16_t,uint16_t, const hash_t& , const uint8_t&,const string&,const tuple<int, int, int, int>&);
121 
122  #include <us/api/apitool_generated__c++__datagram_hdr>
123 
124 /*
125  template<typename t>
126  datagram(uint16_t service, uint16_t sequence, const vector<t>& content):service(service) {
127  static_assert(!is_same<t,size_t>::value,"not a suitable type for a network protocol. (sizeof mismatch across arch)");
128  static_assert(!is_same<t,int>::value,"not a suitable type for a network protocol. (sizeof mismatch across arch)");
129  assert(h+content.size()*sizeof(t)<maxsize);
130  constructor(service,sequence,h+content.size()*sizeof(t));
131  ::memcpy(data()+h,content.data(),content.size()*sizeof(t));
132  //#ifdef FIND_DGRAM_LEAKS
133  // x.emplace(this);
134  //#endif
135  }
136 */
137 
138  string parse_string() const;
139  //uint16_t parse_uint16() const;
140  //uint64_t parse_uint64() const;
141 /*
142  bool parse(uint16_t&, uint16_t&) const; //P-uint16-uint16
143  bool parse(uint16_t&, uint16_t&, uint16_t&) const; //P-uint16-uint16-uint16
144  bool parse(uint16_t&, uint16_t&, uint16_t&, string&) const; //P-uint16-uint16-uint16-s
145  bool parse(hash_t&) const; //P-h
146  bool parse(sighash_t&) const; //P-sigh
147  bool parse(hash_t&, string&) const; //P-hs
148  bool parse(hash_t&, hash_t&) const; //P-hh
149  bool parse(hash_t&, vector<unsigned char>&) const; //P-hv
150  bool parse(sighash_t&, pub_t&, vector<unsigned char>&) const; //P-sigh-pub-v
151  bool parse(pub_t&, vector<unsigned char>&) const; //P-pub-v
152  bool parse(hash_t&, string&, vector<unsigned char>&) const; //P-hsv
153  bool parse(hash_t&, string&, hash_t&) const; //P-hsh
154  bool parse(unsigned char&, vector<unsigned char>&) const; //P-cv
155  bool parse(unsigned char&, string&) const; //P-cs
156  bool parse(string&, string&) const; //P-ss
157  bool parse(string&, string&, string&) const; //P-sss
158  bool parse(vector<unsigned char>&) const; //P-v
159 */
160  bool completed() const;
163  inline string service_str() const { return service_str(service); }
164  ko recvfrom(int sock);
165 
168 
169  template<typename t>
170  ko parse(vector<t>& content) const {
171  if (unlikely(size()<h)) return (ko)"KO 81198 Invalid size.";
172  auto payload_sz=size()-h;
173  if (unlikely((payload_sz%sizeof(t))!=0)) return (ko)"KO 48535 Invalid size.";
174  content.resize(payload_sz/sizeof(t));
175  ::memcpy(content.data(),data()+h,payload_sz);
176  return ok;
177  }
178 
179  void dump(ostream&) const;
180  uint32_t decode_size() const;
181  uint16_t decode_service() const;
182  uint16_t decode_sequence() const;
183  void encode_size(uint32_t);
184  void encode_service(uint16_t);
185  void encode_sequence(uint16_t);
187  uint16_t decode_channel() const;
188  static bool validate_payload(const string& payload);
189  static bool validate_payload(const vector<unsigned char>&);
190 
191  template<typename t>
192  static bool validate_payload(const vector<t>& payload) {
193  return h+payload.size()*sizeof(t)<maxsize;
194  }
195 
196  ko write_bin(ostream&) const;
197  string header_bytes() const;
198 
199  static uint16_t system_channel;
200  uint16_t service;
201  uint32_t dend;
202  };
203 }
204 }}
205 
206 #endif
207 
us::gov::socket::datagram::KO_0001
static const char * KO_0001
Definition: datagram.h:54
us::gov::socket::datagram::hasher_t
crypto::ripemd160 hasher_t
Definition: datagram.h:46
us::is_ko
static bool is_ko(const std::string &s)
Definition: ko.h:30
us::gov::socket::datagram::dump
void dump(ostream &) const
us::gov::socket::datagram::header_bytes
string header_bytes() const
us::gov::cash::hash_t
hasher_t::value_type hash_t
Definition: app.h:55
us::gov::socket::datagram::encode_channel
void encode_channel()
us::gov::socket::datagram::KO_4038
static const char * KO_4038
Definition: datagram.h:57
us.ko
Definition: ko.java:20
protocol.h
us::gov::socket::datagram::decode_sequence
uint16_t decode_sequence() const
protocol.h
us::gov::socket::datagram::service_str
string service_str() const
Definition: datagram.h:163
us::gov::socket::datagram::recvfrom
ko recvfrom(int sock)
us::gov::socket::datagram::completed
bool completed() const
us::gov::socket::datagram::priv_t
crypto::ec::keys::priv_t priv_t
Definition: datagram.h:52
us::gov::socket::datagram::encrypt
pair< ko, datagram * > encrypt(crypto::symmetric_encryption &) const
us
Definition: daemon.h:22
us::gov::crypto::ripemd160::value_type
Definition: ripemd160.h:38
unlikely
#define unlikely(x)
Definition: likely.h:30
us.pair.first
f first
Definition: pair.java:20
us::gov::socket::datagram::datagram
datagram(const datagram &)
us::gov::crypto::sha256::value_type
Definition: sha256.h:38
us::gov::socket::datagram::service_str
static string service_str(uint16_t svc)
us::gov::socket::datagram::sighash_t
sighasher_t::value_type sighash_t
Definition: datagram.h:50
likely.h
us::gov::socket::datagram::write_bin
ko write_bin(ostream &) const
us::gov::socket::datagram::dispatcher_t::dispatch
virtual void dispatch(datagram *)
us::gov::crypto::ec::keys::pub_t
Definition: ec.h:44
us::gov::socket::datagram::compute_hash
hash_t compute_hash() const
us::gov::socket::datagram::dend
uint32_t dend
Definition: datagram.h:201
us::gov::socket::datagram
Definition: datagram.h:44
us::gov::crypto::sha256
Definition: sha256.h:33
us::gov::socket::datagram::system_channel
static uint16_t system_channel
Definition: datagram.h:199
us::gov::protocol
Definition: protocol.h:24
protocol.h
us::gov::socket::datagram::datagram
datagram()
us::gov::socket
Definition: busyled.h:23
us::gov::socket::datagram::~datagram
~datagram()
us::gov::socket::datagram::service
uint16_t service
Definition: datagram.h:200
us::gov::socket::datagram::decode_size
uint32_t decode_size() const
us.pair.second
s second
Definition: pair.java:21
us::gov::crypto::ec::keys::priv_t
Definition: ec.h:77
c
us::gov::socket::datagram c
Definition: datagram.cpp:48
us::gov::socket::datagram::decode_channel
uint16_t decode_channel() const
us::gov::crypto::symmetric_encryption
Definition: symmetric_encryption.h:37
us::ko
const ko_t * ko
Definition: ko.h:27
us::gov::socket::datagram::decode_service
uint16_t decode_service() const
datagram.h
us::gov::socket::datagram::constructor
void constructor(uint16_t service, uint16_t sequence, uint32_t size)
us::gov::cash::hasher_t
ripemd160 hasher_t
Definition: app.h:54
us::gov::crypto::ripemd160
Definition: ripemd160.h:34
us::gov::socket::datagram::KO_4921
static const char * KO_4921
Definition: datagram.h:58
ripemd160.h
us::gov::socket::datagram::validate_payload
static bool validate_payload(const string &payload)
us::gov::socket::datagram::validate_payload
static bool validate_payload(const vector< unsigned char > &)
sha256.h
us::gov::socket::datagram::compute_hash_payload
hash_t compute_hash_payload() const
c
Definition: client.cpp:417
us::ok
static constexpr ko ok
Definition: ko.h:28
us::gov::socket::datagram::cash_t
int64_t cash_t
Definition: datagram.h:48
us::gov::socket::datagram::encode_sequence
void encode_sequence(uint16_t)
us::gov::socket::datagram::b
vector< uint8_t > b
Definition: datagram.h:45
us::gov::socket::datagram.size
long size()
Definition: datagram.cs:178
symmetric_encryption.h
us::gov::socket::datagram::parse
ko parse(vector< t > &content) const
Definition: datagram.h:170
us::gov::socket::datagram::KO_0002
static const char * KO_0002
Definition: datagram.h:55
std
Definition: app.h:380
stacktrace.h
us::gov::socket::datagram::dispatcher_t
Definition: datagram.h:61
CFG_MAX_SIZE_DATAGRAM
#define CFG_MAX_SIZE_DATAGRAM
Definition: config.h:29
us::gov::socket::datagram::pub_t
crypto::ec::keys::pub_t pub_t
Definition: datagram.h:51
config.h
base58.h
us::gov::socket::datagram::KO_9021
static const char * KO_9021
Definition: datagram.h:59
print_stacktrace
#define print_stacktrace
Definition: stacktrace.h:104
us::gov::crypto::ripemd160::write
void write(const vector< unsigned char > &)
us::gov::socket::datagram::dispatcher_t::~dispatcher_t
virtual ~dispatcher_t()
Definition: datagram.h:62
us::gov::socket::datagram::parse_string
string parse_string() const
us::gov::socket::datagram::encode_size
void encode_size(uint32_t)
us::gov::socket::datagram::hash_t
hasher_t::value_type hash_t
Definition: datagram.h:47
us::gov::socket::datagram::KO_0003
static const char * KO_0003
Definition: datagram.h:56
server.h
us.pair
Definition: pair.java:19
us::gov::socket::datagram::encode_service
void encode_service(uint16_t)
gov.h
ec.h
protocol.h
us::gov::socket::datagram::sighasher_t
crypto::sha256 sighasher_t
Definition: datagram.h:49
us::gov::socket::datagram::validate_payload
static bool validate_payload(const vector< t > &payload)
Definition: datagram.h:192
log
#define log
Definition: gov.h:83
us::gov::socket::datagram::decrypt
pair< ko, datagram * > decrypt(crypto::symmetric_encryption &) const
CFG_CHANNEL
#define CFG_CHANNEL
Definition: config.h:27