diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 79 | ||||
| -rw-r--r-- | src/irmd/main.c | 46 | ||||
| -rw-r--r-- | src/lib/lockfile.c | 4 | ||||
| -rw-r--r-- | src/lib/shm_ap_rbuff.c | 2 | ||||
| -rw-r--r-- | src/lib/shm_du_map.c | 4 | ||||
| -rw-r--r-- | src/tools/cbr/cbr_server.c | 5 | ||||
| -rw-r--r-- | src/tools/irm/irm_ipcp_bootstrap.c | 4 | 
7 files changed, 110 insertions, 34 deletions
| diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index c2309272..3fd2188a 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -53,8 +53,17 @@  #include <sys/types.h>  #include <sys/ioctl.h>  #include <netinet/in.h> + +#ifdef __linux__  #include <linux/if_packet.h>  #include <linux/if_ether.h> +#endif + +#ifdef __FreeBSD__ +#include <net/if_dl.h> +#include <netinet/if_ether.h> +#endif +  #include <poll.h>  #include <sys/mman.h> @@ -89,7 +98,11 @@ struct eth_llc_ipcp_data {          /* Keep ipcp_data first for polymorphism. */          struct ipcp_data      ipcp_data; +#ifdef __FreeBSD__ +        struct sockaddr_dl    device; +#else          struct sockaddr_ll    device; +#endif          int                   s_fd;          struct bmp *          indices; @@ -285,7 +298,11 @@ static int eth_llc_ipcp_send_frame(uint8_t   dst_addr[MAC_SIZE],          uint8_t * frame;  #else          uint8_t frame[SHIM_ETH_LLC_MAX_SDU_SIZE]; -        struct sockaddr_ll device; +#ifdef __FreeBSD__ +        struct sockaddr_dl    device; +#else +        struct sockaddr_ll    device; +#endif  #endif          if (payload == NULL) { @@ -321,7 +338,11 @@ static int eth_llc_ipcp_send_frame(uint8_t   dst_addr[MAC_SIZE],          memcpy(frame, dst_addr, MAC_SIZE * sizeof(uint8_t));          frame_len += MAC_SIZE;          memcpy(frame + frame_len, +#ifdef __FreeBSD__ +               LLADDR(&shim_data(_ipcp)->device), +#else                 shim_data(_ipcp)->device.sll_addr, +#endif                 MAC_SIZE * sizeof(uint8_t));          frame_len += MAC_SIZE;          memcpy(frame + frame_len, &length, 2 * sizeof(uint8_t)); @@ -671,8 +692,11 @@ static void * eth_llc_ipcp_sdu_reader(void * o)  #endif                  for (i = 0; i < MAC_SIZE; i++)                          dst_mac[i] = buf[i]; - +#ifdef __FreeBSD__ +                if (memcmp(LLADDR(&shim_data(_ipcp)->device), +#else                  if (memcmp(shim_data(_ipcp)->device.sll_addr, +#endif                             dst_mac,                             MAC_SIZE) &&                      memcmp(br_addr, dst_mac, MAC_SIZE)) { @@ -868,7 +892,13 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          int fd = -1;          struct ifreq ifr;          int index; +#ifdef __FreeBSD__ +        struct ifaddrs * ifaddr; +        struct ifaddrs * ifa; +        struct sockaddr_dl device; +#else          struct sockaddr_ll device; +#endif  #if defined(PACKET_RX_RING) && defined(PACKET_TX_RING)          struct tpacket_req req; @@ -897,21 +927,58 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          memcpy(ifr.ifr_name, conf->if_name, strlen(conf->if_name)); +#ifdef __FreeBSD__ +        if (getifaddrs(&ifaddr) < 0)  { +                close(fd); +                LOG_ERR("Could not get interfaces."); +                return -1; +        } + +        for (ifa = ifaddr, index = 0; ifa != NULL; ifa = ifa->ifa_next, ++index) { +                if (strcmp(ifa->ifa_name, conf->if_name)) +                        continue; +                LOG_DBGF("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."); +                freeifaddrs(ifaddr); +                return -1; +        } + +        freeifaddrs(ifaddr); + +#else          if (ioctl(fd, SIOCGIFHWADDR, &ifr)) {                  close(fd);                  LOG_ERR("Failed to ioctl: %s.", strerror(errno));                  return -1;          } -        close(fd); -          index = if_nametoindex(conf->if_name);          if (index == 0) {                  LOG_ERR("Failed to retrieve interface index.");                  return -1;          } +#endif + +        close(fd);          memset(&(device), 0, sizeof(device)); +#ifdef __FreeBSD__ +        device.sdl_index = index; +        device.sdl_family = AF_LINK; +        memcpy(LLADDR(&device), +               ifr.ifr_addr.sa_data, +               MAC_SIZE * sizeof (uint8_t)); +        device.sdl_alen = MAC_SIZE; +        /* TODO: replace socket calls with bpf for BSD */ +        LOG_MISSING; +        fd = socket(AF_LINK, SOCK_RAW, 0); +#else          device.sll_ifindex = index;          device.sll_family = AF_PACKET;          memcpy(device.sll_addr, @@ -921,6 +988,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          device.sll_protocol = htons(ETH_P_ALL);          fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_802_2)); +#endif          if (fd < 0) {                  LOG_ERR("Failed to create socket: %s.", strerror(errno));                  return -1; @@ -953,8 +1021,7 @@ static int eth_llc_ipcp_bootstrap(struct dif_config * conf)          }  #endif -        if (bind(fd,(struct sockaddr *) &device, -                 sizeof(struct sockaddr_ll))) { +        if (bind(fd,(struct sockaddr *) &device, sizeof(device))) {                  LOG_ERR("Failed to bind socket to interface");                  close(fd);                  return -1; diff --git a/src/irmd/main.c b/src/irmd/main.c index b071ff1c..1c731788 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1679,28 +1679,6 @@ static struct irm * irm_create()          irmd->state = IRMD_NULL; -        if (access("/dev/shm/" LOCKFILE_NAME, F_OK) != -1) { -                struct lockfile * lf = lockfile_open(); -                if (lf == NULL) { -                        LOG_ERR("Failed to open existing lockfile."); -                        free(irmd); -                        return NULL; -                } - -                if (kill(lockfile_owner(lf), 0) < 0) { -                        LOG_INFO("IRMd didn't properly shut down last time."); -                        shm_du_map_destroy(shm_du_map_open()); -                        LOG_INFO("Stale resources cleaned"); -                        lockfile_destroy(lf); -                } else { -                        LOG_INFO("IRMd already running (%d), exiting.", -                                 lockfile_owner(lf)); -                        lockfile_close(lf); -                        free(irmd); -                        return NULL; -                } -        } -          if (pthread_rwlock_init(&irmd->state_lock, NULL)) {                  LOG_ERR("Failed to initialize rwlock.");                  free(irmd); @@ -1757,6 +1735,28 @@ static struct irm * irm_create()          }          if ((irmd->lf = lockfile_create()) == NULL) { +                if ((irmd->lf = lockfile_open()) == NULL) { +                        LOG_ERR("Lockfile error."); +                        irm_destroy(); +                        return NULL; +                } + +                if (kill(lockfile_owner(irmd->lf), 0) < 0) { +                        LOG_INFO("IRMd didn't properly shut down last time."); +                        shm_du_map_destroy(shm_du_map_open()); +                        LOG_INFO("Stale resources cleaned"); +                        lockfile_destroy(irmd->lf); +                        irmd->lf = lockfile_create(); +                } else { +                        LOG_INFO("IRMd already running (%d), exiting.", +                                 lockfile_owner(irmd->lf)); +                        lockfile_close(irmd->lf); +                        free(irmd); +                        return NULL; +                } +        } + +        if (irmd->lf == NULL) {                  irm_destroy();                  return NULL;          } @@ -1768,6 +1768,8 @@ static struct irm * irm_create()          irmd->state = IRMD_RUNNING; +        LOG_INFO("IRMd started..."); +          return irmd;  } diff --git a/src/lib/lockfile.c b/src/lib/lockfile.c index a93d5f17..75ee2085 100644 --- a/src/lib/lockfile.c +++ b/src/lib/lockfile.c @@ -60,7 +60,7 @@ struct lockfile * lockfile_create() {                  return NULL;          } -        if (lseek(lf->fd, LF_SIZE - 1, SEEK_SET) < 0) { +        if (ftruncate(lf->fd, LF_SIZE - 1) < 0) {                  LOG_DBGF("Failed to extend lockfile.");                  free(lf);                  return NULL; @@ -99,7 +99,7 @@ struct lockfile * lockfile_open() {                  return NULL;          lf->fd = shm_open(LOCKFILE_NAME, O_RDWR, 0666); -        if (lf->fd == -1) { +        if (lf->fd < 0) {                  LOG_DBGF("Could not open lock file.");                  free(lf);                  return NULL; diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c index 618c4c19..605e5678 100644 --- a/src/lib/shm_ap_rbuff.c +++ b/src/lib/shm_ap_rbuff.c @@ -90,7 +90,7 @@ struct shm_ap_rbuff * shm_ap_rbuff_create()                  return NULL;          } -        if (lseek(shm_fd, SHM_RBUFF_FILE_SIZE - 1, SEEK_SET) < 0) { +        if (ftruncate(shm_fd, SHM_RBUFF_FILE_SIZE - 1) < 0) {                  LOG_DBGF("Failed to extend ringbuffer.");                  free(rb);                  return NULL; diff --git a/src/lib/shm_du_map.c b/src/lib/shm_du_map.c index 9d2d4f6e..6dc4a1bd 100644 --- a/src/lib/shm_du_map.c +++ b/src/lib/shm_du_map.c @@ -161,7 +161,7 @@ struct shm_du_map * shm_du_map_create()                  return NULL;          } -        if (lseek(shm_fd, SHM_FILE_SIZE - 1, SEEK_SET) < 0) { +        if (ftruncate(shm_fd, SHM_FILE_SIZE - 1) < 0) {                  LOG_DBGF("Failed to extend shared memory map.");                  free(dum);                  return NULL; @@ -235,7 +235,7 @@ struct shm_du_map * shm_du_map_open()          }          shm_fd = shm_open(SHM_DU_MAP_FILENAME, O_RDWR, 0666); -        if (shm_fd == -1) { +        if (shm_fd < 0) {                  LOG_DBGF("Failed opening shared memory.");                  return NULL;          } diff --git a/src/tools/cbr/cbr_server.c b/src/tools/cbr/cbr_server.c index 3a1d8d5c..9c6ac7f1 100644 --- a/src/tools/cbr/cbr_server.c +++ b/src/tools/cbr/cbr_server.c @@ -22,6 +22,11 @@   */  #include <stdbool.h> + +#ifdef __FreeBSD__ +#define __XSI_VISIBLE +#endif +  #include <signal.h>  #include <unistd.h>  #include <stdlib.h> diff --git a/src/tools/irm/irm_ipcp_bootstrap.c b/src/tools/irm/irm_ipcp_bootstrap.c index c2b696e4..94b7f81e 100644 --- a/src/tools/irm/irm_ipcp_bootstrap.c +++ b/src/tools/irm/irm_ipcp_bootstrap.c @@ -24,7 +24,9 @@  #include <stdlib.h>  #include <string.h>  #include <arpa/inet.h> - +#ifdef __FreeBSD__ +#include <sys/socket.h> +#endif  #include <ouroboros/irm.h>  #include <ouroboros/irm_config.h> | 
