/* Jumptable for the request handlers */
-static bool (*request_handlers[])(meshlink_handle_t *, connection_t *, const char *) = {
- id_h, NULL, NULL, NULL /* metakey_h, challenge_h, chal_reply_h */, ack_h,
- status_h, error_h, termreq_h,
- ping_h, pong_h,
- NULL, NULL, //add_subnet_h, del_subnet_h,
- add_edge_h, del_edge_h,
- key_changed_h, req_key_h, ans_key_h, tcppacket_h, NULL, //control_h,
+static bool (*request_handlers[NUM_REQUESTS])(meshlink_handle_t *, connection_t *, const char *) = {
+ [ID] = id_h,
+ [ACK] = ack_h,
+ [STATUS] = status_h,
+ [ERROR] = error_h,
+ [TERMREQ] = termreq_h,
+ [PING] = ping_h,
+ [PONG] = pong_h,
+ [ADD_EDGE] = add_edge_h,
+ [DEL_EDGE] = del_edge_h,
+ [KEY_CHANGED] = key_changed_h,
+ [REQ_KEY] = req_key_h,
+ [ANS_KEY] = ans_key_h,
};
/* Request names */
-static char (*request_name[]) = {
- "ID", "METAKEY", "CHALLENGE", "CHAL_REPLY", "ACK",
- "STATUS", "ERROR", "TERMREQ",
- "PING", "PONG",
- "ADD_SUBNET", "DEL_SUBNET",
- "ADD_EDGE", "DEL_EDGE", "KEY_CHANGED", "REQ_KEY", "ANS_KEY", "PACKET", "CONTROL",
+static const char *request_name[NUM_REQUESTS] = {
+ [ID] = "ID",
+ [ACK] = "ACK",
+ [STATUS] = "STATUS",
+ [ERROR] = "ERROR",
+ [TERMREQ] = "TERMREQ",
+ [PING] = "PING",
+ [PONG] = "PONG",
+ [ADD_EDGE] = "ADD_EDGE",
+ [DEL_EDGE] = "DEL_EDGE",
+ [KEY_CHANGED] = "KEY_CHANGED",
+ [REQ_KEY] = "REQ_KEY",
+ [ANS_KEY] = "ANS_KEY",
};
bool check_id(const char *id) {
/* Generic request routines - takes care of logging and error
detection as well */
-bool send_request(meshlink_handle_t *mesh, connection_t *c, submesh_t *s, const char *format, ...) {
- assert(c);
+bool send_request(meshlink_handle_t *mesh, connection_t *c, const submesh_t *s, const char *format, ...) {
assert(format);
assert(*format);
+ if(!c) {
+ logger(mesh, MESHLINK_ERROR, "Trying to send request to non-existing connection");
+ return false;
+ }
+
va_list args;
char request[MAXBUFSIZE];
int len;
}
}
-void forward_request(meshlink_handle_t *mesh, connection_t *from, submesh_t *s, const char *request) {
+void forward_request(meshlink_handle_t *mesh, connection_t *from, const submesh_t *s, const char *request) {
assert(from);
assert(request);
assert(*request);
int reqno = atoi(request);
if(reqno || *request == '0') {
- if((reqno < 0) || (reqno >= LAST) || !request_handlers[reqno]) {
+ if((reqno < 0) || (reqno >= NUM_REQUESTS) || !request_handlers[reqno]) {
logger(mesh, MESHLINK_DEBUG, "Unknown request from %s: %s", c->name, request);
return false;
} else {
logger(mesh, MESHLINK_DEBUG, "Got %s from %s: %s", request_name[reqno], c->name, request);
}
- if((c->allow_request != ALL) && (c->allow_request != reqno)) {
+ if((c->allow_request != ALL) && (c->allow_request != reqno) && (reqno != ERROR)) {
logger(mesh, MESHLINK_ERROR, "Unauthorized request from %s", c->name);
return false;
}
for splay_each(past_request_t, p, mesh->past_request_tree) {
if(p->firstseen + request_timeout <= mesh->loop.now.tv_sec) {
- splay_delete_node(mesh->past_request_tree, node), deleted++;
+ splay_delete_node(mesh->past_request_tree, splay_node), deleted++;
} else {
left++;
}
new->request = xstrdup(request);
new->firstseen = mesh->loop.now.tv_sec;
- if(!mesh->past_request_tree->head) {
+ if(!mesh->past_request_tree->head && mesh->past_request_timeout.cb) {
timeout_set(&mesh->loop, &mesh->past_request_timeout, &(struct timespec) {
10, prng(mesh, TIMER_FUDGE)
});