Move protocol-specific interface state into iface_t
This commit is contained in:
parent
37c2167874
commit
b15c16f12c
7 changed files with 22 additions and 15 deletions
|
@ -37,6 +37,7 @@
|
||||||
typedef struct gmrf gmrf_t;
|
typedef struct gmrf gmrf_t;
|
||||||
typedef struct gmrf_context gmrf_context_t;
|
typedef struct gmrf_context gmrf_context_t;
|
||||||
typedef struct gmrf_iface gmrf_iface_t;
|
typedef struct gmrf_iface gmrf_iface_t;
|
||||||
|
typedef struct gmrf_iface_state gmrf_iface_state_t;
|
||||||
|
|
||||||
|
|
||||||
#define GMRF_ADDR_LEN 8
|
#define GMRF_ADDR_LEN 8
|
||||||
|
@ -68,7 +69,7 @@ size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface);
|
||||||
bool gmrf_iface_send(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest);
|
bool gmrf_iface_send(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest);
|
||||||
bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len);
|
bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len);
|
||||||
|
|
||||||
typedef void (*gmrf_scheduled_func)(gmrf_t *gmrf, gmrf_context_t *ctx, void *arg);
|
typedef void (*gmrf_scheduled_func)(gmrf_context_t *ctx, void *arg);
|
||||||
|
|
||||||
void gmrf_schedule(gmrf_t *gmrf, gmrf_scheduled_func f, void *arg, unsigned delay);
|
void gmrf_schedule(gmrf_t *gmrf, gmrf_scheduled_func f, void *arg, unsigned delay);
|
||||||
|
|
||||||
|
@ -77,7 +78,7 @@ extern const char *gmrf_protocol_name;
|
||||||
extern const char *gmrf_protocol_version;
|
extern const char *gmrf_protocol_version;
|
||||||
|
|
||||||
gmrf_context_t* gmrf_protocol_init(gmrf_t *gmrf);
|
gmrf_context_t* gmrf_protocol_init(gmrf_t *gmrf);
|
||||||
void gmrf_protocol_add_iface(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface);
|
gmrf_iface_state_t* gmrf_protocol_add_iface(gmrf_context_t *ctx, gmrf_iface_t *iface);
|
||||||
void gmrf_protocol_handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
void gmrf_protocol_handle_packet(gmrf_context_t *ctx, gmrf_iface_state_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
||||||
|
|
||||||
#endif /* _GMRF_GMRF_H_ */
|
#endif /* _GMRF_GMRF_H_ */
|
||||||
|
|
|
@ -35,8 +35,8 @@ typedef struct mmss_protocol {
|
||||||
const char* (*get_version)(void);
|
const char* (*get_version)(void);
|
||||||
|
|
||||||
gmrf_context_t* (*init)(gmrf_t *gmrf);
|
gmrf_context_t* (*init)(gmrf_t *gmrf);
|
||||||
void (*add_iface)(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface);
|
gmrf_iface_state_t* (*add_iface)(gmrf_context_t *ctx, gmrf_iface_t *iface);
|
||||||
void (*handle_packet)(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
void (*handle_packet)(gmrf_context_t *ctx, gmrf_iface_state_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
||||||
} mmss_protocol_t;
|
} mmss_protocol_t;
|
||||||
|
|
||||||
#endif /* _GMRF_MMSS_PROTOCOL_H_ */
|
#endif /* _GMRF_MMSS_PROTOCOL_H_ */
|
||||||
|
|
|
@ -105,7 +105,7 @@ void context_t::run(int argc, char *argv[]) {
|
||||||
int timeout = event_queue.timeout();
|
int timeout = event_queue.timeout();
|
||||||
|
|
||||||
if (timeout < 0) {
|
if (timeout < 0) {
|
||||||
fprintf(stderr, "nothing queued, deadlock occured.\n");
|
logf(LOG_ERR, "nothing queued, deadlock occured");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ std::shared_ptr<iface_t> iface_t::add(const std::shared_ptr<node_t> &node, const
|
||||||
std::shared_ptr<iface_t> iface = std::shared_ptr<iface_t>(new iface_t(node.get(), net.get(), name, address));
|
std::shared_ptr<iface_t> iface = std::shared_ptr<iface_t>(new iface_t(node.get(), net.get(), name, address));
|
||||||
|
|
||||||
net->add_iface(iface);
|
net->add_iface(iface);
|
||||||
node->add_iface(iface);
|
iface->state = node->add_iface(iface);
|
||||||
|
|
||||||
return iface;
|
return iface;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ private:
|
||||||
std::string name;
|
std::string name;
|
||||||
gmrf_addr_t address;
|
gmrf_addr_t address;
|
||||||
|
|
||||||
|
gmrf_iface_state *state;
|
||||||
|
|
||||||
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &dest, const void *data, size_t len);
|
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &dest, const void *data, size_t len);
|
||||||
|
|
||||||
iface_t(node_t *node0, network_t *net0, const std::string &name0, const gmrf_addr_t *address0)
|
iface_t(node_t *node0, network_t *net0, const std::string &name0, const gmrf_addr_t *address0)
|
||||||
|
@ -64,6 +66,10 @@ public:
|
||||||
return &address;
|
return &address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gmrf_iface_state* get_state() const {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
void send(const void *data, size_t len, const gmrf_addr_t *dest) {
|
void send(const void *data, size_t len, const gmrf_addr_t *dest) {
|
||||||
net->send(data, len, this, dest);
|
net->send(data, len, this, dest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,9 +62,9 @@ public:
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_iface(const std::shared_ptr<iface_t> &iface) {
|
gmrf_iface_state_t* add_iface(const std::shared_ptr<iface_t> &iface) {
|
||||||
interfaces.insert(iface);
|
interfaces.insert(iface);
|
||||||
proto->add_iface(this, gmrf_ctx, iface.get());
|
return proto->add_iface(gmrf_ctx, iface.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
context_t* get_context() const {
|
context_t* get_context() const {
|
||||||
|
@ -80,11 +80,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_packet(const std::shared_ptr<iface_t> &iface, const gmrf_addr_t *source, const void *data, size_t len) {
|
void handle_packet(const std::shared_ptr<iface_t> &iface, const gmrf_addr_t *source, const void *data, size_t len) {
|
||||||
proto->handle_packet(this, gmrf_ctx, iface.get(), source, data, len);
|
proto->handle_packet(gmrf_ctx, iface->get_state(), source, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_scheduled(gmrf_scheduled_func f, void *arg) {
|
void handle_scheduled(gmrf_scheduled_func f, void *arg) {
|
||||||
f(this, gmrf_ctx, arg);
|
f(gmrf_ctx, arg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -61,12 +61,12 @@ public:
|
||||||
return proto->init(gmrf);
|
return proto->init(gmrf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_iface(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface) const {
|
gmrf_iface_state_t* add_iface(gmrf_context_t *ctx, gmrf_iface_t *iface) const {
|
||||||
return proto->add_iface(gmrf, ctx, iface);
|
return proto->add_iface(ctx, iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len) const {
|
void handle_packet(gmrf_context_t *ctx, gmrf_iface_state_t *iface, const gmrf_addr_t *source, const void *data, size_t len) const {
|
||||||
return proto->handle_packet(gmrf, ctx, iface, source, data, len);
|
proto->handle_packet(ctx, iface, source, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<const protocol_t> load(context_t *mmss, const std::string &module);
|
static std::shared_ptr<const protocol_t> load(context_t *mmss, const std::string &module);
|
||||||
|
|
Reference in a new issue