Parent: [6ccca6] (diff)

Child: [b323f7] (diff)

Download this file

RMTModuleAllocator.h    117 lines (98 with data), 3.2 kB

  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
//
// Copyright Š 2014 - 2015 PRISTINE Consortium (http://ict-pristine.eu)
//
// 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 __RINA_RMTMODULEALLOCATOR_H_
#define __RINA_RMTMODULEALLOCATOR_H_
#include <omnetpp.h>
#include "RMTQueue.h"
#include "RMTPort.h"
#include "RMTQMonitorBase.h"
class RMTQMonitorBase; /* FIXME: circular dependency */
/**
* A control unit for RMTPort & RMTQueue instances that provides an API for
* adding and deleting RMT ports and queues.
*/
class RMTModuleAllocator : public cSimpleModule
{
public:
/**
* Instantiates a new RMTPort instance.
*
* @param flow (N-1)-flow
* @return pointer to the new port
*/
RMTPort* addPort(Flow* flow);
/**
* Instantiates a new queue and binds it to the given port.
*
* @param type queue type (in/out)
* @param port (N-1)-port
* @param queueId queue ID (determined by QueueIDGen policy)
* @return pointer to the new queue
*/
RMTQueue* addQueue(RMTQueueType type, RMTPort* port, const char* queueId = "0");
/**
* Adds a pair of management queues.
* Note: this will go away soon when mgmt messages get their own flows
*
* @param port (N-1)-port
*/
void addMgmtQueues(RMTPort* port);
/**
* Removes the specified port.
*
* @param port (N-1)-port
*/
void removePort(RMTPort* port);
/**
* Removes the specified queue.
*
* @param queue queue
*/
void removeQueue(RMTQueue* queue);
/**
* Removes each queue from given vector.
*
* @param queues vector of queues
*/
void removeQueues(const RMTQueues& queues);
/**
* Returns (N-1)-port the given queue is assigned to.
*
* @param queue RMT queue
* @return (N-1)-port
*/
RMTPort* getQueueToPortMapping(RMTQueue* queue);
/**
* Returns the mock inteface (N-1)-port. Only to be used in the bottom DIFs.
*
* @return (N-1)-port (NULL if this isn't the bottom DIF)
*/
RMTPort* getInterfacePort();
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg) {};
private:
RMTQMonitorBase* qMonPolicy;
RMTPort* interfacePort;
std::map<RMTQueue*, RMTPort*> queueToPort;
RMTQueue* lookup(RMTPort* port, RMTQueueType type, const char* queueName);
// TODO: purge this crap and think of a smarter way of positioning modules
unsigned int portCount;
std::map<RMTPort*, unsigned int> portQueueCount;
unsigned int portXCoord, portYCoord;
};
#endif