titan.TestPorts.E1/src/E1TS_PT.hh

101 lines
2.0 KiB
C++

#pragma once
#include <map>
#include <queue>
#include <TTCN3.hh>
extern "C" {
#include <osmocom/e1d/proto_clnt.h>
}
#include "E1TS_PortTypes.hh"
namespace E1TS__PortType {
using namespace E1TS__PortTypes;
class E1TS__PT_PROVIDER;
class DerivedId {
public:
DerivedId(const E1TS__identity &id);
unsigned int interface_nr;
unsigned int line_nr;
unsigned int ts_nr;
};
class QueueEntry {
public:
QueueEntry(const uint8_t *pdata, unsigned int plen);
~QueueEntry();
uint8_t *data;
unsigned int len;
};
class E1_Timeslot {
public:
E1_Timeslot(E1TS__PT_PROVIDER &pr, E1TS__identity id, E1TS__mode mode, int fd);
~E1_Timeslot();
int enqueue_tx(const uint8_t *data, unsigned int len);
int dequeue_tx(void);
E1TS__identity m_id;
int m_fd;
private:
E1TS__PT_PROVIDER &m_pt;
E1TS__mode m_mode;
std::queue<QueueEntry *> m_tx_queue;
};
class E1TS__PT_PROVIDER : public PORT {
public:
E1TS__PT_PROVIDER(const char *par_port_name);
~E1TS__PT_PROVIDER();
void set_parameter(const char *parameter_name, const char *parameter_value);
private:
void Handle_Fd_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error);
protected:
void user_map(const char *system_port);
void user_unmap(const char *system_port);
void user_start();
void user_stop();
void outgoing_send(const E1TS__open& send_par);
void outgoing_send(const E1TS__close& send_par);
void outgoing_send(const E1TS__unitdata& send_par);
virtual void incoming_message(const E1TS__result& incoming_par) = 0;
virtual void incoming_message(const E1TS__unitdata &incoming_par) = 0;
public:
void log(const char *fmt, ...);
private:
/* parameter */
const char *m_e1d_socket_path = E1DP_DEFAULT_SOCKET;
E1_Timeslot *ts_by_fd(int fd);
E1_Timeslot *ts_by_id(const E1TS__identity &id);
/* client to the E1 Daemon */
struct osmo_e1dp_client *m_e1d_clnt;
/* per-timeslot file descriptors */
std::map<DerivedId, E1_Timeslot *> m_ts_by_id;
std::map<int, E1_Timeslot *> m_ts_by_fd;
};
}