diff options
| author | Sander Vrijders <sander.vrijders@ugent.be> | 2017-04-04 15:20:04 +0200 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@ugent.be> | 2017-04-04 15:22:55 +0200 | 
| commit | 444053de1c83dfb086df6d87944b6935fd446d18 (patch) | |
| tree | 9c2100234991c0e2f3fb9cad1f77d756b4027117 /src/ipcpd/shim-eth-llc | |
| parent | 644333c8b3f8357b32dd63167d5bbea1ae460c1e (diff) | |
| download | ouroboros-444053de1c83dfb086df6d87944b6935fd446d18.tar.gz ouroboros-444053de1c83dfb086df6d87944b6935fd446d18.zip | |
ipcpd: shim-eth-llc: Deprecate PACKET_RX|TX_RING
This deprecates these special socket options of the raw socket since
they are less efficient for regular packet I/O. They should be more
performant for batch processing of SDUs.
Diffstat (limited to 'src/ipcpd/shim-eth-llc')
| -rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 214 | 
1 files changed, 11 insertions, 203 deletions
| diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 651429e6..997d22a1 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -103,12 +103,6 @@ struct {          int                s_fd;          struct bmp *       saps; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        uint8_t *          rx_ring; -        uint8_t *          tx_ring; -        int                tx_offset; -        pthread_mutex_t    tx_lock; -#endif          flow_set_t *       np1_flows;          fqueue_t *         fq;          int *              ef_to_fd; @@ -179,17 +173,8 @@ static int eth_llc_data_init(void)          if (pthread_cond_init(ð_llc_data.mgmt_frame_cond, NULL))                  goto mgmt_frame_lock_destroy; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        if (pthread_mutex_init(ð_llc_data.tx_lock, NULL)) -                goto mgmt_frame_cond_destroy; -#endif -          return 0; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) - mgmt_frame_cond_destroy: -        pthread_cond_destroy(ð_llc_data.mgmt_frame_cond); -#endif   mgmt_frame_lock_destroy:          pthread_mutex_destroy(ð_llc_data.mgmt_frame_lock);   flow_lock_destroy: @@ -210,9 +195,6 @@ static int eth_llc_data_init(void)  void eth_llc_data_fini(void)  { -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        pthread_mutex_destroy(ð_llc_data.tx_lock); -#endif          pthread_cond_destroy(ð_llc_data.mgmt_frame_cond);          pthread_mutex_destroy(ð_llc_data.mgmt_frame_lock);          pthread_rwlock_destroy(ð_llc_data.flows_lock); @@ -241,13 +223,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,          uint32_t frame_len = 0;          uint8_t cf = 0x03;          uint16_t length; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        struct pollfd pfd; -        struct tpacket_hdr * header; -        uint8_t * frame; -#else          uint8_t frame[SHIM_ETH_LLC_MAX_SDU_SIZE]; -#endif          struct eth_llc_frame * llc_frame;          if (payload == NULL) { @@ -258,37 +234,6 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,          if (len > SHIM_ETH_LLC_MAX_SDU_SIZE)                  return -1; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        pthread_mutex_lock(ð_llc_data.tx_lock); - -        header = (void *) (eth_llc_data.tx_ring + -                           eth_llc_data.tx_offset * SHM_RDRB_BLOCK_SIZE); - -        while (header->tp_status != TP_STATUS_AVAILABLE) { -                pfd.fd = eth_llc_data.s_fd; -                pfd.revents = 0; -                pfd.events = POLLIN | POLLRDNORM | POLLERR; - -                pthread_mutex_unlock(ð_llc_data.tx_lock); - -                if (poll(&pfd, 1, -1) <= 0) { -                        log_err("Failed to poll."); -                        pthread_mutex_lock(ð_llc_data.tx_lock); -                        continue; -                } - -                pthread_mutex_lock(ð_llc_data.tx_lock); - -                header = (void *) (eth_llc_data.tx_ring -                                   + eth_llc_data.tx_offset -                                   * SHM_RDRB_BLOCK_SIZE); -        } - -        frame = (uint8_t *) header -                + TPACKET_HDRLEN - sizeof(struct sockaddr_ll); - -        pthread_mutex_unlock(ð_llc_data.tx_lock); -#endif          llc_frame = (struct eth_llc_frame *) frame;          memcpy(llc_frame->dst_hwaddr, dst_addr, MAC_SIZE); @@ -309,23 +254,6 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,          frame_len = ETH_HEADER_SIZE + LLC_HEADER_SIZE + len; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        pthread_mutex_lock(ð_llc_data.tx_lock); - -        header->tp_len = frame_len; -        header->tp_status = TP_STATUS_SEND_REQUEST; - -        if (send(eth_llc_data.s_fd, NULL, 0, MSG_DONTWAIT) < 0) { -                pthread_mutex_unlock(ð_llc_data.tx_lock); -                log_err("Failed to write frame into TX_RING."); -                return -1; -        } - -        eth_llc_data.tx_offset = -                (eth_llc_data.tx_offset + 1) & ((SHM_BUFFER_SIZE) - 1); - -        pthread_mutex_unlock(ð_llc_data.tx_lock); -#else          if (sendto(eth_llc_data.s_fd,                     frame,                     frame_len, @@ -335,7 +263,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,                  log_err("Failed to send message.");                  return -1;          } -#endif +          return 0;  } @@ -571,20 +499,13 @@ static void * eth_llc_ipcp_mgmt_frame_handler(void * o)  static void * eth_llc_ipcp_sdu_reader(void * o)  { -        uint8_t br_addr[MAC_SIZE]; -        uint16_t length; -        uint8_t dsap; -        uint8_t ssap; -        int fd; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        struct pollfd pfd; -        int offset = 0; -        struct tpacket_hdr * header; -        uint8_t * buf = NULL; -#else -        uint8_t buf[ETH_FRAME_SIZE]; -        int frame_len = 0; -#endif +        uint8_t                br_addr[MAC_SIZE]; +        uint16_t               length; +        uint8_t                dsap; +        uint8_t                ssap; +        int                    fd; +        uint8_t                buf[ETH_FRAME_SIZE]; +        int                    frame_len = 0;          struct eth_llc_frame * llc_frame;          (void) o; @@ -592,42 +513,13 @@ static void * eth_llc_ipcp_sdu_reader(void * o)          memset(br_addr, 0xff, MAC_SIZE * sizeof(uint8_t));          while (true) { -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                pthread_mutex_lock(ð_llc_data.tx_lock); - -                header = (void *) (eth_llc_data.rx_ring + -                                   offset * SHM_RDRB_BLOCK_SIZE); - -                while (!(header->tp_status & TP_STATUS_USER)) { -                        pfd.fd = eth_llc_data.s_fd; -                        pfd.revents = 0; -                        pfd.events = POLLIN | POLLRDNORM | POLLERR; - -                        pthread_mutex_unlock(ð_llc_data.tx_lock); - -                        if (poll(&pfd, 1, -1) <= 0) { -                                log_err("Failed to poll."); -                                pthread_mutex_lock(ð_llc_data.tx_lock); -                                continue; -                        } - -                        pthread_mutex_lock(ð_llc_data.tx_lock); - -                        header = (void *) (eth_llc_data.rx_ring + -                                           offset * SHM_RDRB_BLOCK_SIZE); -                } - -                buf = (uint8_t * ) header + header->tp_mac; - -                pthread_mutex_unlock(ð_llc_data.tx_lock); -#else                  frame_len = recv(eth_llc_data.s_fd, buf,                                   SHIM_ETH_LLC_MAX_SDU_SIZE, 0);                  if (frame_len < 0) {                          log_err("Failed to receive frame.");                          continue;                  } -#endif +                  llc_frame = (struct eth_llc_frame *) buf;  #ifdef __FreeBSD__ @@ -637,28 +529,15 @@ static void * eth_llc_ipcp_sdu_reader(void * o)  #endif                             llc_frame->dst_hwaddr,                             MAC_SIZE) && -                    memcmp(br_addr, llc_frame->dst_hwaddr, MAC_SIZE)) { -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                        offset = (offset + 1) & ((SHM_BUFFER_SIZE) - 1); -                        header->tp_status = TP_STATUS_KERNEL; -#endif +                           memcmp(br_addr, llc_frame->dst_hwaddr, MAC_SIZE)) {                          continue;                  }                  memcpy(&length, &llc_frame->length, sizeof(length));                  length = ntohs(length); -                if (length > 0x05FF) { /* DIX */ -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                        pthread_mutex_lock(ð_llc_data.tx_lock); - -                        offset = (offset + 1) & ((SHM_BUFFER_SIZE) -1); -                        header->tp_status = TP_STATUS_KERNEL; - -                        pthread_mutex_unlock(ð_llc_data.tx_lock); -#endif +                if (length > 0x05FF)  /* DIX */                          continue; -                }                  length -= LLC_HEADER_SIZE; @@ -683,14 +562,6 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                          fd = eth_llc_data.ef_to_fd[dsap];                          if (fd < 0) {                                  pthread_rwlock_unlock(ð_llc_data.flows_lock); -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                                pthread_mutex_lock(ð_llc_data.tx_lock); - -                                offset = (offset + 1) & ((SHM_BUFFER_SIZE) - 1); -                                header->tp_status = TP_STATUS_KERNEL; - -                                pthread_mutex_unlock(ð_llc_data.tx_lock); -#endif                                  continue;                          } @@ -698,14 +569,6 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                              || memcmp(eth_llc_data.fd_to_ef[fd].r_addr,                                        llc_frame->src_hwaddr, MAC_SIZE)) {                                  pthread_rwlock_unlock(ð_llc_data.flows_lock); -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                                pthread_mutex_lock(ð_llc_data.tx_lock); - -                                offset = (offset + 1) & ((SHM_BUFFER_SIZE) -1); -                                header->tp_status = TP_STATUS_KERNEL; - -                                pthread_mutex_unlock(ð_llc_data.tx_lock); -#endif                                  continue;                          } @@ -713,14 +576,6 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                          flow_write(fd, &llc_frame->payload, length);                  } -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -                pthread_mutex_lock(ð_llc_data.tx_lock); - -                offset = (offset + 1) & ((SHM_BUFFER_SIZE) - 1); -                header->tp_status = TP_STATUS_KERNEL; - -                pthread_mutex_unlock(ð_llc_data.tx_lock); -#endif          }          return (void *) 0; @@ -815,10 +670,6 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          struct sockaddr_ll device;  #endif -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        struct tpacket_req req; -#endif -          assert(conf);          assert(conf->type == THIS_TYPE); @@ -896,52 +747,12 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)                  return -1;          } -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        if (SHIM_ETH_LLC_MAX_SDU_SIZE > SHM_RDRB_BLOCK_SIZE) { -                log_err("Max SDU size is bigger than DU map block size."); -                close(skfd); -                return -1; -        } - -        req.tp_block_size = SHM_RDRB_BLOCK_SIZE; -        req.tp_frame_size = SHM_RDRB_BLOCK_SIZE; -        req.tp_block_nr = SHM_BUFFER_SIZE; -        req.tp_frame_nr = SHM_BUFFER_SIZE; - -        if (setsockopt(skfd, SOL_PACKET, PACKET_RX_RING, -                       (void *) &req, sizeof(req))) { -                log_err("Failed to set sockopt PACKET_RX_RING"); -                close(skfd); -                return -1; -        } - -        if (setsockopt(skfd, SOL_PACKET, PACKET_TX_RING, -                       (void *) &req, sizeof(req))) { -                log_err("Failed to set sockopt PACKET_TX_RING"); -                close(skfd); -                return -1; -        } -#endif          if (bind(skfd, (struct sockaddr *) &device, sizeof(device))) {                  log_err("Failed to bind socket to interface");                  close(skfd);                  return -1;          } -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        eth_llc_data.rx_ring = mmap(NULL, 2 * SHM_RDRB_BLOCK_SIZE -                                    * (SHM_BUFFER_SIZE), -                                    PROT_READ | PROT_WRITE, MAP_SHARED, -                                    skfd, 0); -        if (eth_llc_data.rx_ring == NULL) { -                log_err("Failed to mmap"); -                close(skfd); -                return -1; -        } - -        eth_llc_data.tx_ring = eth_llc_data.rx_ring -                + SHM_RDRB_BLOCK_SIZE * (SHM_BUFFER_SIZE); -#endif          pthread_rwlock_wrlock(&ipcpi.state_lock);          if (ipcp_get_state() != IPCP_INIT) { @@ -952,9 +763,6 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          eth_llc_data.s_fd = skfd;          eth_llc_data.device = device; -#if defined(PACKET_RX_RING) && defined(PACKET_TX_RING) -        eth_llc_data.tx_offset = 0; -#endif          ipcp_set_state(IPCP_OPERATIONAL); | 
