diff options
Diffstat (limited to 'src/ipcpd/shim-eth-llc')
| -rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 127 | 
1 files changed, 58 insertions, 69 deletions
| diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index fba4f5f3..35ec0297 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -207,7 +207,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,          struct eth_llc_frame * llc_frame;          if (payload == NULL) { -                LOG_ERR("Payload was NULL."); +                log_err("Payload was NULL.");                  return -1;          } @@ -224,7 +224,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,                  pfd.events = POLLIN | POLLRDNORM | POLLERR;                  if (poll(&pfd, 1, -1) <= 0) { -                        LOG_ERR("Failed to poll."); +                        log_err("Failed to poll.");                          continue;                  } @@ -261,7 +261,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,          header->tp_status = TP_STATUS_SEND_REQUEST;          if (send(eth_llc_data.s_fd, NULL, 0, MSG_DONTWAIT) < 0) { -                LOG_ERR("Failed to write frame into TX_RING."); +                log_err("Failed to write frame into TX_RING.");                  return -1;          } @@ -274,7 +274,7 @@ static int eth_llc_ipcp_send_frame(uint8_t * dst_addr,                     0,                     (struct sockaddr *) ð_llc_data.device,                     sizeof(eth_llc_data.device)) <= 0) { -                LOG_ERR("Failed to send message."); +                log_err("Failed to send message.");                  return -1;          }  #endif @@ -299,7 +299,7 @@ static int eth_llc_ipcp_send_mgmt_frame(shim_eth_llc_msg_t * msg,          if (eth_llc_ipcp_send_frame(dst_addr, reverse_bits(MGMT_SAP),                                      reverse_bits(MGMT_SAP), buf, len)) { -                LOG_ERR("Failed to send management frame."); +                log_err("Failed to send management frame.");                  free(buf);                  return -1;          } @@ -362,7 +362,7 @@ static int eth_llc_ipcp_sap_req(uint8_t   r_sap,          if (fd < 0) {                  pthread_rwlock_unlock(ð_llc_data.flows_lock);                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_ERR("Could not get new flow from IRMd."); +                log_err("Could not get new flow from IRMd.");                  return -1;          } @@ -372,7 +372,7 @@ static int eth_llc_ipcp_sap_req(uint8_t   r_sap,          pthread_rwlock_unlock(ð_llc_data.flows_lock);          pthread_rwlock_unlock(&ipcpi.state_lock); -        LOG_DBG("New flow request, fd %d, remote SAP %d.", fd, r_sap); +        log_dbg("New flow request, fd %d, remote SAP %d.", fd, r_sap);          return 0;  } @@ -392,7 +392,7 @@ static int eth_llc_ipcp_sap_alloc_reply(uint8_t   ssap,          if (fd < 0) {                  pthread_rwlock_unlock(& eth_llc_data.flows_lock);                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_ERR("No flow found with that SAP."); +                log_err("No flow found with that SAP.");                  return -1; /* -EFLOWNOTFOUND */          } @@ -406,7 +406,7 @@ static int eth_llc_ipcp_sap_alloc_reply(uint8_t   ssap,          pthread_rwlock_unlock(ð_llc_data.flows_lock);          pthread_rwlock_unlock(&ipcpi.state_lock); -        LOG_DBG("Flow reply, fd %d, SSAP %d, DSAP %d.", fd, ssap, dsap); +        log_dbg("Flow reply, fd %d, SSAP %d, DSAP %d.", fd, ssap, dsap);          if ((ret = ipcp_flow_alloc_reply(fd, response)) < 0)                  return -1; @@ -459,7 +459,7 @@ static int eth_llc_ipcp_mgmt_frame(uint8_t * buf,  {          shim_eth_llc_msg_t * msg = shim_eth_llc_msg__unpack(NULL, len, buf);          if (msg == NULL) { -                LOG_ERR("Failed to unpack."); +                log_err("Failed to unpack.");                  return -1;          } @@ -486,7 +486,7 @@ static int eth_llc_ipcp_mgmt_frame(uint8_t * buf,                  eth_llc_ipcp_name_query_reply(msg->dst_name, r_addr);                  break;          default: -                LOG_ERR("Unknown message received %d.", msg->code); +                log_err("Unknown message received %d.", msg->code);                  shim_eth_llc_msg__free_unpacked(msg, NULL);                  return -1;          } @@ -527,7 +527,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                          pfd.events = POLLIN | POLLRDNORM | POLLERR;                          if (poll(&pfd, 1, -1) <= 0) { -                                LOG_ERR("Failed to poll."); +                                log_err("Failed to poll.");                                  continue;                          } @@ -540,7 +540,7 @@ static void * eth_llc_ipcp_sdu_reader(void * o)                  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."); +                        log_err("Failed to receive frame.");                          continue;                  }  #endif @@ -641,7 +641,7 @@ static void * eth_llc_ipcp_sdu_writer(void * o)                  while ((fd = fqueue_next(eth_llc_data.fq)) >= 0) {                          if (ipcp_flow_read(fd, &sdb)) { -                                LOG_ERR("Bad read from fd %d.", fd); +                                log_err("Bad read from fd %d.", fd);                                  continue;                          } @@ -715,7 +715,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          assert(conf->type == THIS_TYPE);          if (conf->if_name == NULL) { -                LOG_ERR("Interface name is NULL."); +                log_err("Interface name is NULL.");                  return -1;          } @@ -725,20 +725,20 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)  #ifdef __FreeBSD__          if (getifaddrs(&ifaddr) < 0)  { -                LOG_ERR("Could not get interfaces."); +                log_err("Could not get interfaces.");                  return -1;          }          for (ifa = ifaddr, idx = 0; ifa != NULL; ifa = ifa->ifa_next, ++idx) {                  if (strcmp(ifa->ifa_name, conf->if_name))                          continue; -                LOG_DBG("Interface %s found.", conf->if_name); +                log_dbg("Interface %s found.", conf->if_name);                  memcpy(&ifr.ifr_addr, ifa->ifa_addr, sizeof(*ifa->ifa_addr));                  break;          }          if (ifa == NULL) { -                LOG_ERR("Interface not found."); +                log_err("Interface not found.");                  freeifaddrs(ifaddr);                  return -1;          } @@ -747,12 +747,12 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)  #else          skfd = socket(AF_UNIX, SOCK_STREAM, 0);          if (skfd < 0) { -                LOG_ERR("Failed to open socket."); +                log_err("Failed to open socket.");                  return -1;          }          if (ioctl(skfd, SIOCGIFHWADDR, &ifr)) { -                LOG_ERR("Failed to ioctl."); +                log_err("Failed to ioctl.");                  close(skfd);                  return -1;          } @@ -761,7 +761,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          idx = if_nametoindex(conf->if_name);          if (idx == 0) { -                LOG_ERR("Failed to retrieve interface index."); +                log_err("Failed to retrieve interface index.");                  close(skfd);                  return -1;          } @@ -785,13 +785,13 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          skfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_802_2));  #endif          if (skfd < 0) { -                LOG_ERR("Failed to create socket."); +                log_err("Failed to create socket.");                  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."); +                log_err("Max SDU size is bigger than DU map block size.");                  close(skfd);                  return -1;          } @@ -803,20 +803,20 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          if (setsockopt(skfd, SOL_PACKET, PACKET_RX_RING,                         (void *) &req, sizeof(req))) { -                LOG_ERR("Failed to set sockopt PACKET_RX_RING"); +                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"); +                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"); +                log_err("Failed to bind socket to interface");                  close(skfd);                  return -1;          } @@ -827,7 +827,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)                                      PROT_READ | PROT_WRITE, MAP_SHARED,                                      skfd, 0);          if (eth_llc_data.rx_ring == NULL) { -                LOG_ERR("Failed to mmap"); +                log_err("Failed to mmap");                  close(skfd);                  return -1;          } @@ -839,7 +839,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          if (ipcp_get_state() != IPCP_INIT) {                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_ERR("IPCP in wrong state."); +                log_err("IPCP in wrong state.");                  return -1;          } @@ -863,7 +863,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          pthread_rwlock_unlock(&ipcpi.state_lock); -        LOG_DBG("Bootstrapped shim IPCP over Ethernet with LLC with api %d.", +        log_dbg("Bootstrapped shim IPCP over Ethernet with LLC with api %d.",                  getpid());          return 0; @@ -873,7 +873,7 @@ static int eth_llc_ipcp_name_reg(char * name)  {          char * name_dup = strdup(name);          if (name_dup == NULL) { -                LOG_ERR("Failed to duplicate name."); +                log_err("Failed to duplicate name.");                  return -ENOMEM;          } @@ -881,14 +881,14 @@ static int eth_llc_ipcp_name_reg(char * name)          if (shim_data_reg_add_entry(ipcpi.shim_data, name_dup)) {                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_ERR("Failed to add %s to local registry.", name); +                log_err("Failed to add %s to local registry.", name);                  free(name_dup);                  return -1;          }          pthread_rwlock_unlock(&ipcpi.state_lock); -        LOG_DBG("Registered %s.", name); +        log_dbg("Registered %s.", name);          return 0;  } @@ -949,13 +949,13 @@ static int eth_llc_ipcp_flow_alloc(int       fd,          uint8_t r_addr[MAC_SIZE];          uint64_t addr = 0; -        LOG_DBG("Allocating flow to %s.", dst_name); +        log_dbg("Allocating flow to %s.", dst_name);          if (dst_name == NULL || src_ae_name == NULL)                  return -1;          if (cube != QOS_CUBE_BE && cube != QOS_CUBE_FRC) { -                LOG_DBG("Unsupported QoS requested."); +                log_dbg("Unsupported QoS requested.");                  return -1;          } @@ -963,13 +963,13 @@ static int eth_llc_ipcp_flow_alloc(int       fd,          if (ipcp_get_state() != IPCP_OPERATIONAL) {                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_DBG("Won't allocate flow with non-enrolled IPCP."); +                log_dbg("Won't allocate flow with non-enrolled IPCP.");                  return -1; /* -ENOTENROLLED */          }          if (!shim_data_dir_has(ipcpi.shim_data, dst_name)) {                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_ERR("Destination unreachable."); +                log_err("Destination unreachable.");                  return -1;          }          addr = shim_data_dir_get_addr(ipcpi.shim_data, dst_name); @@ -1008,7 +1008,7 @@ static int eth_llc_ipcp_flow_alloc(int       fd,          flow_set_add(eth_llc_data.np1_flows, fd); -        LOG_DBG("Pending flow with fd %d on SAP %d.", fd, ssap); +        log_dbg("Pending flow with fd %d on SAP %d.", fd, ssap);          return 0;  } @@ -1049,7 +1049,7 @@ static int eth_llc_ipcp_flow_alloc_resp(int fd,          flow_set_add(eth_llc_data.np1_flows, fd); -        LOG_DBG("Accepted flow, fd %d, SAP %d.", fd, (uint8_t)ssap); +        log_dbg("Accepted flow, fd %d, SAP %d.", fd, (uint8_t)ssap);          return 0;  } @@ -1065,7 +1065,7 @@ static int eth_llc_ipcp_flow_dealloc(int fd)          if (ipcp_get_state() != IPCP_OPERATIONAL) {                  pthread_rwlock_unlock(&ipcpi.state_lock); -                LOG_DBG("Won't register with non-enrolled IPCP."); +                log_dbg("Won't register with non-enrolled IPCP.");                  return -1; /* -ENOTENROLLED */          } @@ -1087,7 +1087,7 @@ static int eth_llc_ipcp_flow_dealloc(int fd)          pthread_rwlock_unlock(ð_llc_data.flows_lock);          pthread_rwlock_unlock(&ipcpi.state_lock); -        LOG_DBG("Flow with fd %d deallocated.", fd); +        log_dbg("Flow with fd %d deallocated.", fd);          return 0;  } @@ -1115,23 +1115,6 @@ int main(int    argc,          sigaddset(&sigset, SIGHUP);          sigaddset(&sigset, SIGPIPE); -        if (ipcp_parse_arg(argc, argv)) { -                LOG_ERR("Failed to parse arguments."); -                exit(EXIT_FAILURE); -        } - -        if (ap_init(NULL) < 0) { -                LOG_ERR("Failed to init application."); -                close_logfile(); -                exit(EXIT_FAILURE); -        } - -        if (eth_llc_data_init() < 0) { -                LOG_ERR("Failed to init shim-eth-llc data."); -                close_logfile(); -                exit(EXIT_FAILURE); -        } -          /* init sig_act */          memset(&sig_act, 0, sizeof(sig_act)); @@ -1144,25 +1127,35 @@ int main(int    argc,          sigaction(SIGHUP,  &sig_act, NULL);          sigaction(SIGPIPE, &sig_act, NULL); -        if (ipcp_init(THIS_TYPE, ð_llc_ops) < 0) { -                LOG_ERR("Failed to init IPCP."); -                close_logfile(); +        if (ipcp_init(argc, argv, THIS_TYPE, ð_llc_ops) < 0) { +                log_err("Failed to init IPCP.");                  exit(EXIT_FAILURE);          } +        if (eth_llc_data_init() < 0) { +                log_err("Failed to init shim-eth-llc data."); +                ipcp_fini(); +                exit(EXIT_FAILURE); +        } + +          pthread_sigmask(SIG_BLOCK, &sigset, NULL);          if (ipcp_boot() < 0) { -                LOG_ERR("Failed to boot IPCP."); -                close_logfile(); +                log_err("Failed to boot IPCP."); +                eth_llc_data_fini(); +                ipcp_fini();                  exit(EXIT_FAILURE);          }          pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);          if (ipcp_create_r(getpid())) { -                LOG_ERR("Failed to notify IRMd we are initialized."); -                close_logfile(); +                log_err("Failed to notify IRMd we are initialized."); +                ipcp_set_state(IPCP_NULL); +                ipcp_shutdown(); +                eth_llc_data_fini(); +                ipcp_fini();                  exit(EXIT_FAILURE);          } @@ -1175,13 +1168,9 @@ int main(int    argc,                  pthread_join(eth_llc_data.sdu_reader, NULL);          } -        ipcp_fini(); -          eth_llc_data_fini(); -        ap_fini(); - -        close_logfile(); +        ipcp_fini();          exit(EXIT_SUCCESS);  } | 
