-
Notifications
You must be signed in to change notification settings - Fork 0
/
GossipPush.h
137 lines (101 loc) · 3.66 KB
/
GossipPush.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#ifndef __INET_GOSSIPPUSH_H_
#define __INET_GOSSIPPUSH_H_
#include <omnetpp.h>
#include <map>
#include <vector>
#include <string>
#include "inet/common/INETDefs.h"
#include "inet/applications/base/ApplicationBase.h"
#include "inet/transportlayer/contract/udp/UDPSocket.h"
#include "Gossip_m.h"
#include "GossipHello_m.h"
#include "TickAutomaton.h"
#include "StateMachine.h"
#include "StateMachineInterpreter.h"
namespace inet {
using std::map;
using std::vector;
using std::string;
const double HELLO_INTERVAL = 0.6;
/**
* TODO - Generated class
*/
class INET_API GossipPush : public ApplicationBase, public ITimeOutProducer
{
protected:
int destinationPort = 10000;
int localPort = 10000;
bool isSource = false; // indicates whether the app is the source of messages
int numMessages = 1; // how many messages to send
double intervalAmongNewMessages = 5; // how much time to wait between two different new messages created in this node
// gossip stuff
int nodesPerRound = 1; // this node will gossip with 'nodesPerRound' in each round
int roundRatio = 2; // the number of rounds is 'roundRatio*numberOfAddresses'
double gossipInterval = 0.1;
map<string, L3Address> addresses; // network members
vector<L3Address> possibleNeighbors;
// to assign ids to messages
int lastIdMsg = 1;
// list of known infections ( messages )
class GossipInfection {
public:
int idMsg;
string source;
string text;
int roundsLeft;
};
vector<GossipInfection> infections;
// communication
UDPSocket socket;
// control messages
cMessage* ctrlMsg0 = nullptr;
// myself as a module
string myself;
L3Address myAddress;
// a state machine
StateMachine* sm_tick_gossip;
StateMachine* sm_tick_new_gossip;
StateMachine* sm_tick_hello;
StateMachine* sm_proptocol;
vector<StateMachineInterpreter*> interpreters;
map<cMessage*, ITimeOut*> timers;
protected:
virtual int numInitStages() const override { return NUM_INIT_STAGES; }
virtual void initialize(int stage) override;
virtual void handleMessageWhenUp(cMessage *msg) override;
virtual void finish() override;
virtual bool handleNodeStart(IDoneCallback *doneCallback) override;
virtual bool handleNodeShutdown(IDoneCallback *doneCallback) override;
virtual void handleNodeCrash() override;
virtual void registerListener(ITimeOut* listener, double afterElapsedTime) override;
virtual void processStart();
void interpreting();
virtual StateMachine* createProtocolStateMachine();
public: // and by making this public, I am just signing my death sentence
bool gossiping();
bool sayHello();
void newGossip();
bool processReceivedGossip(cPacket* pkt);
bool processReceivedHello(cPacket* pkt);
bool isInfected() { return !infections.empty(); }
void addNewAddress(string id);
void addNewInfection(Gossip* g);
private:
static const int TICK_MESSAGE = 456;
};
} //namespace
#endif