diff options
Diffstat (limited to 'src/ipcpd')
| -rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 33 | ||||
| -rw-r--r-- | src/ipcpd/shim-udp/main.c | 33 | 
2 files changed, 35 insertions, 31 deletions
| diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 6046d939..836144ea 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -115,6 +115,7 @@ struct {          int                tx_offset;  #endif          flow_set_t *       np1_flows; +        fqueue_t *         fq;          int *              ef_to_fd;          struct ef *        fd_to_ef;          pthread_rwlock_t   flows_lock; @@ -152,6 +153,15 @@ static int eth_llc_data_init(void)                  return -ENOMEM;          } +        eth_llc_data.fq = fqueue_create(); +        if (eth_llc_data.fq == NULL) { +                flow_set_destroy(eth_llc_data.np1_flows); +                bmp_destroy(eth_llc_data.saps); +                free(eth_llc_data.ef_to_fd); +                free(eth_llc_data.fd_to_ef); +                return -ENOMEM; +        } +          for (i = 0; i < MAX_SAPS; ++i)                  eth_llc_data.ef_to_fd[i] = -1; @@ -170,6 +180,7 @@ void eth_llc_data_fini(void)  {          bmp_destroy(eth_llc_data.saps);          flow_set_destroy(eth_llc_data.np1_flows); +        fqueue_destroy(eth_llc_data.fq);          free(eth_llc_data.fd_to_ef);          free(eth_llc_data.ef_to_fd);          pthread_rwlock_destroy(ð_llc_data.flows_lock); @@ -605,20 +616,16 @@ static void * eth_llc_ipcp_sdu_writer(void * o)          uint8_t dsap;          uint8_t r_addr[MAC_SIZE];          struct timespec timeout = {0, EVENT_WAIT_TIMEOUT * 1000}; -        fqueue_t * fq = fqueue_create(); -        if (fq == NULL) -                return (void *) 1;          (void) o;          while (true) { -                int ret = flow_event_wait(eth_llc_data.np1_flows, fq, &timeout); -                if (ret == -ETIMEDOUT) +                if (flow_event_wait(eth_llc_data.np1_flows, +                                    eth_llc_data.fq, +                                    &timeout) == -ETIMEDOUT)                          continue; -                assert(!ret); - -                while ((fd = fqueue_next(fq)) >= 0) { +                while ((fd = fqueue_next(eth_llc_data.fq)) >= 0) {                          if (ipcp_flow_read(fd, &sdb)) {                                  LOG_ERR("Bad read from fd %d.", fd);                                  continue; @@ -686,13 +693,11 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          struct tpacket_req req;  #endif -        if (conf == NULL) -                return -1; /* -EINVAL */ +        assert(conf); +        assert(conf->type == THIS_TYPE); -        if (conf->type != THIS_TYPE) { -                LOG_ERR("Config doesn't match IPCP type."); -                return -1; -        } +        /* this IPCP doesn't need to maintain its dif_name */ +        free(conf->dif_name);          if (conf->if_name == NULL) {                  LOG_ERR("Interface name is NULL."); diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index 62e1b2d0..5abe0050 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -79,6 +79,7 @@ struct {          int                s_fd;          flow_set_t *       np1_flows; +        fqueue_t *         fq;          fd_set             flow_fd_s;          /* bidir mappings of (n - 1) file descriptor to (n) flow descriptor */          int                uf_to_fd[FD_SETSIZE]; @@ -112,6 +113,12 @@ static int udp_data_init(void)          if (udp_data.np1_flows == NULL)                  return -ENOMEM; +        udp_data.fq = fqueue_create(); +        if (udp_data.fq == NULL) { +                flow_set_destroy(udp_data.np1_flows); +                return -ENOMEM; +        } +          pthread_rwlock_init(&udp_data.flows_lock, NULL);          pthread_cond_init(&udp_data.fd_set_cond, NULL);          pthread_mutex_init(&udp_data.fd_set_lock, NULL); @@ -122,6 +129,7 @@ static int udp_data_init(void)  static void udp_data_fini(void)  {          flow_set_destroy(udp_data.np1_flows); +        fqueue_destroy(udp_data.fq);          pthread_rwlock_destroy(&udp_data.flows_lock);          pthread_mutex_destroy(&udp_data.fd_set_lock); @@ -523,23 +531,16 @@ static void * ipcp_udp_sdu_loop(void * o)          int fd;          struct timespec timeout = {0, FD_UPDATE_TIMEOUT * 1000};          struct shm_du_buff * sdb; -        fqueue_t * fq = fqueue_create(); -        if (fq == NULL) -                return (void *) 1;          (void) o;          while (true) { -                int ret = flow_event_wait(udp_data.np1_flows, fq, &timeout); -                if (ret == -ETIMEDOUT) -                        continue; - -                if (ret < 0) { -                        LOG_ERR("Event wait returned error code %d.", -ret); +                if (flow_event_wait(udp_data.np1_flows, +                                    udp_data.fq, +                                    &timeout)  == -ETIMEDOUT)                          continue; -                } -                while ((fd = fqueue_next(fq)) >= 0) { +                while ((fd = fqueue_next(udp_data.fq)) >= 0) {                          if (ipcp_flow_read(fd, &sdb)) {                                  LOG_ERR("Bad read from fd %d.", fd);                                  continue; @@ -594,13 +595,11 @@ static int ipcp_udp_bootstrap(struct dif_config * conf)          int  enable = 1;          int  fd = -1; -        if (conf == NULL) -                return -1; /* -EINVAL */ +        assert(conf); +        assert(conf->type == THIS_TYPE); -        if (conf->type != THIS_TYPE) { -                LOG_ERR("Config doesn't match IPCP type."); -                return -1; -        } +        /* this IPCP doesn't need to maintain its dif_name */ +        free(conf->dif_name);          if (inet_ntop(AF_INET,                        &conf->ip_addr, | 
