diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-09-06 10:29:02 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-09-07 13:58:21 +0200 |
commit | 2cf4f88fc8b957c15ae93a2eb3e56ebdb07a0381 (patch) | |
tree | 1b3bd39aa4b84132559cc8032024f44a1e9c8015 /src/lib | |
parent | ee2235c62cf0c51f7188fdeb6ac283c1e2ea0335 (diff) | |
download | ouroboros-2cf4f88fc8b957c15ae93a2eb3e56ebdb07a0381.tar.gz ouroboros-2cf4f88fc8b957c15ae93a2eb3e56ebdb07a0381.zip |
ipcpd: normal: Add operations to get and set the PCI
This adds the operations needed in the normal IPCP to get and set the
Protocol Control Information. It allows to allocate or release space
in the current DU. The struct pci can be serialized into newly
allocate space. Vice versa, a struct pci can be deserialized given a
DU. It allows for decreasing the TTL in the DU and for calculating the
CRC32. The TTL and CRC32 can now be selected when creating a new DIF.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/dif_config.proto | 4 | ||||
-rw-r--r-- | src/lib/irm.c | 8 | ||||
-rw-r--r-- | src/lib/shm_rdrbuff.c | 117 |
3 files changed, 35 insertions, 94 deletions
diff --git a/src/lib/dif_config.proto b/src/lib/dif_config.proto index dbdf19e5..338634d1 100644 --- a/src/lib/dif_config.proto +++ b/src/lib/dif_config.proto @@ -7,8 +7,8 @@ message dif_config_msg { optional uint32 pdu_length_size = 5; optional uint32 qos_id_size = 6; optional uint32 seqno_size = 7; - optional uint32 ttl_size = 8; - optional uint32 chk_size = 9; + optional bool has_ttl = 8; + optional bool has_chk = 9; optional uint32 min_pdu_size = 10; optional uint32 max_pdu_size = 11; // Config for shim UDP diff --git a/src/lib/irm.c b/src/lib/irm.c index 64a4fa0f..fce11ba5 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -115,8 +115,8 @@ int irm_bootstrap_ipcp(pid_t api, config.has_pdu_length_size = true; config.has_qos_id_size = true; config.has_seqno_size = true; - config.has_ttl_size = true; - config.has_chk_size = true; + config.has_has_ttl = true; + config.has_has_chk = true; config.has_min_pdu_size = true; config.has_max_pdu_size = true; @@ -125,8 +125,8 @@ int irm_bootstrap_ipcp(pid_t api, config.pdu_length_size = conf->pdu_length_size; config.qos_id_size = conf->qos_id_size; config.seqno_size = conf->seqno_size; - config.ttl_size = conf->ttl_size; - config.chk_size = conf->chk_size; + config.has_ttl = conf->has_ttl; + config.has_chk = conf->has_chk; config.min_pdu_size = conf->min_pdu_size; config.max_pdu_size = conf->max_pdu_size; break; diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c index 93a889ce..b0d295d9 100644 --- a/src/lib/shm_rdrbuff.c +++ b/src/lib/shm_rdrbuff.c @@ -690,32 +690,32 @@ int shm_rdrbuff_remove(struct shm_rdrbuff * rdrb, ssize_t idx) return 0; } -uint8_t * shm_du_buff_head_alloc(struct shm_rdrbuff * rdrb, - ssize_t idx, - size_t size) +uint8_t * shm_du_buff_head(struct shm_du_buff * sdb) { - struct shm_du_buff * sdb; - uint8_t * buf; - - if (rdrb == NULL) + if (sdb == NULL) return NULL; - if (idx < 0 || idx > SHM_BUFFER_SIZE) + return (uint8_t *) (sdb + 1) + sdb->du_head; +} + +uint8_t * shm_du_buff_tail(struct shm_du_buff * sdb) +{ + if (sdb == NULL) return NULL; -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) { - LOG_DBGF("Recovering dead mutex."); - pthread_mutex_consistent(rdrb->lock); - } -#endif - sdb = idx_to_du_buff_ptr(rdrb, idx); + return (uint8_t *) (sdb + 1) + sdb->du_tail; +} + +uint8_t * shm_du_buff_head_alloc(struct shm_du_buff * sdb, + size_t size) +{ + uint8_t * buf = NULL; + + if (sdb == NULL) + return NULL; if ((long) (sdb->du_head - size) < 0) { - pthread_mutex_unlock(rdrb->lock); - LOG_DBGF("Failed to allocate PCI headspace."); + LOG_ERR("Failed to allocate PCI headspace."); return NULL; } @@ -723,37 +723,19 @@ uint8_t * shm_du_buff_head_alloc(struct shm_rdrbuff * rdrb, buf = (uint8_t *) (sdb + 1) + sdb->du_head; - pthread_mutex_unlock(rdrb->lock); - return buf; } -uint8_t * shm_du_buff_tail_alloc(struct shm_rdrbuff * rdrb, - ssize_t idx, +uint8_t * shm_du_buff_tail_alloc(struct shm_du_buff * sdb, size_t size) { - struct shm_du_buff * sdb; - uint8_t * buf; - - if (rdrb == NULL) - return NULL; + uint8_t * buf = NULL; - if (idx < 0 || idx > SHM_BUFFER_SIZE) + if (sdb == NULL) return NULL; -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) { - LOG_DBGF("Recovering dead mutex."); - pthread_mutex_consistent(rdrb->lock); - } -#endif - sdb = idx_to_du_buff_ptr(rdrb, idx); - if (sdb->du_tail + size >= sdb->size) { - pthread_mutex_unlock(rdrb->lock); - LOG_DBGF("Failed to allocate PCI tailspace."); + LOG_ERR("Failed to allocate PCI tailspace."); return NULL; } @@ -761,78 +743,37 @@ uint8_t * shm_du_buff_tail_alloc(struct shm_rdrbuff * rdrb, sdb->du_tail += size; - pthread_mutex_unlock(rdrb->lock); - return buf; } -int shm_du_buff_head_release(struct shm_rdrbuff * rdrb, - ssize_t idx, +int shm_du_buff_head_release(struct shm_du_buff * sdb, size_t size) { - struct shm_du_buff * sdb; - - if (rdrb == NULL) - return -1; - - if (idx < 0 || idx > SHM_BUFFER_SIZE) + if (sdb == NULL) return -1; -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) { - LOG_DBGF("Recovering dead mutex."); - pthread_mutex_consistent(rdrb->lock); - } -#endif - - sdb = idx_to_du_buff_ptr(rdrb, idx); - if (size > sdb->du_tail - sdb->du_head) { - pthread_mutex_unlock(rdrb->lock); - LOG_DBGF("Tried to release beyond sdu boundary."); + LOG_DBGF("Tried to release beyond SDU boundary."); return -EOVERFLOW; } sdb->du_head += size; - pthread_mutex_unlock(rdrb->lock); - return 0; } -int shm_du_buff_tail_release(struct shm_rdrbuff * rdrb, - ssize_t idx, +int shm_du_buff_tail_release(struct shm_du_buff * sdb, size_t size) { - struct shm_du_buff * sdb; - - if (rdrb == NULL) - return -1; - - if (idx < 0 || idx > SHM_BUFFER_SIZE) + if (sdb == NULL) return -1; -#ifdef __APPLE__ - pthread_mutex_lock(rdrb->lock); -#else - if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) { - LOG_DBGF("Recovering dead mutex."); - pthread_mutex_consistent(rdrb->lock); - } -#endif - sdb = idx_to_du_buff_ptr(rdrb, idx); - if (size > sdb->du_tail - sdb->du_head) { - pthread_mutex_unlock(rdrb->lock); - LOG_DBGF("Tried to release beyond sdu boundary."); + LOG_ERR("Tried to release beyond SDU boundary."); return -EOVERFLOW; } sdb->du_tail -= size; - pthread_mutex_unlock(rdrb->lock); - return 0; } |