diff options
Diffstat (limited to 'src/ipcpd')
-rw-r--r-- | src/ipcpd/normal/dt.c | 33 | ||||
-rw-r--r-- | src/ipcpd/normal/fa.c | 35 | ||||
-rw-r--r-- | src/ipcpd/normal/sdu_sched.c | 46 | ||||
-rw-r--r-- | src/ipcpd/normal/sdu_sched.h | 9 |
4 files changed, 58 insertions, 65 deletions
diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index 72e0195e..593064f4 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -48,7 +48,6 @@ #include <assert.h> struct { - flow_set_t * set[QOS_CUBE_MAX]; struct sdu_sched * sdu_sched; struct pff * pff[QOS_CUBE_MAX]; @@ -64,19 +63,15 @@ struct { static int dt_neighbor_event(enum nb_event event, struct conn conn) { - qoscube_t cube; - /* We are only interested in neighbors being added and removed. */ switch (event) { case NEIGHBOR_ADDED: - ipcp_flow_get_qoscube(conn.flow_info.fd, &cube); - flow_set_add(dt.set[cube], conn.flow_info.fd); - log_dbg("Added fd %d to flow set.", conn.flow_info.fd); + sdu_sched_add(dt.sdu_sched, conn.flow_info.fd); + log_dbg("Added fd %d to SDU scheduler.", conn.flow_info.fd); break; case NEIGHBOR_REMOVED: - ipcp_flow_get_qoscube(conn.flow_info.fd, &cube); - flow_set_del(dt.set[cube], conn.flow_info.fd); - log_dbg("Removed fd %d from flow set.", conn.flow_info.fd); + sdu_sched_del(dt.sdu_sched, conn.flow_info.fd); + log_dbg("Removed fd %d from SDU scheduler.", conn.flow_info.fd); break; default: break; @@ -137,17 +132,8 @@ int dt_init(void) int j; struct conn_info info; - for (i = 0; i < QOS_CUBE_MAX; ++i) { - dt.set[i] = flow_set_create(); - if (dt.set[i] == NULL) { - goto fail_flows; - return -1; - } - } - if (shm_pci_init()) { log_err("Failed to init shm pci."); - goto fail_flows; return -1; } @@ -162,7 +148,7 @@ int dt_init(void) dt.ae = connmgr_ae_create(info); if (dt.ae == NULL) { log_err("Failed to create AE struct."); - goto fail_flows; + return -1; } dt.nbs = nbs_create(); @@ -212,10 +198,6 @@ int dt_init(void) nbs_destroy(dt.nbs); fail_connmgr: connmgr_ae_destroy(dt.ae); - fail_flows: - for (i = 0; i < QOS_CUBE_MAX; ++i) - flow_set_destroy(dt.set[i]); - return -1; } @@ -236,9 +218,6 @@ void dt_fini(void) nbs_destroy(dt.nbs); connmgr_ae_destroy(dt.ae); - - for (i = 0; i < QOS_CUBE_MAX; ++i) - flow_set_destroy(dt.set[i]); } int dt_start(void) @@ -257,7 +236,7 @@ int dt_start(void) return -1; } - dt.sdu_sched = sdu_sched_create(dt.set, sdu_handler); + dt.sdu_sched = sdu_sched_create(sdu_handler); if (dt.sdu_sched == NULL) { log_err("Failed to create N-1 SDU scheduler."); gam_destroy(dt.gam); diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index be1080b1..6c3df7a1 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -48,7 +48,6 @@ struct { cep_id_t fd_to_cep_id[AP_MAX_FLOWS]; int cep_id_to_fd[IPCPD_MAX_CONNS]; - flow_set_t * set[QOS_CUBE_MAX]; struct sdu_sched * sdu_sched; } fa; @@ -82,36 +81,20 @@ int fa_init(void) for (i = 0; i < IPCPD_MAX_CONNS; ++i) fa.cep_id_to_fd[i] = -1; - for (i = 0; i < QOS_CUBE_MAX; ++i) { - fa.set[i] = flow_set_create(); - if (fa.set[i] == NULL) - goto fail_flows; - } - if (pthread_rwlock_init(&fa.flows_lock, NULL)) - goto fail_flows; + return -1; return 0; -fail_flows: - for (i = 0; i < QOS_CUBE_MAX; ++i) - flow_set_destroy(fa.set[i]); - - return -1; } void fa_fini(void) { - int i; - - for (i = 0; i < QOS_CUBE_MAX; ++i) - flow_set_destroy(fa.set[i]); - pthread_rwlock_destroy(&fa.flows_lock); } int fa_start(void) { - fa.sdu_sched = sdu_sched_create(fa.set, sdu_handler); + fa.sdu_sched = sdu_sched_create(sdu_handler); if (fa.sdu_sched == NULL) { log_err("Failed to create SDU scheduler."); return -1; @@ -215,10 +198,8 @@ static int fa_flow_dealloc(int fd) flow_alloc_msg_t msg = FLOW_ALLOC_MSG__INIT; buffer_t buf; int ret; - qoscube_t qc; - ipcp_flow_get_qoscube(fd, &qc); - flow_set_del(fa.set[qc], fd); + sdu_sched_del(fa.sdu_sched, fd); msg.code = FLOW_ALLOC_CODE__FLOW_DEALLOC; @@ -296,7 +277,7 @@ int fa_alloc_resp(int fd, free(buf.data); return -1; } - flow_set_add(fa.set[qc], fd); + sdu_sched_add(fa.sdu_sched, fd); } pthread_rwlock_unlock(&fa.flows_lock); @@ -326,7 +307,6 @@ int fa_post_buf(cep_id_t cep_id, int ret = 0; int fd; flow_alloc_msg_t * msg; - qoscube_t qc; /* Depending on the message call the function in ipcp-dev.h */ @@ -393,9 +373,7 @@ int fa_post_buf(cep_id_t cep_id, fa.fd_to_cep_id[fd] = INVALID_CEP_ID; fa.cep_id_to_fd[cep_id] = -1; } else { - ipcp_flow_get_qoscube(fd, &qc); - flow_set_add(fa.set[qc], - fa.cep_id_to_fd[cep_id]); + sdu_sched_add(fa.sdu_sched, fa.cep_id_to_fd[cep_id]); } pthread_rwlock_unlock(&fa.flows_lock); @@ -403,8 +381,7 @@ int fa_post_buf(cep_id_t cep_id, break; case FLOW_ALLOC_CODE__FLOW_DEALLOC: fd = fa.cep_id_to_fd[cep_id]; - ipcp_flow_get_qoscube(fd, &qc); - flow_set_del(fa.set[qc], fd); + sdu_sched_del(fa.sdu_sched, fd); ret = flow_dealloc(fd); break; default: diff --git a/src/ipcpd/normal/sdu_sched.c b/src/ipcpd/normal/sdu_sched.c index 14fc672f..63259430 100644 --- a/src/ipcpd/normal/sdu_sched.c +++ b/src/ipcpd/normal/sdu_sched.c @@ -81,8 +81,7 @@ static void * sdu_reader(void * o) return (void *) 0; } -struct sdu_sched * sdu_sched_create(flow_set_t * set[QOS_CUBE_MAX], - next_sdu_t callback) +struct sdu_sched * sdu_sched_create(next_sdu_t callback) { struct sdu_sched * sdu_sched; int i; @@ -95,14 +94,20 @@ struct sdu_sched * sdu_sched_create(flow_set_t * set[QOS_CUBE_MAX], sdu_sched->callback = callback; for (i = 0; i < QOS_CUBE_MAX; ++i) { - sdu_sched->set[i] = set[i]; + sdu_sched->set[i] = flow_set_create(); + if (sdu_sched->set[i] == NULL) { + for (j = 0; j < i; ++j) + flow_set_destroy(sdu_sched->set[j]); + goto fail_sdu_sched; + } + } + for (i = 0; i < QOS_CUBE_MAX; ++i) { sdu_sched->fqs[i] = fqueue_create(); if (sdu_sched->fqs[i] == NULL) { - for (j = i; j >= 0; --j) + for (j = 0; j < i; ++j) fqueue_destroy(sdu_sched->fqs[j]); - free(sdu_sched); - return NULL; + goto fail_flow_set; } } @@ -112,6 +117,13 @@ struct sdu_sched * sdu_sched_create(flow_set_t * set[QOS_CUBE_MAX], (void *) sdu_sched); return sdu_sched; + + fail_flow_set: + for (i = 0; i < QOS_CUBE_MAX; ++i) + flow_set_destroy(sdu_sched->set[i]); + fail_sdu_sched: + free(sdu_sched); + return NULL; } void sdu_sched_destroy(struct sdu_sched * sdu_sched) @@ -124,8 +136,28 @@ void sdu_sched_destroy(struct sdu_sched * sdu_sched) pthread_join(sdu_sched->sdu_reader, NULL); - for (i = 0; i < QOS_CUBE_MAX; ++i) + for (i = 0; i < QOS_CUBE_MAX; ++i) { fqueue_destroy(sdu_sched->fqs[i]); + flow_set_destroy(sdu_sched->set[i]); + } free(sdu_sched); } + +void sdu_sched_add(struct sdu_sched * sdu_sched, + int fd) +{ + qoscube_t qc; + + ipcp_flow_get_qoscube(fd, &qc); + flow_set_add(sdu_sched->set[qc], fd); +} + +void sdu_sched_del(struct sdu_sched * sdu_sched, + int fd) +{ + qoscube_t qc; + + ipcp_flow_get_qoscube(fd, &qc); + flow_set_del(sdu_sched->set[qc], fd); +} diff --git a/src/ipcpd/normal/sdu_sched.h b/src/ipcpd/normal/sdu_sched.h index 1a22b041..3c95b683 100644 --- a/src/ipcpd/normal/sdu_sched.h +++ b/src/ipcpd/normal/sdu_sched.h @@ -30,9 +30,14 @@ typedef int (* next_sdu_t)(int fd, qoscube_t qc, struct shm_du_buff * sdb); -struct sdu_sched * sdu_sched_create(flow_set_t * set[QOS_CUBE_MAX], - next_sdu_t callback); +struct sdu_sched * sdu_sched_create(next_sdu_t callback); void sdu_sched_destroy(struct sdu_sched * sdu_sched); +void sdu_sched_add(struct sdu_sched * sdu_sched, + int fd); + +void sdu_sched_del(struct sdu_sched * sdu_sched, + int fd); + #endif /* OUROBOROS_IPCPD_NORMAL_SDU_SCHED_H */ |