diff options
-rw-r--r-- | include/ouroboros/cdap.h | 72 | ||||
-rw-r--r-- | src/ipcpd/normal/cdap_request.h | 9 | ||||
-rw-r--r-- | src/ipcpd/normal/ribmgr.c | 136 | ||||
-rw-r--r-- | src/lib/cdap.c | 193 |
4 files changed, 152 insertions, 258 deletions
diff --git a/include/ouroboros/cdap.h b/include/ouroboros/cdap.h index bd8aa551..7312fb6f 100644 --- a/include/ouroboros/cdap.h +++ b/include/ouroboros/cdap.h @@ -30,43 +30,32 @@ #define F_SYNC 0x0001 +enum cdap_opcode { + CDAP_READ = 0, + CDAP_WRITE, + CDAP_START, + CDAP_STOP, + CDAP_CREATE, + CDAP_DELETE +}; + struct cdap; /* Callback functions that work on the application's RIB */ struct cdap_ops { + int (* cdap_request)(struct cdap * instance, + int invoke_id, + enum cdap_opcode opcode, + char * name, + uint8_t * data, + size_t len, + uint32_t flags); + int (* cdap_reply)(struct cdap * instance, int invoke_id, int result, uint8_t * data, size_t len); - - int (* cdap_read)(struct cdap * instance, - int invoke_id, - char * name); - int (* cdap_write)(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len, - uint32_t flags); - - int (* cdap_create)(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len); - int (* cdap_delete)(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len); - - int (* cdap_start)(struct cdap * instance, - int invoke_id, - char * name); - int (* cdap_stop)(struct cdap * instance, - int invoke_id, - char * name); }; /* Assumes flow is blocking */ @@ -75,27 +64,12 @@ struct cdap * cdap_create(struct cdap_ops * ops, int cdap_destroy(struct cdap * instance); /* Returns a positive invoke-id on success to be used in the callback */ -int cdap_send_read(struct cdap * instance, - char * name); -int cdap_send_write(struct cdap * instance, - char * name, - uint8_t * data, - size_t len, - uint32_t flags); - -int cdap_send_create(struct cdap * instance, - char * name, - uint8_t * data, - size_t len); -int cdap_send_delete(struct cdap * instance, - char * name, - uint8_t * data, - size_t len); - -int cdap_send_start(struct cdap * instance, - char * name); -int cdap_send_stop(struct cdap * instance, - char * name); +int cdap_send_request(struct cdap * instance, + enum cdap_opcode code, + char * name, + uint8_t * data, + size_t len, + uint32_t flags); /* Can only be called following a callback function */ int cdap_send_reply(struct cdap * instance, diff --git a/src/ipcpd/normal/cdap_request.h b/src/ipcpd/normal/cdap_request.h index b3be44f8..9cccfda5 100644 --- a/src/ipcpd/normal/cdap_request.h +++ b/src/ipcpd/normal/cdap_request.h @@ -30,15 +30,6 @@ #include <pthread.h> -enum cdap_opcode { - READ = 0, - WRITE, - START, - STOP, - CREATE, - DELETE -}; - enum creq_state { REQ_INIT = 0, REQ_PENDING, diff --git a/src/ipcpd/normal/ribmgr.c b/src/ipcpd/normal/ribmgr.c index 295a6724..60872ef2 100644 --- a/src/ipcpd/normal/ribmgr.c +++ b/src/ipcpd/normal/ribmgr.c @@ -165,11 +165,11 @@ int ribmgr_fini() return 0; } -int ribmgr_cdap_reply(struct cdap * instance, - int invoke_id, - int result, - uint8_t * data, - size_t len) +static int ribmgr_cdap_reply(struct cdap * instance, + int invoke_id, + int result, + uint8_t * data, + size_t len) { struct list_head * pos, * n = NULL; @@ -206,24 +206,12 @@ int ribmgr_cdap_reply(struct cdap * instance, return 0; } -int ribmgr_cdap_read(struct cdap * instance, - int invoke_id, - char * name) -{ - LOG_MISSING; - (void) instance; - (void) invoke_id; - (void) name; - - return -1; -} - -int ribmgr_cdap_write(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len, - uint32_t flags) +static int ribmgr_cdap_write(struct cdap * instance, + int invoke_id, + char * name, + uint8_t * data, + size_t len, + uint32_t flags) { static_info_msg_t * msg; int ret = 0; @@ -290,41 +278,9 @@ int ribmgr_cdap_write(struct cdap * instance, return 0; } -int ribmgr_cdap_create(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len) -{ - LOG_MISSING; - (void) instance; - (void) invoke_id; - (void) name; - (void) data; - (void) len; - - return -1; -} - -int ribmgr_cdap_delete(struct cdap * instance, - int invoke_id, - char * name, - uint8_t * data, - size_t len) -{ - LOG_MISSING; - (void) instance; - (void) invoke_id; - (void) name; - (void) data; - (void) len; - - return -1; -} - -int ribmgr_cdap_start(struct cdap * instance, - int invoke_id, - char * name) +static int ribmgr_cdap_start(struct cdap * instance, + int invoke_id, + char * name) { static_info_msg_t stat_info = STATIC_INFO_MSG__INIT; uint8_t * data = NULL; @@ -372,7 +328,8 @@ int ribmgr_cdap_start(struct cdap * instance, pthread_mutex_lock(&rib.cdap_reqs_lock); - iid = cdap_send_write(instance, STATIC_INFO, data, len, 0); + iid = cdap_send_request(instance, CDAP_WRITE, + STATIC_INFO, data, len, 0); if (iid < 0) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&ipcpi.state_lock); @@ -381,7 +338,8 @@ int ribmgr_cdap_start(struct cdap * instance, return -1; } - if (cdap_result_wait(instance, WRITE, STATIC_INFO, iid)) { + if (cdap_result_wait(instance, CDAP_WRITE, + STATIC_INFO, iid)) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&ipcpi.state_lock); free(data); @@ -396,7 +354,8 @@ int ribmgr_cdap_start(struct cdap * instance, pthread_mutex_lock(&rib.cdap_reqs_lock); - iid = cdap_send_stop(instance, ENROLLMENT); + iid = cdap_send_request(instance, CDAP_STOP, ENROLLMENT, + NULL, 0, 0); if (iid < 0) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&ipcpi.state_lock); @@ -405,7 +364,8 @@ int ribmgr_cdap_start(struct cdap * instance, return -1; } - if (cdap_result_wait(instance, STOP, ENROLLMENT, iid)) { + if (cdap_result_wait(instance, CDAP_STOP, + ENROLLMENT, iid)) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&ipcpi.state_lock); free(data); @@ -427,9 +387,9 @@ int ribmgr_cdap_start(struct cdap * instance, return 0; } -int ribmgr_cdap_stop(struct cdap * instance, - int invoke_id, - char * name) +static int ribmgr_cdap_stop(struct cdap * instance, + int invoke_id, + char * name) { int ret = 0; @@ -452,14 +412,37 @@ int ribmgr_cdap_stop(struct cdap * instance, return 0; } +static int ribmgr_cdap_request(struct cdap * instance, + int invoke_id, + enum cdap_opcode opcode, + char * name, + uint8_t * data, + size_t len, + uint32_t flags) +{ + switch (opcode) { + case CDAP_WRITE: + return ribmgr_cdap_write(instance, + invoke_id, + name, data, + len, flags); + case CDAP_START: + return ribmgr_cdap_start(instance, + invoke_id, + name); + case CDAP_STOP: + return ribmgr_cdap_stop(instance, + invoke_id, + name); + default: + LOG_INFO("Unsupported CDAP opcode received."); + return -1; + } +} + static struct cdap_ops ribmgr_ops = { - .cdap_reply = ribmgr_cdap_reply, - .cdap_read = ribmgr_cdap_read, - .cdap_write = ribmgr_cdap_write, - .cdap_create = ribmgr_cdap_create, - .cdap_delete = ribmgr_cdap_delete, - .cdap_start = ribmgr_cdap_start, - .cdap_stop = ribmgr_cdap_stop + .cdap_reply = ribmgr_cdap_reply, + .cdap_request = ribmgr_cdap_request }; int ribmgr_add_flow(int fd) @@ -489,8 +472,10 @@ int ribmgr_add_flow(int fd) ipcp_set_state(IPCP_PENDING_ENROLL); pthread_mutex_lock(&rib.cdap_reqs_lock); - iid = cdap_send_start(instance, - ENROLLMENT); + iid = cdap_send_request(instance, + CDAP_START, + ENROLLMENT, + NULL, 0, 0); if (iid < 0) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&rib.flows_lock); @@ -501,7 +486,8 @@ int ribmgr_add_flow(int fd) return -1; } - if (cdap_result_wait(instance, START, ENROLLMENT, iid)) { + if (cdap_result_wait(instance, CDAP_START, + ENROLLMENT, iid)) { pthread_mutex_unlock(&rib.cdap_reqs_lock); pthread_rwlock_unlock(&rib.flows_lock); pthread_rwlock_unlock(&ipcpi.state_lock); diff --git a/src/lib/cdap.c b/src/lib/cdap.c index 4a6408f6..d06a7d39 100644 --- a/src/lib/cdap.c +++ b/src/lib/cdap.c @@ -83,49 +83,58 @@ static void * handle_cdap_msg(void * o) switch (msg->opcode) { case OPCODE__READ: if (msg->name != NULL) - instance->ops->cdap_read(instance, - msg->invoke_id, - msg->name); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_READ, + msg->name, + NULL, 0, 0); break; case OPCODE__WRITE: if (msg->name != NULL && msg->has_value) - instance->ops->cdap_write(instance, - msg->invoke_id, - msg->name, - msg->value.data, - msg->value.len, - msg->flags); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_WRITE, + msg->name, + msg->value.data, + msg->value.len, + msg->flags); break; case OPCODE__CREATE: if (msg->name != NULL && msg->has_value) - instance->ops->cdap_create(instance, - msg->invoke_id, - msg->name, - msg->value.data, - msg->value.len); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_CREATE, + msg->name, + msg->value.data, + msg->value.len, 0); break; case OPCODE__DELETE: if (msg->name != NULL && msg->has_value) - instance->ops->cdap_delete(instance, - msg->invoke_id, - msg->name, - msg->value.data, - msg->value.len); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_DELETE, + msg->name, + msg->value.data, + msg->value.len, 0); break; case OPCODE__START: if (msg->name != NULL) - instance->ops->cdap_start(instance, - msg->invoke_id, - msg->name); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_START, + msg->name, + NULL, 0, 0); break; case OPCODE__STOP: if (msg->name != NULL) - instance->ops->cdap_stop(instance, - msg->invoke_id, - msg->name); + instance->ops->cdap_request(instance, + msg->invoke_id, + CDAP_STOP, + msg->name, + NULL, 0, 0); break; case OPCODE__REPLY: instance->ops->cdap_reply(instance, @@ -191,12 +200,7 @@ struct cdap * cdap_create(struct cdap_ops * ops, if (ops == NULL || fd < 0 || ops->cdap_reply == NULL || - ops->cdap_read == NULL || - ops->cdap_write == NULL || - ops->cdap_create == NULL || - ops->cdap_delete == NULL || - ops->cdap_start == NULL || - ops->cdap_stop == NULL) + ops->cdap_request == NULL) return NULL; flags = flow_cntl(fd, FLOW_F_GETFL, 0); @@ -274,9 +278,12 @@ static int write_msg(struct cdap * instance, return ret; } -static int send_read_or_start_or_stop(struct cdap * instance, - char * name, - opcode_t code) +int cdap_send_request(struct cdap * instance, + enum cdap_opcode code, + char * name, + uint8_t * data, + size_t len, + uint32_t flags) { int id; cdap_t msg = CDAP__INIT; @@ -288,75 +295,39 @@ static int send_read_or_start_or_stop(struct cdap * instance, if (!bmp_is_id_valid(instance->ids, id)) return -1; - msg.opcode = code; - msg.invoke_id = id; - msg.name = name; - - if (write_msg(instance, &msg)) - return -1; - - return id; -} - -static int send_create_or_delete(struct cdap * instance, - char * name, - uint8_t * data, - size_t len, - opcode_t code) -{ - int id; - cdap_t msg = CDAP__INIT; - - if (instance == NULL || name == NULL || data == NULL) - return -1; - - id = next_invoke_id(instance); - if (!bmp_is_id_valid(instance->ids, id)) - return -1; - - msg.opcode = code; - msg.name = name; - msg.invoke_id = id; - msg.has_value = true; - msg.value.data = data; - msg.value.len = len; - - if (write_msg(instance, &msg)) - return -1; - - return id; -} - -int cdap_send_read(struct cdap * instance, - char * name) -{ - return send_read_or_start_or_stop(instance, name, OPCODE__READ); -} - -int cdap_send_write(struct cdap * instance, - char * name, - uint8_t * data, - size_t len, - uint32_t flags) -{ - int id; - cdap_t msg = CDAP__INIT; - - if (instance == NULL || name == NULL || data == NULL) - return -1; - - id = next_invoke_id(instance); - if (!bmp_is_id_valid(instance->ids, id)) + switch (code) { + case CDAP_READ: + msg.opcode = OPCODE__READ; + break; + case CDAP_WRITE: + msg.opcode = OPCODE__WRITE; + break; + case CDAP_CREATE: + msg.opcode = OPCODE__CREATE; + break; + case CDAP_DELETE: + msg.opcode = OPCODE__DELETE; + break; + case CDAP_START: + msg.opcode = OPCODE__START; + break; + case CDAP_STOP: + msg.opcode = OPCODE__STOP; + break; + default: + release_invoke_id(instance, id); return -1; + } - msg.opcode = OPCODE__WRITE; msg.name = name; msg.has_flags = true; msg.flags = flags; msg.invoke_id = id; - msg.has_value = true; - msg.value.data = data; - msg.value.len = len; + if (data != NULL) { + msg.has_value = true; + msg.value.data = data; + msg.value.len = len; + } if (write_msg(instance, &msg)) return -1; @@ -364,34 +335,6 @@ int cdap_send_write(struct cdap * instance, return id; } -int cdap_send_create(struct cdap * instance, - char * name, - uint8_t * data, - size_t len) -{ - return send_create_or_delete(instance, name, data, len, OPCODE__CREATE); -} - -int cdap_send_delete(struct cdap * instance, - char * name, - uint8_t * data, - size_t len) -{ - return send_create_or_delete(instance, name, data, len, OPCODE__DELETE); -} - -int cdap_send_start(struct cdap * instance, - char * name) -{ - return send_read_or_start_or_stop(instance, name, OPCODE__START); -} - -int cdap_send_stop(struct cdap * instance, - char * name) -{ - return send_read_or_start_or_stop(instance, name, OPCODE__STOP); -} - int cdap_send_reply(struct cdap * instance, int invoke_id, int result, |