Hello community, here is the log from the commit of package ibacm for openSUSE:Factory checked in at 2015-02-16 21:14:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ibacm (Old) and /work/SRC/openSUSE:Factory/.ibacm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ibacm" Changes: -------- --- /work/SRC/openSUSE:Factory/ibacm/ibacm.changes 2014-09-06 12:18:16.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ibacm.new/ibacm.changes 2015-02-16 21:14:27.000000000 +0100 @@ -1,0 +2,9 @@ +Fri Feb 13 14:20:55 UTC 2015 - p.drou...@gmail.com + +- Update to version 1.0.9 + * Empty changelog +- Remove obsolete ibacm-no_type_punning.patch +- Remove unused sysvinit script +- Use download Url as source + +------------------------------------------------------------------- Old: ---- ibacm-1.0.8.tar.gz ibacm-no_type_punning.patch New: ---- ibacm-1.0.9.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ibacm.spec ++++++ --- /var/tmp/diff_new_pack.K2EyZu/_old 2015-02-16 21:14:28.000000000 +0100 +++ /var/tmp/diff_new_pack.K2EyZu/_new 2015-02-16 21:14:28.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package ibacm # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,15 +17,13 @@ Name: ibacm -Version: 1.0.8 +Version: 1.0.9 Release: 0 Summary: InfiniBand Communication Manager Assistant License: GPL-2.0 or BSD-2-Clause Group: Productivity/Networking/System Url: http://www.openfabrics.org/ -Source: %{name}-%{version}.tar.gz -# PATCH-FIX-UPSTREAM ibacm-no_type_punning.patch -Patch0: ibacm-no_type_punning.patch +Source: https://www.openfabrics.org/downloads/rdmacm/%{name}-%{version}.tar.gz BuildRequires: libibumad-devel BuildRequires: libibverbs-devel >= 1.1-1 BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -44,7 +42,6 @@ %prep %setup -q -%patch0 %build export AM_LDFLAGS=-pthread @@ -54,11 +51,12 @@ %install %makeinstall +# Remove sysvinit script, as it's not used anyway +rm -rf %{buildroot}%{_sysconfdir} %files %defattr(-,root,root,-) %doc AUTHORS COPYING README -%{_sysconfdir}/init.d/ibacm %{_bindir}/ib_acme %{_sbindir}/ibacm %{_mandir}/man1/* ++++++ ibacm-1.0.8.tar.gz -> ibacm-1.0.9.tar.gz ++++++ ++++ 1826 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/Makefile.am new/ibacm-1.0.9/Makefile.am --- old/ibacm-1.0.8/Makefile.am 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/Makefile.am 2014-06-23 19:44:45.000000000 +0200 @@ -1,13 +1,13 @@ -AM_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/linux +AM_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/linux -I$(srcdir)/src AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DSYSCONFDIR=\"$(sysconfdir)\" -DBINDIR=\"$(bindir)\" -DRDMADIR=\"@rdmadir@\" bin_PROGRAMS = util/ib_acme sbin_PROGRAMS = svc/ibacm -svc_ibacm_SOURCES = src/acm.c -util_ib_acme_SOURCES = src/acme.c linux/acme_linux.c src/libacm.c linux/libacm_linux.c src/parse.c +svc_ibacm_SOURCES = src/acm.c src/acm_util.c +util_ib_acme_SOURCES = src/acme.c src/libacm.c linux/libacm_linux.c src/parse.c svc_ibacm_CFLAGS = $(AM_CFLAGS) -util_ib_acme_CFLAGS = $(AM_CFLAGS) +util_ib_acme_CFLAGS = $(AM_CFLAGS) -DACME_PRINTS ibacmincludedir = $(includedir)/infiniband @@ -18,7 +18,7 @@ man/ibacm.1 \ man/ibacm.7 -EXTRA_DIST = src/acm_mad.h src/libacm.h ibacm.init.in \ +EXTRA_DIST = src/acm_util.h src/acm_mad.h src/libacm.h ibacm.init.in \ linux/osd.h linux/dlist.h ibacm.spec.in $(man_MANS) ibacm_hosts.data install-exec-hook: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/configure.ac new/ibacm-1.0.9/configure.ac --- old/ibacm-1.0.8/configure.ac 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/configure.ac 2014-06-23 19:44:46.000000000 +0200 @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) -AC_INIT([ibacm], [1.0.8], [linux-r...@vger.kernel.org]) +AC_INIT([ibacm], [1.0.9], [linux-r...@vger.kernel.org]) AC_CONFIG_SRCDIR([src/acm.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADERS([config.h]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/ibacm.init.in new/ibacm-1.0.9/ibacm.init.in --- old/ibacm-1.0.8/ibacm.init.in 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/ibacm.init.in 2014-06-23 19:44:45.000000000 +0200 @@ -15,48 +15,78 @@ # Should-Stop: # Short-Description: Starts and stops the InfiniBand ACM service # Description: The InfiniBand ACM service provides a user space implementation -# of someting resembling an ARP cache for InfiniBand SA queries and +# of something resembling an ARP cache for InfiniBand SA queries and # host route lookups. ### END INIT INFO pidfile=/var/run/ibacm.pid subsys=/var/lock/subsys/ibacm -. /etc/rc.d/init.d/functions +daemon() { /sbin/daemon ${1+"$@"}; } + +if [ -s /etc/init.d/functions ]; then + # RHEL / CentOS / SL / Fedora + . /etc/init.d/functions + _daemon() { daemon ${1+"$@"}; } + _checkpid() { checkpid `cat $pidfile`; } + _success() { success; echo; } + _failure() { failure; echo; } +elif [ -s /lib/lsb/init-functions ]; then + # SLES / OpenSuSE / Debian + . /lib/lsb/init-functions + _daemon() { /sbin/start_daemon ${1+"$@"}; } + _checkpid() { checkproc -p $pidfile @prefix@/sbin/ibacm; } + _success() { log_success_msg; } + _failure() { log_failure_msg; } +elif [ -s /etc/rc.status ]; then + # Older SuSE + . /etc/rc.status + _daemon() { /sbin/start_daemon ${1+"$@"}; } + _checkpid() { checkproc -p $pidfile @prefix@/sbin/ibacm; } + _success() { rc_status -v; } + _failure() { rc_status -v; } +fi start() { echo -n "Starting ibacm daemon:" - - daemon @prefix@/sbin/ibacm - RC=$? - [ $RC -eq 0 ] && touch $subsys - echo - return $RC + _daemon @prefix@/sbin/ibacm + if [[ $RETVAL -eq 0 ]]; then + _success + else + _failure + fi } stop() { echo -n "Stopping ibacm daemon:" - killproc -p $pidfile ibacm - RC=$? + if [[ $RETVAL -eq 0 ]]; then + _success + else + _failure + fi rm -f $subsys - echo - return $RC } status() { + echo -n "Checking for ibacm service " if [ ! -f $subsys -a ! -f $pidfile ]; then - return 3 - fi - if [ -f $pidfile ]; then - checkpid `cat $pidfile` - return $? + RETVAL=3 + elif [ -f $pidfile ]; then + _checkpid + RETVAL=$? + elif [ -f $subsys ]; then + RETVAL=2 + else + RETVAL=0 fi - if [ -f $subsys ]; then - return 2 + if [[ $RETVAL -eq 0 ]]; then + _success + else + _failure fi } @@ -85,15 +115,24 @@ esac case $1 in - start) start; RC=$? ;; - stop) stop; RC=$? ;; - restart) restart; RC=$? ;; - reload) RC=3 ;; - condrestart) condrestart; RC=$? ;; - try-restart) condrestart; RC=$? ;; - force-reload) condrestart; RC=$? ;; - status) status; RC=$? ;; - *) usage; RC=$? ;; + start) + start + ;; + stop) + stop + ;; + restart | reload) + restart + ;; + condrestart | try-restart | force-reload) + condrestart + ;; + status) + status + ;; + *) + usage + ;; esac -exit $RC +exit $RETVAL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/ibacm.spec new/ibacm-1.0.9/ibacm.spec --- old/ibacm-1.0.8/ibacm.spec 2013-07-26 06:29:42.000000000 +0200 +++ new/ibacm-1.0.9/ibacm.spec 2014-06-23 20:40:53.000000000 +0200 @@ -1,5 +1,5 @@ Name: ibacm -Version: 1.0.8 +Version: 1.0.9 Release: 1%{?dist} Summary: InfiniBand Communication Manager Assistant diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/ibacm.spec.in new/ibacm-1.0.9/ibacm.spec.in --- old/ibacm-1.0.8/ibacm.spec.in 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/ibacm.spec.in 2014-06-23 19:44:45.000000000 +0200 @@ -1,5 +1,5 @@ Name: ibacm -Version: 1.0.8 +Version: 1.0.9 Release: 1%{?dist} Summary: InfiniBand Communication Manager Assistant diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/linux/acme_linux.c new/ibacm-1.0.9/linux/acme_linux.c --- old/ibacm-1.0.8/linux/acme_linux.c 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/linux/acme_linux.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2009 Intel Corporation. All rights reserved. - * - * This software is available to you under the OpenIB.org BSD license - * below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <arpa/inet.h> -#include <sys/ioctl.h> -#include <net/if.h> -#include <net/if_arp.h> -#include <netinet/in.h> -#include <sys/socket.h> -#include <sys/types.h> - -#include <infiniband/verbs.h> - -extern struct ibv_context **verbs; -extern int dev_cnt; -extern int verbose; - - -static int -get_pkey(struct ifreq *ifreq, uint16_t *pkey) -{ - char buf[128], *end; - FILE *f; - int ret; - - snprintf(buf, sizeof buf, "//sys//class//net//%s//pkey", ifreq->ifr_name); - f = fopen(buf, "r"); - if (!f) { - printf("failed to open %s\n", buf); - return -1; - } - - if (fgets(buf, sizeof buf, f)) { - *pkey = strtol(buf, &end, 16); - ret = 0; - } else { - printf("failed to read pkey\n"); - ret = -1; - } - - fclose(f); - return ret; -} - -static int -get_sgid(struct ifreq *ifr, union ibv_gid *sgid) -{ - char buf[128], *end; - FILE *f; - int i, p, ret; - - snprintf(buf, sizeof buf, "//sys//class//net//%s//address", ifr->ifr_name); - f = fopen(buf, "r"); - if (!f) { - printf("failed to open %s\n", buf); - return -1; - } - - if (fgets(buf, sizeof buf, f)) { - for (i = 0, p = 12; i < 16; i++, p += 3) { - buf[p + 2] = '\0'; - sgid->raw[i] = (uint8_t) strtol(buf + p, &end, 16); - } - ret = 0; - } else { - printf("failed to read sgid\n"); - ret = -1; - } - - fclose(f); - return ret; -} - -static int -get_devaddr(int s, struct ifreq *ifr, - int *dev_index, uint8_t *port, uint16_t *pkey) -{ - struct ibv_device_attr dev_attr; - struct ibv_port_attr port_attr; - union ibv_gid sgid, gid; - int ret, i; - - ret = get_sgid(ifr, &sgid); - if (ret) { - printf("unable to get sgid\n"); - return ret; - } - - ret = get_pkey(ifr, pkey); - if (ret) { - printf("unable to get pkey\n"); - return ret; - } - - for (*dev_index = 0; *dev_index < dev_cnt; (*dev_index)++) { - ret = ibv_query_device(verbs[*dev_index], &dev_attr); - if (ret) - continue; - - for (*port = 1; *port <= dev_attr.phys_port_cnt; (*port)++) { - ret = ibv_query_port(verbs[*dev_index], *port, &port_attr); - if (ret) - continue; - - for (i = 0; i < port_attr.gid_tbl_len; i++) { - ret = ibv_query_gid(verbs[*dev_index], *port, i, &gid); - if (ret || !gid.global.interface_id) - break; - - if (!memcmp(sgid.raw, gid.raw, sizeof gid)) - return 0; - } - } - } - return -1; -} - -int gen_addr_ip(FILE *f) -{ - struct ifconf *ifc; - struct ifreq *ifr; - char ip[INET6_ADDRSTRLEN]; - int s, ret, dev_index, i, len; - uint16_t pkey; - uint8_t port; - - s = socket(AF_INET6, SOCK_DGRAM, 0); - if (!s) - return -1; - - len = sizeof(*ifc) + sizeof(*ifr) * 64; - ifc = malloc(len); - if (!ifc) { - ret = -1; - goto out1; - } - - memset(ifc, 0, len); - ifc->ifc_len = len; - ifc->ifc_req = (struct ifreq *) (ifc + 1); - - ret = ioctl(s, SIOCGIFCONF, ifc); - if (ret < 0) { - printf("ioctl ifconf error %d\n", ret); - goto out2; - } - - ifr = ifc->ifc_req; - for (i = 0; i < ifc->ifc_len / sizeof(struct ifreq); i++) { - switch (ifr[i].ifr_addr.sa_family) { - case AF_INET: - inet_ntop(ifr[i].ifr_addr.sa_family, - &((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr, ip, sizeof ip); - break; - case AF_INET6: - inet_ntop(ifr[i].ifr_addr.sa_family, - &((struct sockaddr_in6 *) &ifr[i].ifr_addr)->sin6_addr, ip, sizeof ip); - break; - default: - continue; - } - - ret = ioctl(s, SIOCGIFHWADDR, &ifr[i]); - if (ret) { - printf("failed to get hw address %d\n", ret); - continue; - } - - if (ifr[i].ifr_hwaddr.sa_family != ARPHRD_INFINIBAND) - continue; - - ret = get_devaddr(s, &ifr[i], &dev_index, &port, &pkey); - if (ret) - continue; - - if (verbose) - printf("%s %s %d 0x%x\n", ip, verbs[dev_index]->device->name, port, pkey); - fprintf(f, "%s %s %d 0x%x\n", ip, verbs[dev_index]->device->name, port, pkey); - } - ret = 0; - -out2: - free(ifc); -out1: - close(s); - return ret; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/man/ib_acme.1 new/ibacm-1.0.9/man/ib_acme.1 --- old/ibacm-1.0.8/man/ib_acme.1 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/man/ib_acme.1 2014-06-23 19:44:46.000000000 +0200 @@ -55,8 +55,7 @@ \-A [addr_file] With this option, the ib_acme utility automatically generates the address configuration file ibacm_addr.cfg. The generated file is -constructed using the system host name and any IP addresses that are -assigned to IPoIB device instances. +constructed using the system host name. .TP \-O [opt_file] With this option, the ib_acme utility automatically generates the option diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/src/acm.c new/ibacm-1.0.9/src/acm.c --- old/ibacm-1.0.8/src/acm.c 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/src/acm.c 2014-06-23 19:44:45.000000000 +0200 @@ -46,7 +46,14 @@ #include <infiniband/verbs.h> #include <dlist.h> #include <search.h> +#include <net/if.h> +#include <sys/ioctl.h> +#include <net/if_arp.h> +#include <netinet/in.h> +#include <linux/netlink.h> +#include <linux/rtnetlink.h> #include "acm_mad.h" +#include "acm_util.h" #define src_out data[0] @@ -120,7 +127,7 @@ enum ibv_rate rate; int subnet_timeout; int gid_cnt; - uint16_t pkey_cnt; + uint16_t default_pkey_ix; uint16_t lid; uint16_t lid_mask; uint8_t port_num; @@ -210,7 +217,8 @@ static atomic_t wait_cnt; static SOCKET listen_socket; -static struct acm_client client[FD_SETSIZE - 1]; +static SOCKET ip_mon_socket; +static struct acm_client client_array[FD_SETSIZE - 1]; static FILE *flog; static lock_t log_lock; @@ -244,11 +252,9 @@ static uint8_t min_rate = IBV_RATE_10_GBPS; static enum acm_route_preload route_preload; static enum acm_addr_preload addr_preload; +static int support_ips_in_addr_cfg = 0; -#define acm_log(level, format, ...) \ - acm_write(level, "%s: "format, __func__, ## __VA_ARGS__) - -static void acm_write(int level, const char *format, ...) +void acm_write(int level, const char *format, ...) { va_list args; struct timeval tv; @@ -452,7 +458,7 @@ acm_free_req(struct acm_request *req) { acm_log(2, "%p\n", req); - (void) atomic_dec(&client->refcnt); + (void) atomic_dec(&req->client->refcnt); free(req); } @@ -791,6 +797,27 @@ lock_release(&ep->lock); } +static void acm_mark_addr_invalid(struct acm_ep *ep, + struct acm_ep_addr_data *data) +{ + int i; + + lock_acquire(&ep->lock); + for (i = 0; i < MAX_EP_ADDR; i++) { + if (ep->addr_type[i] != data->type) + continue; + + if ((data->type == ACM_ADDRESS_NAME && + !strnicmp((char *) ep->addr[i].name, + (char *) data->info.addr, ACM_MAX_ADDRESS)) || + !memcmp(ep->addr[i].addr, data->info.addr, ACM_MAX_ADDRESS)) { + ep->addr_type[i] = ACM_ADDRESS_INVALID; + break; + } + } + lock_release(&ep->lock); +} + static int acm_addr_index(struct acm_ep *ep, uint8_t *addr, uint8_t addr_type) { int i; @@ -839,7 +866,7 @@ mad->mgmt_class = IB_MGMT_CLASS_SA; mad->class_version = 2; mad->method = IB_METHOD_GET; - mad->tid = (uint64_t) atomic_inc(&tid); + mad->tid = htonll((uint64_t) atomic_inc(&tid)); mad->attr_id = IB_SA_ATTR_PATH_REC; } @@ -1483,7 +1510,7 @@ mad->mgmt_class = IB_MGMT_CLASS_SA; mad->class_version = 2; mad->method = IB_METHOD_SET; - mad->tid = (uint64_t) atomic_inc(&tid); + mad->tid = htonll((uint64_t) atomic_inc(&tid)); mad->attr_id = IB_SA_ATTR_MC_MEMBER_REC; mad->comp_mask = IB_COMP_MASK_MC_MGID | IB_COMP_MASK_MC_PORT_GID | @@ -1493,9 +1520,9 @@ IB_COMP_MASK_MC_SCOPE | IB_COMP_MASK_MC_JOIN_STATE; mc_rec = (struct ib_mc_member_rec *) mad->data; - acm_format_mgid(&mc_rec->mgid, pkey, tos, rate, mtu); + acm_format_mgid(&mc_rec->mgid, pkey | 0x8000, tos, rate, mtu); mc_rec->port_gid = *port_gid; - mc_rec->qkey = ACM_QKEY; + mc_rec->qkey = htonl(ACM_QKEY); mc_rec->mtu = 0x80 | mtu; mc_rec->tclass = tclass; mc_rec->pkey = htons(pkey); @@ -1523,8 +1550,7 @@ port = ep->port; umad->addr.qpn = htonl(port->sa_dest.remote_qpn); - umad->addr.qkey = htonl(ACM_QKEY); - umad->addr.pkey_index = ep->pkey_index; + umad->addr.pkey_index = port->default_pkey_ix; umad->addr.lid = htons(port->sa_dest.av.dlid); umad->addr.sl = port->sa_dest.av.sl; umad->addr.path_bits = port->sa_dest.av.src_path_bits; @@ -1599,13 +1625,15 @@ DLIST_ENTRY *entry; struct acm_send_msg *msg; struct acm_resolve_rec *rec; + struct acm_mad *mad; while (!DListEmpty(&timeout_list)) { entry = timeout_list.Next; DListRemove(entry); msg = container_of(entry, struct acm_send_msg, entry); - rec = (struct acm_resolve_rec *) ((struct acm_mad *) msg->data)->data; + mad = (struct acm_mad *) &msg->data[0]; + rec = (struct acm_resolve_rec *) mad->data; acm_format_name(0, log_data, sizeof log_data, rec->dest_type, rec->dest, sizeof rec->dest); @@ -1691,10 +1719,10 @@ int i; for (i = 0; i < FD_SETSIZE - 1; i++) { - lock_init(&client[i].lock); - client[i].index = i; - client[i].sock = INVALID_SOCKET; - atomic_init(&client[i].refcnt); + lock_init(&client_array[i].lock); + client_array[i].index = i; + client_array[i].sock = INVALID_SOCKET; + atomic_init(&client_array[i].refcnt); } if (!(f = fopen("/var/run/ibacm.port", "w"))) { @@ -1759,7 +1787,7 @@ } for (i = 0; i < FD_SETSIZE - 1; i++) { - if (!atomic_get(&client[i].refcnt)) + if (!atomic_get(&client_array[i].refcnt)) break; } @@ -1769,8 +1797,8 @@ return; } - client[i].sock = s; - atomic_set(&client[i].refcnt, 1); + client_array[i].sock = s; + atomic_set(&client_array[i].refcnt, 1); acm_log(2, "assigned client %d\n", i); } @@ -1953,7 +1981,7 @@ mad->class_version = 1; mad->method = IB_METHOD_GET; mad->control = ACM_CTRL_RESOLVE; - mad->tid = (uint64_t) atomic_inc(&tid); + mad->tid = htonll((uint64_t) atomic_inc(&tid)); rec = (struct acm_resolve_rec *) mad->data; rec->src_type = (uint8_t) saddr->type; @@ -2389,6 +2417,251 @@ acm_disconnect_client(client); } +static struct acm_device * +acm_get_device_from_gid(union ibv_gid *sgid, uint8_t *port); +static struct acm_ep *acm_find_ep(struct acm_port *port, uint16_t pkey); +static int +acm_ep_insert_addr(struct acm_ep *ep, uint8_t *addr, size_t addr_len, uint8_t addr_type); + +static int acm_nl_to_addr_data(struct acm_ep_addr_data *ad, + int af_family, uint8_t *addr, size_t addr_len) +{ + if (addr_len > ACM_MAX_ADDRESS) + return EINVAL; + + /* find the ep associated with this address "if any" */ + switch (af_family) { + case AF_INET: + ad->type = ACM_ADDRESS_IP; + break; + case AF_INET6: + ad->type = ACM_ADDRESS_IP6; + break; + default: + return EINVAL; + } + memcpy(&ad->info.addr, addr, addr_len); + return 0; +} + +static void acm_add_ep_ip(struct acm_ep_addr_data *data, char *ifname) +{ + struct acm_ep *ep; + struct acm_device *dev; + uint8_t port_num; + uint16_t pkey; + union ibv_gid sgid; + + ep = acm_get_ep(data); + if (ep) { + acm_format_name(1, log_data, sizeof log_data, + data->type, data->info.addr, sizeof data->info.addr); + acm_log(1, "Address '%s' already available\n", log_data); + return; + } + + if (acm_if_get_sgid(ifname, &sgid)) + return; + + dev = acm_get_device_from_gid(&sgid, &port_num); + if (!dev) + return; + + if (acm_if_get_pkey(ifname, &pkey)) + return; + + acm_format_name(0, log_data, sizeof log_data, + data->type, data->info.addr, sizeof data->info.addr); + acm_log(0, " %s\n", log_data); + + ep = acm_find_ep(&dev->port[port_num-1], pkey); + if (ep) { + if (acm_ep_insert_addr(ep, data->info.addr, sizeof data->info.addr, data->type)) + acm_log(0, "Failed to add '%s' to EP\n", log_data); + } else { + acm_log(0, "Failed to add '%s' no EP for pkey\n", log_data); + } +} + +static void acm_rm_ep_ip(struct acm_ep_addr_data *data) +{ + struct acm_ep *ep; + + ep = acm_get_ep(data); + if (ep) { + acm_format_name(0, log_data, sizeof log_data, + data->type, data->info.addr, sizeof data->info.addr); + acm_log(0, " %s\n", log_data); + acm_mark_addr_invalid(ep, data); + } +} + +static int acm_ipnl_create(void) +{ + struct sockaddr_nl addr; + + if ((ip_mon_socket = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE)) == -1) { + acm_log(0, "Failed to open NETLINK_ROUTE socket"); + return EIO; + } + + memset(&addr, 0, sizeof(addr)); + addr.nl_family = AF_NETLINK; + addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR; + + if (bind(ip_mon_socket, (struct sockaddr *)&addr, sizeof(addr)) == -1) { + acm_log(0, "Failed to bind NETLINK_ROUTE socket"); + return EIO; + } + + return 0; +} + +static void acm_ip_iter_cb(char *ifname, union ibv_gid *gid, uint16_t pkey, + uint8_t addr_type, uint8_t *addr, size_t addr_len, + char *addr_name, void *ctx) +{ + int ret = EINVAL; + struct acm_device *dev = NULL; + struct acm_ep *ep = NULL; + uint8_t port_num; + char gid_str[INET6_ADDRSTRLEN]; + + dev = acm_get_device_from_gid(gid, &port_num); + if (dev) + ep = acm_find_ep(&dev->port[port_num-1], pkey); + + if (ep) + ret = acm_ep_insert_addr(ep, addr, addr_len, addr_type); + + if (ret) { + acm_format_name(2, log_data, sizeof log_data, + addr_type, addr, addr_len); + inet_ntop(AF_INET6, gid->raw, gid_str, sizeof(gid_str)); + acm_log(0, "Failed to add '%s' (gid %s; pkey 0x%x)\n", + log_data, gid_str, pkey); + } +} + +/* Netlink updates have indicated a failure which means we are no longer in + * sync. This should be a rare condition so we handle this with a "big + * hammer" by clearing and re-reading all the system IP's. + */ +static int resync_system_ips(void) +{ + DLIST_ENTRY *dev_entry; + struct acm_device *dev; + int cnt; + + acm_log(0, "Resyncing all IP's\n"); + + /* mark all IP's invalid */ + for (dev_entry = dev_list.Next; dev_entry != &dev_list; + dev_entry = dev_entry->Next) { + struct acm_ep *ep = NULL; + DLIST_ENTRY *entry; + + dev = container_of(dev_entry, struct acm_device, entry); + + for (cnt = 0; cnt < dev->port_cnt; cnt++) { + struct acm_port *port = &dev->port[cnt]; + + for (entry = port->ep_list.Next; entry != &port->ep_list; + entry = entry->Next) { + int i; + + ep = container_of(entry, struct acm_ep, entry); + for (i = 0; i < MAX_EP_ADDR; i++) { + if (ep->addr_type[i] == ACM_ADDRESS_IP + || ep->addr_type[i] == ACM_ADDRESS_IP6) + ep->addr_type[i] = ACM_ADDRESS_INVALID; + } + } + } + } + + return acm_if_iter_sys(acm_ip_iter_cb, NULL); +} + +#define NL_MSG_BUF_SIZE 4096 +static void acm_ipnl_handler(void) +{ + int len; + char buffer[NL_MSG_BUF_SIZE]; + struct nlmsghdr *nlh; + char name[IFNAMSIZ]; + char ip_str[INET6_ADDRSTRLEN]; + struct acm_ep_addr_data ad; + + while ((len = recv(ip_mon_socket, buffer, NL_MSG_BUF_SIZE, 0)) > 0) { + nlh = (struct nlmsghdr *)buffer; + while ((NLMSG_OK(nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE)) { + struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(nlh); + struct ifinfomsg *ifi = (struct ifinfomsg *) NLMSG_DATA(nlh); + struct rtattr *rth = IFA_RTA(ifa); + int rtl = IFA_PAYLOAD(nlh); + + switch (nlh->nlmsg_type) { + case RTM_NEWADDR: + { + if_indextoname(ifa->ifa_index, name); + while (rtl && RTA_OK(rth, rtl)) { + if (rth->rta_type == IFA_LOCAL) { + acm_log(1, "New system address available %s : %s\n", + name, inet_ntop(ifa->ifa_family, RTA_DATA(rth), + ip_str, sizeof(ip_str))); + if (!acm_nl_to_addr_data(&ad, ifa->ifa_family, + RTA_DATA(rth), + RTA_PAYLOAD(rth))) { + acm_add_ep_ip(&ad, name); + } + } + rth = RTA_NEXT(rth, rtl); + } + break; + } + case RTM_DELADDR: + { + if_indextoname(ifa->ifa_index, name); + while (rtl && RTA_OK(rth, rtl)) { + if (rth->rta_type == IFA_LOCAL) { + acm_log(1, "System address removed %s : %s\n", + name, inet_ntop(ifa->ifa_family, RTA_DATA(rth), + ip_str, sizeof(ip_str))); + if (!acm_nl_to_addr_data(&ad, ifa->ifa_family, + RTA_DATA(rth), + RTA_PAYLOAD(rth))) { + acm_rm_ep_ip(&ad); + } + } + rth = RTA_NEXT(rth, rtl); + } + break; + } + case RTM_NEWLINK: + { + acm_log(2, "Link added : %s\n", if_indextoname(ifi->ifi_index, name)); + break; + } + case RTM_DELLINK: + { + acm_log(2, "Link removed : %s\n", if_indextoname(ifi->ifi_index, name)); + break; + } + default: + acm_log(2, "unknown netlink message\n"); + break; + } + nlh = NLMSG_NEXT(nlh, len); + } + } + + if (len < 0 && errno == ENOBUFS) { + acm_log(0, "ENOBUFS returned from netlink...\n"); + resync_system_ips(); + } +} + static void acm_server(void) { fd_set readfds; @@ -2407,10 +2680,13 @@ FD_ZERO(&readfds); FD_SET(listen_socket, &readfds); + n = max(n, (int) ip_mon_socket); + FD_SET(ip_mon_socket, &readfds); + for (i = 0; i < FD_SETSIZE - 1; i++) { - if (client[i].sock != INVALID_SOCKET) { - FD_SET(client[i].sock, &readfds); - n = max(n, (int) client[i].sock); + if (client_array[i].sock != INVALID_SOCKET) { + FD_SET(client_array[i].sock, &readfds); + n = max(n, (int) client_array[i].sock); } } @@ -2423,11 +2699,14 @@ if (FD_ISSET(listen_socket, &readfds)) acm_svr_accept(); + if (FD_ISSET(ip_mon_socket, &readfds)) + acm_ipnl_handler(); + for (i = 0; i < FD_SETSIZE - 1; i++) { - if (client[i].sock != INVALID_SOCKET && - FD_ISSET(client[i].sock, &readfds)) { + if (client_array[i].sock != INVALID_SOCKET && + FD_ISSET(client_array[i].sock, &readfds)) { acm_log(2, "receiving from client %d\n", i); - acm_svr_receive(&client[i]); + acm_svr_receive(&client_array[i]); } } } @@ -2648,7 +2927,7 @@ char s[128]; char *p, *ptr, *p_guid, *p_lid; uint64_t guid; - uint16_t lid, dlid; + uint16_t lid, dlid, net_dlid; int sl, mtu, rate; int ret = 1, i; uint8_t addr[ACM_MAX_ADDRESS]; @@ -2711,6 +2990,7 @@ break; dlid = strtoul(p, NULL, 0); + net_dlid = htons(dlid); p = strtok_r(NULL, ":", &ptr); if (!p) @@ -2741,7 +3021,7 @@ memset(addr, 0, ACM_MAX_ADDRESS); if (i == 0) { addr_type = ACM_ADDRESS_LID; - *((uint16_t *) addr) = htons(dlid); + memcpy(addr, &net_dlid, sizeof net_dlid); } else { addr_type = ACM_ADDRESS_GID; memcpy(addr, &dgid, sizeof(dgid)); @@ -2755,7 +3035,7 @@ dest->path.sgid = sgid; dest->path.slid = htons(ep->port->lid); dest->path.dgid = dgid; - dest->path.dlid = htons(dlid); + dest->path.dlid = net_dlid; dest->path.reversible_numpath = IBV_PATH_RECORD_REVERSIBLE; dest->path.pkey = htons(ep->pkey); dest->path.mtu = (uint8_t) mtu; @@ -2878,6 +3158,114 @@ fclose(f); } +static int +acm_ep_insert_addr(struct acm_ep *ep, uint8_t *addr, size_t addr_len, uint8_t addr_type) +{ + int i; + int ret = ENOMEM; + uint8_t tmp[ACM_MAX_ADDRESS]; + char name_str[INET6_ADDRSTRLEN]; + + if (addr_len > ACM_MAX_ADDRESS) + return EINVAL; + + memset(tmp, 0, sizeof tmp); + memcpy(tmp, addr, addr_len); + + lock_acquire(&ep->lock); + if (acm_addr_index(ep, tmp, addr_type) < 0) { + for (i = 0; i < MAX_EP_ADDR; i++) { + if (ep->addr_type[i] == ACM_ADDRESS_INVALID) { + + ep->addr_type[i] = addr_type; + memcpy(ep->addr[i].addr, tmp, ACM_MAX_ADDRESS); + + switch (addr_type) { + case ACM_ADDRESS_IP: + inet_ntop(AF_INET, addr, name_str, sizeof name_str); + strncpy(ep->name[i], name_str, ACM_MAX_ADDRESS); + break; + case ACM_ADDRESS_IP6: + inet_ntop(AF_INET6, addr, name_str, sizeof name_str); + strncpy(ep->name[i], name_str, ACM_MAX_ADDRESS); + break; + case ACM_ADDRESS_NAME: + strncpy(ep->name[i], (const char *)addr, ACM_MAX_ADDRESS); + break; + } + + ret = 0; + break; + } + } + } else { + ret = 0; + } + lock_release(&ep->lock); + return ret; +} + +static struct acm_device * +acm_get_device_from_gid(union ibv_gid *sgid, uint8_t *port) +{ + DLIST_ENTRY *dev_entry; + struct acm_device *dev; + struct ibv_device_attr dev_attr; + struct ibv_port_attr port_attr; + union ibv_gid gid; + int ret, i; + + for (dev_entry = dev_list.Next; dev_entry != &dev_list; + dev_entry = dev_entry->Next) { + + dev = container_of(dev_entry, struct acm_device, entry); + + ret = ibv_query_device(dev->verbs, &dev_attr); + if (ret) + continue; + + for (*port = 1; *port <= dev_attr.phys_port_cnt; (*port)++) { + ret = ibv_query_port(dev->verbs, *port, &port_attr); + if (ret) + continue; + + for (i = 0; i < port_attr.gid_tbl_len; i++) { + ret = ibv_query_gid(dev->verbs, *port, i, &gid); + if (ret || !gid.global.interface_id) + break; + + if (!memcmp(sgid->raw, gid.raw, sizeof gid)) + return dev; + } + } + } + return NULL; +} + +static void acm_ep_ip_iter_cb(char *ifname, union ibv_gid *gid, uint16_t pkey, + uint8_t addr_type, uint8_t *addr, size_t addr_len, + char *addr_name, void *ctx) +{ + uint8_t port_num; + struct acm_device *dev; + struct acm_ep *ep = (struct acm_ep *)ctx; + + dev = acm_get_device_from_gid(gid, &port_num); + if (dev && ep->port->dev == dev + && ep->port->port_num == port_num && ep->pkey == pkey) { + if (!acm_ep_insert_addr(ep, addr, addr_len, addr_type)) { + acm_log(0, "Added %s %s %d 0x%x from %s\n", addr_name, + dev->verbs->device->name, port_num, pkey, + ifname); + } + } +} + +static int acm_get_system_ips(struct acm_ep *ep) +{ + return acm_if_iter_sys(acm_ep_ip_iter_cb, (void *)ep); +} + static int acm_assign_ep_names(struct acm_ep *ep) { FILE *faddr; @@ -2886,13 +3274,16 @@ char dev[32], addr[INET6_ADDRSTRLEN], pkey_str[8]; uint16_t pkey; uint8_t type; - int port, index = 0; + int port, ret = 0; struct in6_addr ip_addr; + size_t addr_len; dev_name = ep->port->dev->verbs->device->name; acm_log(1, "device %s, port %d, pkey 0x%x\n", dev_name, ep->port->port_num, ep->pkey); + acm_get_system_ips(ep); + if (!(faddr = acm_open_addr_file())) { acm_log(0, "ERROR - address file not found\n"); return -1; @@ -2906,12 +3297,24 @@ continue; acm_log(2, "%s", s); - if (inet_pton(AF_INET, addr, &ip_addr) > 0) + if (inet_pton(AF_INET, addr, &ip_addr) > 0) { + if (!support_ips_in_addr_cfg) { + acm_log(0, "ERROR - IP's are not configured to be read from ibacm_addr.cfg\n"); + continue; + } type = ACM_ADDRESS_IP; - else if (inet_pton(AF_INET6, addr, &ip_addr) > 0) + addr_len = 4; + } else if (inet_pton(AF_INET6, addr, &ip_addr) > 0) { + if (!support_ips_in_addr_cfg) { + acm_log(0, "ERROR - IP's are not configured to be read from ibacm_addr.cfg\n"); + continue; + } type = ACM_ADDRESS_IP6; - else + addr_len = ACM_MAX_ADDRESS; + } else { type = ACM_ADDRESS_NAME; + addr_len = strlen(addr); + } if (stricmp(pkey_str, "default")) { if (sscanf(pkey_str, "%hx", &pkey) != 1) { @@ -2925,17 +3328,8 @@ if (!stricmp(dev_name, dev) && (ep->port->port_num == (uint8_t) port) && (ep->pkey == pkey)) { - ep->addr_type[index] = type; acm_log(1, "assigning %s\n", addr); - strncpy(ep->name[index], addr, ACM_MAX_ADDRESS); - if (type == ACM_ADDRESS_IP) - memcpy(ep->addr[index].addr, &ip_addr, 4); - else if (type == ACM_ADDRESS_IP6) - memcpy(ep->addr[index].addr, &ip_addr, sizeof ip_addr); - else - strncpy((char *) ep->addr[index].addr, addr, ACM_MAX_ADDRESS); - - if (++index == MAX_EP_ADDR) { + if ((ret = acm_ep_insert_addr(ep, (uint8_t *)&ip_addr, addr_len, type)) != 0) { acm_log(1, "maximum number of names assigned to EP\n"); break; } @@ -2943,7 +3337,7 @@ } fclose(faddr); - return !index; + return ret; } /* @@ -3068,6 +3462,7 @@ if (ret) return; + pkey = ntohs(pkey); /* ibv_query_pkey returns pkey in network order */ if (acm_find_ep(port, pkey)) { acm_log(2, "endpoint for pkey 0x%x already exists\n", pkey); return; @@ -3080,7 +3475,7 @@ ret = acm_assign_ep_names(ep); if (ret) { - acm_log(0, "ERROR - unable to assign EP name\n"); + acm_log(0, "ERROR - unable to assign EP name for pkey 0x%x\n", pkey); goto err0; } @@ -3169,6 +3564,7 @@ union ibv_gid gid; uint16_t pkey; int i, ret; + int is_full_default_pkey_set = 0; acm_log(1, "%s %d\n", port->dev->verbs->device->name, port->port_num); ret = ibv_query_port(port->dev->verbs, port->port_num, &attr); @@ -3191,11 +3587,6 @@ break; } - for (port->pkey_cnt = 0;; port->pkey_cnt++) { - ret = ibv_query_pkey(port->dev->verbs, port->port_num, port->pkey_cnt, &pkey); - if (ret || !pkey) - break; - } port->lid = attr.lid; port->lid_mask = 0xffff - ((1 << attr.lmc) - 1); @@ -3213,8 +3604,22 @@ return; atomic_set(&port->sa_dest.refcnt, 1); - for (i = 0; i < port->pkey_cnt; i++) - acm_ep_up(port, (uint16_t) i); + for (i = 0; i < attr.pkey_tbl_len; i++) { + ret = ibv_query_pkey(port->dev->verbs, port->port_num, i, &pkey); + if (ret) + continue; + pkey = ntohs(pkey); + if (!(pkey & 0x7fff)) + continue; + + /* Determine pkey index for default partition with preference for full membership */ + if (!is_full_default_pkey_set && (pkey & 0x7fff) == 0x7fff) { + port->default_pkey_ix = i; + if (pkey & 0x8000) + is_full_default_pkey_set = 1; + } + acm_ep_up(port, (uint16_t) i); + } acm_port_join(port); port->state = IBV_PORT_ACTIVE; @@ -3281,6 +3686,13 @@ if (dev->port[i].state == IBV_PORT_ACTIVE) acm_port_down(&dev->port[i]); break; + case IBV_EVENT_CLIENT_REREGISTER: + if (dev->port[i].state == IBV_PORT_ACTIVE) { + acm_port_join(&dev->port[i]); + acm_log(1, "%s %d has reregistered\n", + dev->verbs->device->name, i + 1); + } + break; default: break; } @@ -3473,6 +3885,8 @@ addr_preload = acm_convert_addr_preload(value); else if (!stricmp("addr_data_file", opt)) strcpy(addr_data_file, value); + else if (!stricmp("support_ips_in_addr_cfg", opt)) + support_ips_in_addr_cfg = atoi(value); } fclose(f); @@ -3500,6 +3914,7 @@ acm_log(0, "route data file %s\n", route_data_file); acm_log(0, "address preload %d\n", addr_preload); acm_log(0, "address data file %s\n", addr_data_file); + acm_log(0, "support IP's in ibacm_addr.cfg %d\n", support_ips_in_addr_cfg); } static FILE *acm_open_log(void) @@ -3622,6 +4037,9 @@ return -1; } + acm_log(1, "creating IP Netlink socket\n"); + acm_ipnl_create(); + acm_activate_devices(); acm_log(1, "starting timeout/retry thread\n"); beginthread(acm_retry_handler, NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/src/acm_util.c new/ibacm-1.0.9/src/acm_util.c --- old/ibacm-1.0.8/src/acm_util.c 1970-01-01 01:00:00.000000000 +0100 +++ new/ibacm-1.0.9/src/acm_util.c 2014-06-23 19:44:45.000000000 +0200 @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2014 Intel Corporation. All rights reserved. + * + * This software is available to you under the OpenFabrics.org BSD license + * below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <net/if_arp.h> +#include <string.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <errno.h> + +#include <infiniband/acm.h> +#include "acm_mad.h" +#include "acm_util.h" + +int acm_if_is_ib(char *ifname) +{ + unsigned type; + char buf[128]; + FILE *f; + int ret; + + snprintf(buf, sizeof buf, "//sys//class//net//%s//type", ifname); + f = fopen(buf, "r"); + if (!f) { + acm_log(0, "failed to open %s\n", buf); + return 0; + } + + if (fgets(buf, sizeof buf, f)) { + type = strtol(buf, NULL, 0); + ret = (type == ARPHRD_INFINIBAND); + } else { + acm_log(0, "failed to read interface type\n"); + ret = 0; + } + + fclose(f); + return ret; +} + +int acm_if_get_pkey(char *ifname, uint16_t *pkey) +{ + char buf[128], *end; + FILE *f; + int ret; + + snprintf(buf, sizeof buf, "//sys//class//net//%s//pkey", ifname); + f = fopen(buf, "r"); + if (!f) { + acm_log(0, "failed to open %s\n", buf); + return -1; + } + + if (fgets(buf, sizeof buf, f)) { + *pkey = strtol(buf, &end, 16); + ret = 0; + } else { + acm_log(0, "failed to read pkey\n"); + ret = -1; + } + + fclose(f); + return ret; +} + +int acm_if_get_sgid(char *ifname, union ibv_gid *sgid) +{ + char buf[128], *end; + FILE *f; + int i, p, ret; + + snprintf(buf, sizeof buf, "//sys//class//net//%s//address", ifname); + f = fopen(buf, "r"); + if (!f) { + acm_log(0, "failed to open %s\n", buf); + return -1; + } + + if (fgets(buf, sizeof buf, f)) { + for (i = 0, p = 12; i < 16; i++, p += 3) { + buf[p + 2] = '\0'; + sgid->raw[i] = (uint8_t) strtol(buf + p, &end, 16); + } + ret = 0; + } else { + acm_log(0, "failed to read sgid\n"); + ret = -1; + } + + fclose(f); + return ret; +} + +int acm_if_iter_sys(acm_if_iter_cb cb, void *ctx) +{ + struct ifconf *ifc; + struct ifreq *ifr; + char ip[INET6_ADDRSTRLEN]; + int s, ret, i, len; + uint16_t pkey; + union ibv_gid sgid; + uint8_t addr_type; + uint8_t addr[ACM_MAX_ADDRESS]; + size_t addr_len; + char *alias_sep; + + s = socket(AF_INET6, SOCK_DGRAM, 0); + if (!s) + return -1; + + len = sizeof(*ifc) + sizeof(*ifr) * 64; + ifc = malloc(len); + if (!ifc) { + ret = -1; + goto out1; + } + + memset(ifc, 0, len); + ifc->ifc_len = len; + ifc->ifc_req = (struct ifreq *) (ifc + 1); + + ret = ioctl(s, SIOCGIFCONF, ifc); + if (ret < 0) { + acm_log(0, "ioctl ifconf error %d\n", ret); + goto out2; + } + + ifr = ifc->ifc_req; + for (i = 0; i < ifc->ifc_len / sizeof(struct ifreq); i++) { + switch (ifr[i].ifr_addr.sa_family) { + case AF_INET: + addr_type = ACM_ADDRESS_IP; + memcpy(&addr, &((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr, sizeof addr); + addr_len = 4; + inet_ntop(ifr[i].ifr_addr.sa_family, + &((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr, ip, sizeof ip); + break; + case AF_INET6: + addr_type = ACM_ADDRESS_IP6; + memcpy(&addr, &((struct sockaddr_in6 *) &ifr[i].ifr_addr)->sin6_addr, sizeof addr); + addr_len = ACM_MAX_ADDRESS; + inet_ntop(ifr[i].ifr_addr.sa_family, + &((struct sockaddr_in6 *) &ifr[i].ifr_addr)->sin6_addr, ip, sizeof ip); + break; + default: + continue; + } + + acm_log(2, "%s\n", ifr[i].ifr_name); + + alias_sep = strchr(ifr[i].ifr_name, ':'); + if (alias_sep) + *alias_sep = '\0'; + + if (!acm_if_is_ib(ifr[i].ifr_name)) + continue; + + ret = acm_if_get_sgid(ifr[i].ifr_name, &sgid); + if (ret) + continue; + + ret = acm_if_get_pkey(ifr[i].ifr_name, &pkey); + if (ret) + continue; + + cb(ifr[i].ifr_name, &sgid, pkey, addr_type, addr, addr_len, ip, ctx); + } + ret = 0; + +out2: + free(ifc); +out1: + close(s); + return ret; + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/src/acm_util.h new/ibacm-1.0.9/src/acm_util.h --- old/ibacm-1.0.8/src/acm_util.h 1970-01-01 01:00:00.000000000 +0100 +++ new/ibacm-1.0.9/src/acm_util.h 2014-06-23 19:44:45.000000000 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Intel Corporation. All rights reserved. + * + * This software is available to you under the OpenFabrics.org BSD license + * below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(ACM_IF_H) +#define ACM_IF_H + +#include <infiniband/verbs.h> + +#ifdef ACME_PRINTS + +#define acm_log(level, format, ...) \ + printf(format, ## __VA_ARGS__) + +#else /* !ACME_PRINTS */ +#define acm_log(level, format, ...) \ + acm_write(level, "%s: "format, __func__, ## __VA_ARGS__) + +void acm_write(int level, const char *format, ...); +#endif /* ACME_PRINTS */ + +int acm_if_is_ib(char *ifname); +int acm_if_get_pkey(char *ifname, uint16_t *pkey); +int acm_if_get_sgid(char *ifname, union ibv_gid *sgid); + +typedef void (*acm_if_iter_cb)(char *ifname, union ibv_gid *gid, uint16_t pkey, + uint8_t addr_type, uint8_t *addr, size_t addr_len, + char *addr_name, void *ctx); +int acm_if_iter_sys(acm_if_iter_cb cb, void *ctx); + +#endif /* ACM_IF_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/src/acme.c new/ibacm-1.0.9/src/acme.c --- old/ibacm-1.0.8/src/acme.c 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/src/acme.c 2014-06-23 19:44:45.000000000 +0200 @@ -43,6 +43,7 @@ #include <infiniband/verbs.h> #include <infiniband/acm.h> #include "libacm.h" +#include "acm_util.h" static char *dest_dir = ACM_CONF_DIR; static char *addr_file = ACM_ADDR_FILE; @@ -279,6 +280,10 @@ fprintf(f, "# Default is ACM_CONF_DIR/ibacm_hosts.data\n"); fprintf(f, "# addr_data_file /etc/rdma/ibacm_hosts.data\n"); fprintf(f, "\n"); + fprintf(f, "# support_ips_in_addr_cfg:\n"); + fprintf(f, "# If 1 continue to read IP addresses from ibacm_addr.cfg\n"); + fprintf(f, "# Default is 0 \"no\"\n"); + fprintf(f, "# support_ips_in_addr_cfg 0\n"); } static int open_dir(void) @@ -316,9 +321,11 @@ fprintf(f, "# Entry format is:\n"); fprintf(f, "# address device port pkey\n"); fprintf(f, "#\n"); + fprintf(f, "# NOTE: IP addresses are now automatically read and monitored on the system.\n"); + fprintf(f, "# Therefore they are no longer required in this file.\n"); + fprintf(f, "#\n"); fprintf(f, "# The address may be one of the following:\n"); fprintf(f, "# host_name - ascii character string, up to 31 characters\n"); - fprintf(f, "# address - IPv4 or IPv6 formatted address\n"); fprintf(f, "#\n"); fprintf(f, "# device name - struct ibv_device name\n"); fprintf(f, "# port number - valid port number on device (numbering starts at 1)\n"); @@ -330,8 +337,6 @@ fprintf(f, "# node31 ibv_device0 1 default\n"); fprintf(f, "# node31-1 ibv_device0 1 0x00FF\n"); fprintf(f, "# node31-2 ibv_device0 2 0x00FF\n"); - fprintf(f, "# 192.168.0.1 ibv_device0 1 0xFFFF\n"); - fprintf(f, "# 192.168.0.2 ibv_device0 2 default\n"); } static int open_verbs(void) @@ -353,7 +358,7 @@ for (i = 0; i < dev_cnt; i++) { verbs[i] = ibv_open_device(dev_array[i]); - if (!verbs) { + if (!verbs[i]) { printf("ibv_open_device - failed to open device\n"); ret = -1; goto err2; @@ -448,12 +453,6 @@ goto out2; } - ret = gen_addr_ip(f); - if (ret) { - printf("Failed to auto generate IP addresses in config file\n"); - goto out2; - } - out2: close_verbs(); out1: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/ibacm-1.0.8/src/libacm.c new/ibacm-1.0.9/src/libacm.c --- old/ibacm-1.0.8/src/libacm.c 2013-07-26 06:27:59.000000000 +0200 +++ new/ibacm-1.0.9/src/libacm.c 2014-06-23 19:44:45.000000000 +0200 @@ -40,21 +40,6 @@ #include <netdb.h> #include <arpa/inet.h> -struct acm_port { - uint8_t port_num; - uint16_t lid; - union ibv_gid gid; - int pkey_cnt; - uint16_t pkey[4]; -}; - -struct acm_device { - struct ibv_context *verbs; - uint64_t guid; - int port_cnt; - struct acm_port *ports; -}; - extern lock_t lock; static SOCKET sock = INVALID_SOCKET; static short server_port = 6125; -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org