Hi folks, here is the result of my efforts to port babel on OpenBSD. Everything seems to be working fine, but I still have a problem with the linux node that does not seem to receive the hello sent from the OpenBSD node.
here is the darcs patch Sun May 16 20:47:58 CEST 2010 [email protected] * add missing headers required for OpenBSD Sun May 16 20:49:18 CEST 2010 [email protected] * portability fixes Sun May 16 20:56:02 CEST 2010 [email protected] * adding IPv4 support in kernel_socket.c Sun May 16 20:57:49 CEST 2010 [email protected] * fixing null pointer dereferencing Sun May 16 21:30:08 CEST 2010 [email protected] * portability enhancements for kernel_setup Sun May 16 21:32:12 CEST 2010 [email protected] * implementing kernel_interface_wireless in kernel_socket.c New patches: [add missing headers required for OpenBSD [email protected]**20100516184758 Ignore-this: 913f62f9ec2968b89b056171678c3a80 ] hunk ./kernel.c 24 */ #include <sys/time.h> +#include <sys/param.h> #include <time.h> #include "babeld.h" hunk ./kernel_socket.c 35 #include <strings.h> #include <netinet/in.h> +#include <netinet/icmp6.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <sys/types.h> hunk ./kernel_socket.c 44 #include <ifaddrs.h> #include <net/if.h> #include <net/if_dl.h> +#include <net/if_media.h> #include <net/route.h> #include "babeld.h" hunk ./net.c 28 #include <string.h> #include <sys/ioctl.h> #include <sys/types.h> +#include <sys/uio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> hunk ./util.c 33 #include <sys/types.h> #include <sys/socket.h> +#include <netinet/in.h> #include <arpa/inet.h> #include "babeld.h" [portability fixes [email protected]**20100516184918 Ignore-this: c679725fd1af343e62262eb9a52f9936 ] hunk ./babeld.c 114 gettime(&now); - rfd = open("/dev/urandom", O_RDONLY); + rfd = open(RND_DEV, O_RDONLY); if(rfd < 0) { perror("open(random)"); } else { hunk ./babeld.h 83 #endif #endif +#if defined(__linux) +#define RND_DEV "/dev/urandom" +#elif defined(__OpenBSD__) +#define RND_DEV "/dev/arandom" +#else +#error "don't know which random device to use" +#endif + extern struct timeval now; extern int debug; extern time_t reboot_time; hunk ./config.c 27 #include <string.h> #include <stdio.h> -#ifndef __APPLE__ +#ifdef __linux /* Defining it rather than including <linux/rtnetlink.h> because this * implies <asm/types.h> on Linux 2.4 */ #define RTPROT_BOOT 3 /* Route installed during boot */ hunk ./config.c 649 return 0; } else if(proto == RTPROT_BABEL_LOCAL) { return 0; -#ifndef __APPLE__ +#ifdef __linux } else if(proto == RTPROT_BOOT) { return 0; #endif hunk ./kernel.c 29 #include "babeld.h" -#ifdef __APPLE__ -#include "kernel_socket.c" -#else +#ifdef __linux #include "kernel_netlink.c" hunk ./kernel.c 31 +#else +#include "kernel_socket.c" #endif /* Like gettimeofday, but returns monotonic time. If POSIX clocks are not [adding IPv4 support in kernel_socket.c [email protected]**20100516185602 Ignore-this: 71f88e0489e6a0cb2390060c5801f11f ] hunk ./kernel_socket.c 209 int zero = 0; if(setup) { if(kernel_socket < 0) { - kernel_socket = socket(PF_ROUTE, SOCK_RAW, AF_INET6); + kernel_socket = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC); if(kernel_socket < 0) return -1; } hunk ./kernel_socket.c 321 unsigned char msg[512]; struct rt_msghdr *rtm; struct sockaddr_in6 *sin6; - int rc, len; + struct sockaddr_in *sin4; + int rc, len, ipv4; hunk ./kernel_socket.c 324 - char local[1][1][16] = IN6ADDR_LOOPBACK_INIT; + char local6[1][1][16] = IN6ADDR_LOOPBACK_INIT; + char local4[1][1][16] = + {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x01 }}}; /* Check that the protocol family is consistent. */ if(plen >= 96 && v4mapped(dest)) { hunk ./kernel_socket.c 335 errno = EINVAL; return -1; } + ipv4 = 1; } else { if(v4mapped(gate)) { errno = EINVAL; hunk ./kernel_socket.c 341 return -1; } - } - - if(v4mapped(gate)) { - /* Not implemented yet. */ - errno = ENOSYS; - return -1; + ipv4 = 0; } if(operation == ROUTE_MODIFY && newmetric == metric && hunk ./kernel_socket.c 399 rtm->rtm_addrs |= RTA_NETMASK; } - sin6 = (struct sockaddr_in6 *)&msg[sizeof(struct rt_msghdr)]; - /* Destination */ - sin6->sin6_len = sizeof(struct sockaddr_in6); - sin6->sin6_family = AF_INET6; - sin6->sin6_addr = *((struct in6_addr *)dest); - sin6 = (struct sockaddr_in6 *)((char *)sin6 + ROUNDUP(sin6->sin6_len)); - /* Gateway */ - sin6->sin6_len = sizeof(struct sockaddr_in6); - sin6->sin6_family = AF_INET6; - if (metric == KERNEL_INFINITY) - sin6->sin6_addr = *((struct in6_addr *)*local); - else - sin6->sin6_addr = *((struct in6_addr *)gate); - if(IN6_IS_ADDR_LINKLOCAL (&sin6->sin6_addr)) - SET_IN6_LINKLOCAL_IFINDEX (sin6->sin6_addr, ifindex); - sin6 = (struct sockaddr_in6 *)((char *)sin6 + ROUNDUP(sin6->sin6_len)); - /* Netmask */ - if((rtm->rtm_addrs | RTA_NETMASK) != 0) { - sin6->sin6_len = sizeof(struct sockaddr_in6); - sin6->sin6_family = AF_INET6; - plen2mask(plen, &sin6->sin6_addr); - sin6 = (struct sockaddr_in6 *)((char *)sin6 + ROUNDUP(sin6->sin6_len)); +#define push_sockaddr_in(ptr, offset) \ + do { (ptr) = (struct sockaddr_in *)((char *)(ptr) + (offset)); \ + (ptr)->sin_len = sizeof(struct sockaddr_in); \ + (ptr)->sin_family = AF_INET; } while (0) + +#define get_sin_addr(dst,src) \ + do { memcpy((dst), (src) + 12, 4); } while (0) + +#define push_sockaddr_in6(ptr, offset) \ + do { (ptr) = (struct sockaddr_in6 *)((char *)(ptr) + (offset)); \ + (ptr)->sin6_len = sizeof(struct sockaddr_in6); \ + (ptr)->sin6_family = AF_INET6; } while (0) + +#define get_sin6_addr(dst,src) \ + do { memcpy((dst), (src), 16); } while (0) + + /* KAME ipv6 stack does not support IPv4 mapped IPv6, so we have to */ + if(ipv4) { + sin4 = (struct sockaddr_in *)msg; + /* destination */ + push_sockaddr_in(sin4, sizeof(*rtm)); + get_sin_addr(&(sin4->sin_addr), dest); + /* gateway */ + push_sockaddr_in(sin4, ROUNDUP(sin4->sin_len)); + if (metric == KERNEL_INFINITY) + get_sin_addr(&(sin4->sin_addr),**local4); + else + get_sin_addr(&(sin4->sin_addr),gate); + /* netmask */ + if((rtm->rtm_addrs | RTA_NETMASK) != 0) { + struct in6_addr tmp_sin6_addr; + push_sockaddr_in(sin4, ROUNDUP(sin4->sin_len)); + plen2mask(plen, &tmp_sin6_addr); + get_sin_addr(&(sin4->sin_addr), (char *)&tmp_sin6_addr); + } + len = (char *)sin4 + ROUNDUP(sin4->sin_len) - (char *)msg; + } else { + sin6 = (struct sockaddr_in6 *)msg; + /* destination */ + push_sockaddr_in6(sin6, sizeof(*rtm)); + get_sin6_addr(&(sin6->sin6_addr), dest); + /* gateway */ + push_sockaddr_in6(sin6, ROUNDUP(sin6->sin6_len)); + if (metric == KERNEL_INFINITY) + get_sin6_addr(&(sin6->sin6_addr),**local6); + else + get_sin6_addr(&(sin6->sin6_addr),gate); + if(IN6_IS_ADDR_LINKLOCAL (&sin6->sin6_addr)) + SET_IN6_LINKLOCAL_IFINDEX (sin6->sin6_addr, ifindex); + /* netmask */ + if((rtm->rtm_addrs | RTA_NETMASK) != 0) { + push_sockaddr_in6(sin6, ROUNDUP(sin6->sin6_len)); + plen2mask(plen, &sin6->sin6_addr); + } + len = (char *)sin6 + ROUNDUP(sin6->sin6_len) - (char *)msg; } hunk ./kernel_socket.c 455 - len = (char *)sin6 - (char *)msg; rtm->rtm_msglen = len; rc = write(kernel_socket, msg, rtm->rtm_msglen); [fixing null pointer dereferencing [email protected]**20100516185749 Ignore-this: d2ad970be74c8719fd2d3679578efa48 ] hunk ./kernel_socket.c 662 i = 0; while(ifap && i < maxroutes) { - if(ifap->ifa_name == NULL || strcmp(ifap->ifa_name, ifname) != 0) + if(ifap->ifa_name == NULL || ifname == NULL || strcmp(ifap->ifa_name, ifname) != 0) goto next; if(ifap->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)ifap->ifa_addr; [portability enhancements for kernel_setup [email protected]**20100516193008 Ignore-this: 243e557947eda9e5d4ffb552eb3af8ea ] hunk ./kernel_socket.c 83 static int ifindex_lo = -1; static int seq; -static int get_sysctl_int(char *name) -{ - int old; - size_t len = sizeof (old); - - if (sysctlbyname(name, &old, &len, NULL, 0) < 0) - return -1; - - return old; -} - -static int set_sysctl_int(char *name, int new) -{ - int old; - size_t len = sizeof (old); - - if (sysctlbyname(name, &old, &len, &new, sizeof (new)) < 0) - return -1; - - return old; -} - int mask2len(const struct in6_addr *addr) { hunk ./kernel_socket.c 137 kernel_setup(int setup) { int rc; - if(setup) { - seq = time(NULL); - old_forwarding = get_sysctl_int("net.inet6.ip6.forwarding"); - if(old_forwarding < 0) { + int forwarding = 1; + int accept_redirects = 0; + int mib[4]; + size_t datasize; + + mib[0] = CTL_NET; + mib[1] = AF_INET6; + seq = time(NULL); + + mib[2] = IPPROTO_IPV6; + mib[3] = IPV6CTL_FORWARDING; + datasize = sizeof(old_forwarding); + if (setup) + rc = sysctl(mib, 4, &old_forwarding, &datasize, + &forwarding, datasize); + else if (0 <= old_forwarding) + rc = sysctl(mib, 4, NULL, NULL, + &old_forwarding, datasize); + if (rc == -1) { + if(errno == ENOMEM) perror("Couldn't read forwarding knob."); hunk ./kernel_socket.c 158 - return -1; - } - rc = set_sysctl_int("net.inet6.ip6.forwarding",1); - if(rc < 0) { - perror("Couldn't write forwarding knob."); - return -1; - } - old_accept_redirects = get_sysctl_int("net.inet6.icmp6.rediraccept"); - if(old_accept_redirects < 0) { + else + perror("Couldn't write forwarding knob."); + return -1; + } + + mib[2] = IPPROTO_ICMPV6; + mib[3] = ICMPV6CTL_REDIRACCEPT; + datasize = sizeof(old_accept_redirects); + if (setup) + rc = sysctl(mib, 4, &old_accept_redirects, &datasize, + &accept_redirects, datasize); + else if (0 <= old_accept_redirects) + rc = sysctl(mib, 4, NULL, NULL, + &old_accept_redirects, datasize); + if (rc == -1) { + if(errno == ENOMEM) perror("Couldn't read accept_redirects knob."); hunk ./kernel_socket.c 175 - return -1; - } - rc = set_sysctl_int("net.inet6.icmp6.rediraccept",0); - if(rc < 0) { - perror("Couldn't write accept_redirects knob."); - return -1; - } - return 1; - } else { - if(old_forwarding >= 0) { - rc = set_sysctl_int("net.inet6.ip6.forwarding",old_forwarding); - if(rc < 0) { - perror("Couldn't write accept_redirects knob.\n"); - return -1; - } - } - if(old_accept_redirects >= 0) { - rc = set_sysctl_int("net.inet6.icmp6.rediraccept", - old_accept_redirects); - if(rc < 0) { - perror("Couldn't write accept_redirects knob.\n"); - return -1; - } - } - return 1; + else + perror("Couldn't write accept_redirects knob."); + return -1; } hunk ./kernel_socket.c 179 + return 1; } int [implementing kernel_interface_wireless in kernel_socket.c [email protected]**20100516193212 Ignore-this: 5f3dd6cf769eba0daecca1a32c58708a ] hunk ./kernel_socket.c 288 int kernel_interface_wireless(const char *ifname, int ifindex) { - return -1; + struct ifmediareq ifmr; + int s, rc; + + s = socket(PF_INET6, SOCK_DGRAM, 0); + memset(&ifmr, 0, sizeof(ifmr)); + strncpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name)); + rc = ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr); + close(s); + if (rc < 0) + return rc; + if ((ifmr.ifm_active & IFM_NMASK) == IFM_IEEE80211) + return 1; + else + return 0; } int Context: [Tweak retract_neighbour_routes. Juliusz Chroboczek <[email protected]>**20100502010110] [Use retract_route in sundry places. Juliusz Chroboczek <[email protected]>**20100502005047] [Implement retract_route. Juliusz Chroboczek <[email protected]>**20100502004904] [Make change_route_metric private. Juliusz Chroboczek <[email protected]>**20100501234222] [TAG babeld-1.0.1 Juliusz Chroboczek <[email protected]>**20100502011632] Patch bundle hash: 367277f9cbd8ea65853c76cb2ce97743c602b4be
pgpR84w8ldPpE.pgp
Description: PGP signature
_______________________________________________ Babel-users mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/babel-users

