diff options
| author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-08-03 13:40:16 +0200 | 
|---|---|---|
| committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-08-03 13:40:16 +0200 | 
| commit | 4931526cf9b5e40294e043deab856f25bf56c7cf (patch) | |
| tree | fff3eeadb6eb04edee21340ecdcdfc13da3115b4 /src/ipcpd/shim-eth-llc | |
| parent | ca494922f3815077efbcd28da3748df38c8a6961 (diff) | |
| download | ouroboros-4931526cf9b5e40294e043deab856f25bf56c7cf.tar.gz ouroboros-4931526cf9b5e40294e043deab856f25bf56c7cf.zip | |
lib: Revise blocking I/O
Blocking I/O now uses condition variables in the shared memory instead
of busy waiting. Timeouts can be specified. This requires the size of
the rbuffs and du_map to be the same, to guarantee that when the
shm_du_map is not full, the ap_rbuffs can't be full either.
Added the timeout option to the flow for future use.
Diffstat (limited to 'src/ipcpd/shim-eth-llc')
| -rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 18 | 
1 files changed, 9 insertions, 9 deletions
| diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 9e315335..f98799a5 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -386,7 +386,7 @@ static int eth_llc_ipcp_send_frame(uint8_t   dst_addr[MAC_SIZE],          shim_data(_ipcp)->tx_offset =                  (shim_data(_ipcp)->tx_offset + 1) -                & (SHM_BLOCKS_IN_MAP -1); +                & (SHM_BUFFER_SIZE -1);  #else          device = (shim_data(_ipcp))->device; @@ -719,7 +719,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                             MAC_SIZE) &&                      memcmp(br_addr, &llc_frame->dst_hwaddr, MAC_SIZE)) {  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                        offset = (offset + 1) & (SHM_BLOCKS_IN_MAP - 1); +                        offset = (offset + 1) & (SHM_BUFFER_SIZE - 1);                          header->tp_status = TP_STATUS_KERNEL;  #endif                          continue; @@ -730,7 +730,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                  if (ntohs(length) > SHIM_ETH_LLC_MAX_SDU_SIZE) {                          /* Not an LLC packet. */  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                        offset = (offset + 1) & (SHM_BLOCKS_IN_MAP - 1); +                        offset = (offset + 1) & (SHM_BUFFER_SIZE - 1);                          header->tp_status = TP_STATUS_KERNEL;  #endif                          continue; @@ -758,7 +758,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                                  pthread_rwlock_unlock(&_ipcp->state_lock);  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING)                                  offset = (offset + 1) -                                        & (SHM_BLOCKS_IN_MAP - 1); +                                        & (SHM_BUFFER_SIZE - 1);                                  header->tp_status = TP_STATUS_KERNEL;  #endif                                  continue; @@ -784,7 +784,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                          pthread_rwlock_unlock(&_ipcp->state_lock);                  }  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                offset = (offset + 1) & (SHM_BLOCKS_IN_MAP -1); +                offset = (offset + 1) & (SHM_BUFFER_SIZE -1);                  header->tp_status = TP_STATUS_KERNEL;  #endif          } @@ -1009,8 +1009,8 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          req.tp_block_size = SHM_DU_BUFF_BLOCK_SIZE;          req.tp_frame_size = SHM_DU_BUFF_BLOCK_SIZE; -        req.tp_block_nr = SHM_BLOCKS_IN_MAP; -        req.tp_frame_nr = SHM_BLOCKS_IN_MAP; +        req.tp_block_nr = SHM_BUFFER_SIZE; +        req.tp_frame_nr = SHM_BUFFER_SIZE;          if (setsockopt(fd, SOL_PACKET, PACKET_RX_RING,                         (void *) &req, sizeof(req))) { @@ -1036,7 +1036,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING)          shim_data(_ipcp)->rx_ring = mmap(NULL,                                           2 * SHM_DU_BUFF_BLOCK_SIZE -                                         * SHM_BLOCKS_IN_MAP, +                                         * SHM_BUFFER_SIZE,                                           PROT_READ | PROT_WRITE, MAP_SHARED,                                           fd, 0);          if (shim_data(_ipcp)->rx_ring == NULL) { @@ -1045,7 +1045,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)                  return -1;          }          shim_data(_ipcp)->tx_ring = shim_data(_ipcp)->rx_ring -                + (SHM_DU_BUFF_BLOCK_SIZE * SHM_BLOCKS_IN_MAP); +                + (SHM_DU_BUFF_BLOCK_SIZE * SHM_BUFFER_SIZE);  #endif | 
