Whamcloud - gitweb
* placeholder commit
authoreeb <eeb>
Fri, 29 Apr 2005 15:19:45 +0000 (15:19 +0000)
committereeb <eeb>
Fri, 29 Apr 2005 15:19:45 +0000 (15:19 +0000)
59 files changed:
lnet/include/libcfs/darwin/darwin-mem.h
lnet/include/libcfs/kp30.h
lnet/include/libcfs/libcfs.h
lnet/include/lnet/api.h
lnet/include/lnet/kpr.h
lnet/include/lnet/lib-lnet.h
lnet/include/lnet/lib-p30.h
lnet/include/lnet/lib-types.h
lnet/include/lnet/lnetctl.h
lnet/include/lnet/ptlctl.h
lnet/klnds/gmlnd/gmlnd.h
lnet/klnds/gmlnd/gmlnd_api.c
lnet/klnds/gmlnd/gmlnd_cb.c
lnet/klnds/gmlnd/gmlnd_module.c
lnet/klnds/iiblnd/iiblnd.c
lnet/klnds/iiblnd/iiblnd.h
lnet/klnds/iiblnd/iiblnd_cb.c
lnet/klnds/lolnd/lolnd.c
lnet/klnds/openiblnd/openiblnd.c
lnet/klnds/openiblnd/openiblnd.h
lnet/klnds/openiblnd/openiblnd_cb.c
lnet/klnds/qswlnd/qswlnd.c
lnet/klnds/qswlnd/qswlnd.h
lnet/klnds/qswlnd/qswlnd_cb.c
lnet/klnds/ralnd/ralnd.c
lnet/klnds/ralnd/ralnd.h
lnet/klnds/ralnd/ralnd_cb.c
lnet/klnds/socklnd/socklnd.c
lnet/klnds/socklnd/socklnd.h
lnet/klnds/socklnd/socklnd_cb.c
lnet/klnds/viblnd/viblnd.c
lnet/klnds/viblnd/viblnd.h
lnet/klnds/viblnd/viblnd_cb.c
lnet/klnds/viblnd/wirecheck.c
lnet/libcfs/linux/linux-module.c
lnet/libcfs/module.c
lnet/libcfs/nidstrings.c
lnet/lnet/Makefile.in
lnet/lnet/api-ni.c
lnet/lnet/autoMakefile.am
lnet/lnet/lib-move.c
lnet/lnet/lib-msg.c
lnet/lnet/module.c
lnet/router/Makefile.in
lnet/router/autoMakefile.am
lnet/router/proc.c
lnet/router/router.c
lnet/router/router.h
lnet/tests/ping.h
lnet/tests/ping_cli.c
lnet/tests/sping_cli.c
lnet/ulnds/socklnd/tcplnd.c
lnet/ulnds/tcplnd.c
lnet/utils/Makefile.am
lnet/utils/acceptor.c [deleted file]
lnet/utils/gmlndnid.c
lnet/utils/portals.c
lnet/utils/ptlctl.c
lnet/utils/wirecheck.c

index 922a1b8..ce4a42b 100644 (file)
@@ -184,6 +184,9 @@ extern void cfs_mem_cache_free ( cfs_mem_cache_t *, void *);
 #define copy_from_user(kaddr, uaddr, size)     copyin((caddr_t)uaddr, (caddr_t)kaddr, size)
 #define copy_to_user(uaddr, kaddr, size)       copyout((caddr_t)kaddr, (caddr_t)uaddr, size)
 
+#error "need this define"
+#define strncpy_from_user(kaddr, uaddr, size) "something"
+
 #if defined (__ppc__)
 #define mb()  __asm__ __volatile__ ("sync" : : : "memory")
 #define rmb()  __asm__ __volatile__ ("sync" : : : "memory")
index 66cf0e1..a74756c 100644 (file)
@@ -208,10 +208,26 @@ void portals_debug_dumplog(void);
 #define CLASSERT(cond) ({ switch(42) { case (cond): case 0: break; } })
 
 /* support decl needed both by kernel and liblustre */
-int   libcfs_isknown_nettype(int type);
-char *libcfs_nettype2str(int type);
-char *libcfs_nid2str(ptl_nid_t nid);
-char *libcfs_id2str(ptl_process_id_t id);
+int        libcfs_isknown_nal(int type);
+char      *libcfs_nal2str(int type);
+int        libcfs_str2nal(char *str);
+char      *libcfs_net2str(__u32 net);
+char      *libcfs_nid2str(ptl_nid_t nid);
+__u32      libcfs_str2net(char *str);
+ptl_nid_t  libcfs_str2nid(char *str);
+int        libcfs_str2anynid(ptl_nid_t *nid, char *str);
+char      *libcfs_id2str(ptl_process_id_t id);
+
+#if !CRAY_PORTALS
+/* how a lustre portals NID encodes net:address */
+#define PTL_NIDADDR(nid)      ((__u32)((nid) & 0xffffffff))
+#define PTL_NIDNET(nid)       ((__u32)(((nid) >> 32)) & 0xffffffff)
+#define PTL_MKNID(net,addr)   ((((__u64)(net))<<32)|((__u64)(addr)))
+/* how net encodes type:number */
+#define PTL_NETNUM(net)       ((net) & 0xffff)
+#define PTL_NETNAL(net)       (((net) >> 16) & 0xffff)
+#define PTL_MKNET(nal,num)    ((((__u32)(nal))<<16)|((__u32)(num)))
+#endif
 
 #ifndef CURRENT_TIME
 # define CURRENT_TIME time(0)
@@ -235,9 +251,33 @@ struct portals_device_userstate
  * USER LEVEL STUFF BELOW
  */
 
-#define PORTAL_IOCTL_VERSION 0x00010008
-#define PING_SYNC       0
-#define PING_ASYNC      1
+#define PORTAL_IOCTL_VERSION 0x00010009
+
+struct portal_ioctl_data {
+        __u32 ioc_len;
+        __u32 ioc_version;
+
+        __u64 ioc_nid;
+        __u64 ioc_u64[1];
+
+        __u32 ioc_flags;
+        __u32 ioc_count;
+        __u32 ioc_net;
+        __u32 ioc_u32[6];
+
+        __u32 ioc_inllen1;
+        char *ioc_inlbuf1;
+        __u32 ioc_inllen2;
+        char *ioc_inlbuf2;
+
+        __u32 ioc_plen1; /* buffers in userspace */
+        char *ioc_pbuf1;
+        __u32 ioc_plen2; /* buffers in userspace */
+        char *ioc_pbuf2;
+
+        char ioc_bulk[0];
+};
+
 
 struct portal_ioctl_hdr {
         __u32 ioc_len;
@@ -364,59 +404,52 @@ extern int portal_ioctl_getdata(char *buf, char *end, void *arg);
 /* ioctls for manipulating snapshots 30- */
 #define IOC_PORTAL_TYPE                   'e'
 #define IOC_PORTAL_MIN_NR                 30
+/* libcfs ioctls */
+#define IOC_PORTAL_PANIC                   _IOWR('e', 30, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_CLEAR_DEBUG             _IOWR('e', 31, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_MARK_DEBUG              _IOWR('e', 32, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_CONTROL             _IOWR('e', 33, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_SNAPSHOT            _IOWR('e', 34, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_LWT_LOOKUP_STRING       _IOWR('e', 35, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_MEMHOG                  _IOWR('e', 36, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_PING                    _IOWR('e', 37, IOCTL_PORTAL_TYPE)
+/* portals ioctls */
+#define IOC_PORTAL_GET_NI                  _IOWR('e', 50, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_FAIL_NID                _IOWR('e', 51, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_ROUTE               _IOWR('e', 52, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_ROUTE               _IOWR('e', 53, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_ROUTE               _IOWR('e', 54, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_NOTIFY_ROUTER           _IOWR('e', 55, IOCTL_PORTAL_TYPE)
+/* nal ioctls */
+#define IOC_PORTAL_REGISTER_MYNID          _IOWR('e', 70, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_CLOSE_CONNECTION        _IOWR('e', 71, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_PUSH_CONNECTION         _IOWR('e', 72, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_CONN                _IOWR('e', 73, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_PEER                _IOWR('e', 74, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_PEER                _IOWR('e', 75, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_PEER                _IOWR('e', 76, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_TXDESC              _IOWR('e', 77, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_ADD_INTERFACE           _IOWR('e', 78, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_DEL_INTERFACE           _IOWR('e', 79, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_INTERFACE           _IOWR('e', 80, IOCTL_PORTAL_TYPE)
+#define IOC_PORTAL_GET_GMID                _IOWR('e', 81, IOCTL_PORTAL_TYPE)
+
+#define IOC_PORTAL_MAX_NR                             81
 
-#define IOC_PORTAL_PING                    _IOWR('e', 30, IOCTL_PORTAL_TYPE)
-
-#define IOC_PORTAL_CLEAR_DEBUG             _IOWR('e', 32, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MARK_DEBUG              _IOWR('e', 33, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_PANIC                   _IOWR('e', 34, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_NAL_CMD                 _IOWR('e', 35, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_GET_NID                 _IOWR('e', 36, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_FAIL_NID                _IOWR('e', 37, IOCTL_PORTAL_TYPE)
-/* gap: use me! */
-#define IOC_PORTAL_LWT_CONTROL             _IOWR('e', 39, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_LWT_SNAPSHOT            _IOWR('e', 40, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_LWT_LOOKUP_STRING       _IOWR('e', 41, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MEMHOG                  _IOWR('e', 42, IOCTL_PORTAL_TYPE)
-#define IOC_PORTAL_MAX_NR                             42
 
 enum {
-        QSWNAL    = 1,
+        LONAL     = 1,
         SOCKNAL   = 2,
-        GMNAL     = 3,
-        /*          4 unused */
-        /*          5 unused */
-        ROUTER    = 6,
-        OPENIBNAL = 7,
-        IIBNAL    = 8,
-        LONAL     = 9,
-        RANAL     = 10,
-        VIBNAL    = 11,
-        NAL_ENUM_END_MARKER
+        QSWNAL    = 3,
+        GMNAL     = 4,
+        OPENIBNAL = 5,
+        IIBNAL    = 6,
+        VIBNAL    = 7,
+        RANAL     = 8,
 };
 
 #define PTL_NALFMT_SIZE             32 /* %u:%u.%u.%u.%u,%u (10+4+4+4+3+5+1) */
 
-#define NAL_MAX_NR (NAL_ENUM_END_MARKER - 1)
-
-/* unused                            100 */
-#define NAL_CMD_CLOSE_CONNECTION     101
-#define NAL_CMD_REGISTER_MYNID       102
-#define NAL_CMD_PUSH_CONNECTION      103
-#define NAL_CMD_GET_CONN             104
-#define NAL_CMD_DEL_PEER             105
-#define NAL_CMD_ADD_PEER             106
-#define NAL_CMD_GET_PEER             107
-#define NAL_CMD_GET_TXDESC           108
-#define NAL_CMD_ADD_ROUTE            109
-#define NAL_CMD_DEL_ROUTE            110
-#define NAL_CMD_GET_ROUTE            111
-#define NAL_CMD_NOTIFY_ROUTER        112
-#define NAL_CMD_ADD_INTERFACE        113
-#define NAL_CMD_DEL_INTERFACE        114
-#define NAL_CMD_GET_INTERFACE        115
-
-
 enum {
         DEBUG_DAEMON_START       =  1,
         DEBUG_DAEMON_STOP        =  2,
index ac8ecab..ec8d5b1 100644 (file)
@@ -253,117 +253,15 @@ do {                                                                    \
 
 #define LUSTRE_SRV_PTL_PID      LUSTRE_PTL_PID
 
-/*
- * eeb cfg
- * ecf6
- * ecfG
- */
-#define PORTALS_CFG_VERSION 0xecf60001
-
-struct portals_cfg {
-        __u32 pcfg_version;
-        __u32 pcfg_command;
-
-        __u32 pcfg_nal;
-        __u32 pcfg_flags;
-
-        __u32 pcfg_gw_nal;
-        __u32 pcfg_padding1;
-
-        __u64 pcfg_nid;
-        __u64 pcfg_nid2;
-        __u64 pcfg_nid3;
-        __u32 pcfg_id;
-        __u32 pcfg_misc;
-        __u32 pcfg_fd;
-        __u32 pcfg_count;
-        __u32 pcfg_size;
-        __u32 pcfg_wait;
-
-        __u32 pcfg_plen1; /* buffers in userspace */
-        __u32 pcfg_plen2; /* buffers in userspace */
-        __u32 pcfg_alloc_size;  /* size of this allocated portals_cfg */
-        char  pcfg_pbuf[0];
-};
-
-#define PCFG_INIT(pcfg, cmd)                            \
-do {                                                    \
-        memset(&(pcfg), 0, sizeof((pcfg)));             \
-        (pcfg).pcfg_version = PORTALS_CFG_VERSION;      \
-        (pcfg).pcfg_command = (cmd);                    \
-                                                        \
-} while (0)
-
-#define PCFG_INIT_PBUF(pcfg, cmd, plen1, plen2)                         \
-        do {                                                            \
-                int bufsize = size_round(sizeof(*(pcfg)));              \
-                bufsize += size_round(plen1) + size_round(plen2);       \
-                PORTAL_ALLOC((pcfg), bufsize);                          \
-                if ((pcfg)) {                                           \
-                        memset((pcfg), 0, bufsize);                     \
-                        (pcfg)->pcfg_version = PORTALS_CFG_VERSION;     \
-                        (pcfg)->pcfg_command = (cmd);                   \
-                        (pcfg)->pcfg_plen1 = (plen1);                   \
-                        (pcfg)->pcfg_plen2 = (plen2);                   \
-                        (pcfg)->pcfg_alloc_size = bufsize;              \
-                }                                                       \
-        } while (0)
-
-#define PCFG_FREE_PBUF(pcfg) PORTAL_FREE((pcfg), (pcfg)->pcfg_alloc_size)
-
-#define PCFG_PBUF(pcfg, idx)                                            \
-        (0 == (idx)                                                     \
-         ? ((char *)(pcfg) + size_round(sizeof(*(pcfg))))               \
-         : (1 == (idx)                                                  \
-            ? ((char *)(pcfg) + size_round(sizeof(*(pcfg))) + size_round(pcfg->pcfg_plen1)) \
-            : (NULL)))
-
-typedef int (nal_cmd_handler_fn)(struct portals_cfg *, void *);
-int libcfs_nal_cmd_register(int nal, nal_cmd_handler_fn *handler, void *arg);
-int libcfs_nal_cmd(struct portals_cfg *pcfg);
-void libcfs_nal_cmd_unregister(int nal);
-
-struct portal_ioctl_data {
-        __u32 ioc_len;
-        __u32 ioc_version;
-        __u64 ioc_nid;
-        __u64 ioc_nid2;
-        __u64 ioc_nid3;
-        __u32 ioc_count;
-        __u32 ioc_nal;
-        __u32 ioc_nal_cmd;
-        __u32 ioc_fd;
-        __u32 ioc_id;
-
-        __u32 ioc_flags;
-        __u32 ioc_size;
-
-        __u32 ioc_wait;
-        __u32 ioc_timeout;
-        __u32 ioc_misc;
-
-        __u32 ioc_inllen1;
-        char *ioc_inlbuf1;
-        __u32 ioc_inllen2;
-        char *ioc_inlbuf2;
-
-        __u32 ioc_plen1; /* buffers in userspace */
-        char *ioc_pbuf1;
-        __u32 ioc_plen2; /* buffers in userspace */
-        char *ioc_pbuf2;
-
-        char ioc_bulk[0];
-};
-
-
 #ifdef __KERNEL__
 
 #include <libcfs/list.h>
 
+struct portal_ioctl_data;                       /* forward ref */
+
 struct libcfs_ioctl_handler {
         struct list_head item;
-        int (*handle_ioctl)(struct portal_ioctl_data *data,
-                            unsigned int cmd, unsigned long args);
+        int (*handle_ioctl)(unsigned int cmd, struct portal_ioctl_data *data);
 };
 
 #define DECLARE_IOCTL_HANDLER(ident, func)              \
index 5a6d32a..5de6d2a 100644 (file)
@@ -39,19 +39,13 @@ ptl_err_t PtlNIDist(ptl_handle_ni_t   interface_in,
 ptl_err_t PtlNIHandle(ptl_handle_any_t handle_in, 
                      ptl_handle_ni_t *interface_out);
 
-
 /* 
  * PtlFailNid
  *
- * Not an official Portals 3 API call.  It provides a way of simulating
- * communications failures to all (nid == PTL_NID_ANY), or specific peers
- * (via multiple calls), either until further notice (threshold == -1), or
- * for a specific number of messages.  Passing a threshold of zero, "heals"
- * the given peer.
+ * Not an official Portals 3 API call.  It provides a way of calling
+ * network-specific functions 
  */
-ptl_err_t PtlFailNid(ptl_handle_ni_t ni, 
-                    ptl_nid_t       nid, 
-                    unsigned int    threshold);
+int PtlNICtl(ptl_handle_ni_t interface, unsigned int cmd, void *arg);
 
 /*
  * PtlSnprintHandle: 
@@ -153,4 +147,6 @@ ptl_err_t PtlGet(ptl_handle_md_t  md_in,
                 ptl_ac_index_t   cookie_in,
                 ptl_match_bits_t match_bits_in, 
                 ptl_size_t       offset_in);
+
+
 #endif
index 23d6e7c..bba2047 100644 (file)
@@ -6,171 +6,5 @@
 
 # include <portals/lib-types.h> /* for ptl_hdr_t */
 
-/******************************************************************************/
-/* Kernel Portals Router interface */
-
-typedef void (*kpr_fwd_callback_t)(void *arg, int error); // completion callback
-
-/* space for routing targets to stash "stuff" in a forwarded packet */
-typedef union {
-        long long        _alignment;
-        void            *_space[16];            /* scale with CPU arch */
-} kprfd_scratch_t;
-
-/* Kernel Portals Routing Forwarded message Descriptor */
-typedef struct {
-        struct list_head     kprfd_list;        /* stash in queues (routing target can use) */
-        ptl_nid_t            kprfd_target_nid;  /* final destination NID */
-        ptl_nid_t            kprfd_gateway_nid; /* gateway NID */
-        ptl_hdr_t           *kprfd_hdr;         /* header in wire byte order */
-        int                  kprfd_nob;         /* # payload bytes */
-        int                  kprfd_niov;        /* # payload frags */
-        ptl_kiov_t          *kprfd_kiov;        /* payload fragments */
-        void                *kprfd_router_arg;  /* originating NAL's router arg */
-        kpr_fwd_callback_t   kprfd_callback;    /* completion callback */
-        void                *kprfd_callback_arg; /* completion callback arg */
-        kprfd_scratch_t      kprfd_scratch;     /* scratchpad for routing targets */
-} kpr_fwd_desc_t;
-
-typedef void  (*kpr_fwd_t)(void *arg, kpr_fwd_desc_t *fwd);
-typedef void  (*kpr_notify_t)(void *arg, ptl_nid_t peer, int alive);
-
-/* NAL's routing interface (Kernel Portals Routing Nal Interface) */
-typedef const struct {
-        int             kprni_nalid;    /* NAL's id */
-        void           *kprni_arg;      /* Arg to pass when calling into NAL */
-        kpr_fwd_t       kprni_fwd;      /* NAL's forwarding entrypoint */
-        kpr_notify_t    kprni_notify;   /* NAL's notification entrypoint */
-} kpr_nal_interface_t;
-
-/* Router's routing interface (Kernel Portals Routing Router Interface) */
-typedef const struct {
-        /* register the calling NAL with the router and get back the handle for
-         * subsequent calls */
-        int     (*kprri_register) (kpr_nal_interface_t *nal_interface,
-                                   void **router_arg);
-
-        /* ask the router to find a gateway that forwards to 'nid' and is a
-         * peer of the calling NAL; assume caller will send 'nob' bytes of
-         * payload there */
-        int     (*kprri_lookup) (void *router_arg, ptl_nid_t nid, int nob,
-                                 ptl_nid_t *gateway_nid);
-
-        /* hand a packet over to the router for forwarding */
-        kpr_fwd_t kprri_fwd_start;
-
-        /* hand a packet back to the router for completion */
-        void    (*kprri_fwd_done) (void *router_arg, kpr_fwd_desc_t *fwd,
-                                   int error);
-
-        /* notify the router about peer state */
-        void    (*kprri_notify) (void *router_arg, ptl_nid_t peer,
-                                 int alive, time_t when);
-
-        /* the calling NAL is shutting down */
-        void    (*kprri_shutdown) (void *router_arg);
-
-        /* deregister the calling NAL with the router */
-        void    (*kprri_deregister) (void *router_arg);
-
-} kpr_router_interface_t;
-
-/* Convenient struct for NAL to stash router interface/args */
-typedef struct {
-        kpr_router_interface_t  *kpr_interface;
-        void                    *kpr_arg;
-} kpr_router_t;
-
-extern kpr_router_interface_t   kpr_router_interface;
-
-static inline int
-kpr_register (kpr_router_t *router, kpr_nal_interface_t *nalif)
-{
-        int    rc;
-
-        router->kpr_interface = PORTAL_SYMBOL_GET (kpr_router_interface);
-        if (router->kpr_interface == NULL)
-                return (-ENOENT);
-
-        rc = (router->kpr_interface)->kprri_register (nalif, &router->kpr_arg);
-        if (rc != 0)
-                router->kpr_interface = NULL;
-
-        PORTAL_SYMBOL_PUT (kpr_router_interface);
-        return (rc);
-}
-
-static inline int
-kpr_routing (kpr_router_t *router)
-{
-        return (router->kpr_interface != NULL);
-}
-
-static inline int
-kpr_lookup (kpr_router_t *router, ptl_nid_t nid, int nob, ptl_nid_t *gateway_nid)
-{
-        if (!kpr_routing (router))
-                return (-ENETUNREACH);
-
-        return (router->kpr_interface->kprri_lookup(router->kpr_arg, nid, nob,
-                                                    gateway_nid));
-}
-
-static inline void
-kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
-              int nob, int niov, ptl_kiov_t *kiov,
-              kpr_fwd_callback_t callback, void *callback_arg)
-{
-        fwd->kprfd_target_nid   = nid;
-        fwd->kprfd_gateway_nid  = nid;
-        fwd->kprfd_hdr          = hdr;
-        fwd->kprfd_nob          = nob;
-        fwd->kprfd_niov         = niov;
-        fwd->kprfd_kiov         = kiov;
-        fwd->kprfd_callback     = callback;
-        fwd->kprfd_callback_arg = callback_arg;
-}
-
-static inline void
-kpr_fwd_start (kpr_router_t *router, kpr_fwd_desc_t *fwd)
-{
-        if (!kpr_routing (router))
-                fwd->kprfd_callback (fwd->kprfd_callback_arg, -ENETUNREACH);
-        else
-                router->kpr_interface->kprri_fwd_start (router->kpr_arg, fwd);
-}
-
-static inline void
-kpr_fwd_done (kpr_router_t *router, kpr_fwd_desc_t *fwd, int error)
-{
-        LASSERT (kpr_routing (router));
-        router->kpr_interface->kprri_fwd_done (router->kpr_arg, fwd, error);
-}
-
-static inline void
-kpr_notify (kpr_router_t *router,
-            ptl_nid_t peer, int alive, time_t when)
-{
-        if (!kpr_routing (router))
-                return;
-
-        router->kpr_interface->kprri_notify(router->kpr_arg, peer, alive, when);
-}
-
-static inline void
-kpr_shutdown (kpr_router_t *router)
-{
-        if (kpr_routing (router))
-                router->kpr_interface->kprri_shutdown (router->kpr_arg);
-}
-
-static inline void
-kpr_deregister (kpr_router_t *router)
-{
-        if (!kpr_routing (router))
-                return;
-        router->kpr_interface->kprri_deregister (router->kpr_arg);
-        router->kpr_interface = NULL;
-}
 
 #endif /* _KPR_H */
index f4e681a..2647e2e 100644 (file)
@@ -357,16 +357,56 @@ ptl_handle2me (ptl_handle_me_t *handle)
         return (lh_entry (lh, ptl_me_t, me_lh));
 }
 
-/*
- * When the NAL detects an incoming message header, it should call
- * ptl_parse() decode it.  If the message header is garbage, ptl_parse()
- * returns immediately with failure, otherwise the NAL callbacks will be
- * called to receive the message body.  They are handed the private cookie
- * as a way for the NAL to maintain state about which transaction is being
- * processed.  An extra parameter, ptl_msg contains the lib-level message
- * state for passing to ptl_finalize() when the message body has been
- * received.
- */
+/******************************************************************************/
+/* Portals Router */
+
+/* NI APIs */
+int       kpr_routing(void);
+ptl_nid_t kpr_lookup(ptl_ni_t **ni, ptl_nid_t nid, int nob);
+void      kpr_fwd_start(ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+void      kpr_fwd_done(ptl_ni_t *ni, kpr_fwd_desc_t *fwd, int error);
+int       kpr_notify(ptl_ni_t *ni, ptl_nid_t peer, int alive, time_t when);
+
+/* internal APIs */
+int       kpr_ctl(unsigned int cmd, void *arg);
+void      kpr_initialise(void);
+void      kpr_finalise(void);
+
+static inline void
+kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
+              int nob, int niov, ptl_kiov_t *kiov,
+              kpr_fwd_callback_t callback, void *callback_arg)
+{
+        fwd->kprfd_target_nid   = nid;
+        fwd->kprfd_gateway_nid  = nid;
+        fwd->kprfd_hdr          = hdr;
+        fwd->kprfd_nob          = nob;
+        fwd->kprfd_niov         = niov;
+        fwd->kprfd_kiov         = kiov;
+        fwd->kprfd_callback     = callback;
+        fwd->kprfd_callback_arg = callback_arg;
+}
+
+/******************************************************************************/
+
+static inline void
+ptl_ni_addref(ptl_ni_t *ni) 
+{
+        LASSERT (atomic_read(&ni->ni_refcount) > 0);
+        atomic_inc(&ni->ni_refcount);
+}
+
+extern void ptl_queue_zombie_ni (ptl_ni_t *ni);
+
+static inline void
+ptl_ni_decref(ptl_ni_t *ni)
+{
+        LASSERT (atomic_read(&ni->ni_refcount) > 0);
+        if (atomic_dec_and_test(&ni->ni_refcount))
+                ptl_queue_zombie_ni(ni);
+}
+
+extern ptl_ni_t *ptl_net2ni (__u32 net);
 extern void ptl_enq_event_locked (void *private,
                                   ptl_eq_t *eq, ptl_event_t *ev);
 extern void ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg, 
@@ -375,7 +415,7 @@ extern ptl_err_t ptl_parse (ptl_ni_t *ni, ptl_hdr_t *hdr, void *private);
 extern ptl_msg_t *ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid, 
                                         ptl_msg_t *get_msg);
 extern void ptl_print_hdr (ptl_hdr_t * hdr);
-
+extern ptl_err_t ptl_fail_nid(ptl_nid_t nid, unsigned int threshold);
 
 extern ptl_size_t ptl_iov_nob (int niov, struct iovec *iov);
 extern void ptl_copy_iov2buf (char *dest, int niov, struct iovec *iov, 
@@ -398,7 +438,7 @@ extern int ptl_extract_kiov (int dst_niov, ptl_kiov_t *dst,
 extern ptl_err_t ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
                            ptl_size_t offset, ptl_size_t mlen, ptl_size_t rlen);
 extern ptl_err_t ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
-                           ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                           ptl_hdr_t *hdr, int type, ptl_process_id_t target,
                            ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len);
 
 extern void ptl_me_unlink(ptl_me_t *me);
index f4e681a..2647e2e 100644 (file)
@@ -357,16 +357,56 @@ ptl_handle2me (ptl_handle_me_t *handle)
         return (lh_entry (lh, ptl_me_t, me_lh));
 }
 
-/*
- * When the NAL detects an incoming message header, it should call
- * ptl_parse() decode it.  If the message header is garbage, ptl_parse()
- * returns immediately with failure, otherwise the NAL callbacks will be
- * called to receive the message body.  They are handed the private cookie
- * as a way for the NAL to maintain state about which transaction is being
- * processed.  An extra parameter, ptl_msg contains the lib-level message
- * state for passing to ptl_finalize() when the message body has been
- * received.
- */
+/******************************************************************************/
+/* Portals Router */
+
+/* NI APIs */
+int       kpr_routing(void);
+ptl_nid_t kpr_lookup(ptl_ni_t **ni, ptl_nid_t nid, int nob);
+void      kpr_fwd_start(ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+void      kpr_fwd_done(ptl_ni_t *ni, kpr_fwd_desc_t *fwd, int error);
+int       kpr_notify(ptl_ni_t *ni, ptl_nid_t peer, int alive, time_t when);
+
+/* internal APIs */
+int       kpr_ctl(unsigned int cmd, void *arg);
+void      kpr_initialise(void);
+void      kpr_finalise(void);
+
+static inline void
+kpr_fwd_init (kpr_fwd_desc_t *fwd, ptl_nid_t nid, ptl_hdr_t *hdr,
+              int nob, int niov, ptl_kiov_t *kiov,
+              kpr_fwd_callback_t callback, void *callback_arg)
+{
+        fwd->kprfd_target_nid   = nid;
+        fwd->kprfd_gateway_nid  = nid;
+        fwd->kprfd_hdr          = hdr;
+        fwd->kprfd_nob          = nob;
+        fwd->kprfd_niov         = niov;
+        fwd->kprfd_kiov         = kiov;
+        fwd->kprfd_callback     = callback;
+        fwd->kprfd_callback_arg = callback_arg;
+}
+
+/******************************************************************************/
+
+static inline void
+ptl_ni_addref(ptl_ni_t *ni) 
+{
+        LASSERT (atomic_read(&ni->ni_refcount) > 0);
+        atomic_inc(&ni->ni_refcount);
+}
+
+extern void ptl_queue_zombie_ni (ptl_ni_t *ni);
+
+static inline void
+ptl_ni_decref(ptl_ni_t *ni)
+{
+        LASSERT (atomic_read(&ni->ni_refcount) > 0);
+        if (atomic_dec_and_test(&ni->ni_refcount))
+                ptl_queue_zombie_ni(ni);
+}
+
+extern ptl_ni_t *ptl_net2ni (__u32 net);
 extern void ptl_enq_event_locked (void *private,
                                   ptl_eq_t *eq, ptl_event_t *ev);
 extern void ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg, 
@@ -375,7 +415,7 @@ extern ptl_err_t ptl_parse (ptl_ni_t *ni, ptl_hdr_t *hdr, void *private);
 extern ptl_msg_t *ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid, 
                                         ptl_msg_t *get_msg);
 extern void ptl_print_hdr (ptl_hdr_t * hdr);
-
+extern ptl_err_t ptl_fail_nid(ptl_nid_t nid, unsigned int threshold);
 
 extern ptl_size_t ptl_iov_nob (int niov, struct iovec *iov);
 extern void ptl_copy_iov2buf (char *dest, int niov, struct iovec *iov, 
@@ -398,7 +438,7 @@ extern int ptl_extract_kiov (int dst_niov, ptl_kiov_t *dst,
 extern ptl_err_t ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
                            ptl_size_t offset, ptl_size_t mlen, ptl_size_t rlen);
 extern ptl_err_t ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
-                           ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                           ptl_hdr_t *hdr, int type, ptl_process_id_t target,
                            ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len);
 
 extern void ptl_me_unlink(ptl_me_t *me);
index 0d33782..ae84a5e 100644 (file)
@@ -220,17 +220,48 @@ typedef struct {
 
 struct ptl_ni;                                  /* forward ref */
 
+/******************************************************************************/
+/* Portals Router */
+
+typedef void (*kpr_fwd_callback_t)(struct ptl_ni *ni,
+                                   void *arg, int error);
+
+/* space for routing targets to stash "stuff" in a forwarded packet */
+typedef union {
+        long long        _alignment;
+        void            *_space[16];            /* scale with CPU arch */
+} kprfd_scratch_t;
+
+/* Kernel Portals Routing Forwarded message Descriptor */
+typedef struct {
+        struct list_head     kprfd_list;        /* stash in queues (routing target can use) */
+        ptl_nid_t            kprfd_target_nid;  /* final destination NID */
+        ptl_nid_t            kprfd_gateway_nid; /* gateway NID */
+        ptl_hdr_t           *kprfd_hdr;         /* header in wire byte order */
+        int                  kprfd_nob;         /* # payload bytes */
+        int                  kprfd_niov;        /* # payload frags */
+        ptl_kiov_t          *kprfd_kiov;        /* payload fragments */
+        struct ptl_ni       *kprfd_src_ni;      /* originating NI */
+        kpr_fwd_callback_t   kprfd_callback;    /* completion callback */
+        void                *kprfd_callback_arg; /* completion callback arg */
+        kprfd_scratch_t      kprfd_scratch;     /* scratchpad for routing targets */
+} kpr_fwd_desc_t;
+
+/******************************************************************************/
+
 typedef struct ptl_nal
 {
         /* fields managed by portals */
         struct list_head  nal_list;             /* stash in the NAL table */
-        int               nal_refcount;         /* # active instances */
+        atomic_t          nal_refcount;         /* # active instances */
 
         /* fields initialised by the NAL */
         unsigned int      nal_type;
         
         ptl_err_t  (*nal_startup) (struct ptl_ni *ni, char **interfaces);
         void       (*nal_shutdown) (struct ptl_ni *ni);
+
+        int        (*nal_ctl)(struct ptl_ni *ni, unsigned int cmd, void *arg);
         
        /*
         * send: Sends a preformatted header and payload data to a
@@ -242,16 +273,16 @@ typedef struct ptl_nal
         * ptl_finalize on completion
         */
        ptl_err_t (*nal_send) 
-                (struct ptl_ni *ni, void *private, ptl_msg_t *cookie
-                 ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, 
-                 unsigned int niov, struct iovec *iov, 
+                (struct ptl_ni *ni, void *private, ptl_msg_t *msg
+                 ptl_hdr_t *hdr, int type, ptl_process_id_t target,
+                 int routing, unsigned int niov, struct iovec *iov, 
                  size_t offset, size_t mlen);
         
        /* as send, but with a set of page fragments (NULL if not supported) */
        ptl_err_t (*nal_send_pages)
                 (struct ptl_ni *ni, void *private, ptl_msg_t *cookie, 
-                 ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid
-                 unsigned int niov, ptl_kiov_t *iov, 
+                 ptl_hdr_t *hdr, int type, ptl_process_id_t target
+                 int routing, unsigned int niov, ptl_kiov_t *iov, 
                  size_t offset, size_t mlen);
        /*
         * recv: Receives an incoming message from a remote process.  The
@@ -274,8 +305,12 @@ typedef struct ptl_nal
                  unsigned int niov, ptl_kiov_t *iov, 
                  size_t offset, size_t mlen, size_t rlen);
 
-       /* Calculate a network "distance" to given node */
-       int (*ptl_dist) (struct ptl_ni *ni, ptl_nid_t nid, unsigned long *dist);
+        /* forward a packet for the router */
+        void (*nal_fwd)(struct ptl_ni *ni, kpr_fwd_desc_t *fwd);        
+
+        /* notification of peer health */
+        void (*nal_notify)(struct ptl_ni *ni, ptl_nid_t peer, int alive);
+        
 } ptl_nal_t;
 
 typedef struct ptl_ni {
@@ -283,6 +318,8 @@ typedef struct ptl_ni {
         ptl_nid_t         ni_nid;               /* interface's NID */
         void             *ni_data;              /* instance-specific data */
         ptl_nal_t        *ni_nal;               /* procedural interface */
+        int               ni_shutdown;          /* shutting down? */
+        atomic_t          ni_refcount;          /* reference count */
 } ptl_ni_t;
 
 typedef struct                                  /* loopback descriptor */
@@ -311,6 +348,8 @@ typedef struct
         ptl_ni_limits_t   apini_actual_limits;
 
         struct list_head  apini_nis;            /* NAL instances */
+        struct list_head  apini_zombie_nis;     /* dying NAL instances */
+        int               apini_nzombie_nis;    /* # of NIS to wait for */
 
         int               apini_lh_hash_size;   /* size of lib handle hash table */
         struct list_head *apini_lh_hash_table;  /* all extant lib handles, this interface */
index c55e11e..8b3c997 100644 (file)
 #define SMFS_DEV_ID  2
 #define SMFS_DEV_PATH "/dev/snapdev"
 
-int ptl_name2nal(char *str);
-int ptl_parse_ipaddr (__u32 *ipaddrp, char *str);
-int ptl_parse_anynid (ptl_nid_t *nidp, char *str);
-int ptl_parse_nid (ptl_nid_t *nidp, char *str);
-char * ptl_nid2str (char *buffer, ptl_nid_t nid);
-
 int ptl_initialize(int argc, char **argv);
 int jt_ptl_network(int argc, char **argv);
 int jt_ptl_print_interfaces(int argc, char **argv);
@@ -51,7 +45,6 @@ int jt_ptl_disconnect(int argc, char **argv);
 int jt_ptl_push_connection(int argc, char **argv);
 int jt_ptl_print_active_txs(int argc, char **argv);
 int jt_ptl_ping(int argc, char **argv);
-int jt_ptl_shownid(int argc, char **argv);
 int jt_ptl_mynid(int argc, char **argv);
 int jt_ptl_add_uuid(int argc, char **argv);
 int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility  */
@@ -77,8 +70,6 @@ int jt_dbg_mark_debug_buf(int argc, char **argv);
 int jt_dbg_modules(int argc, char **argv);
 int jt_dbg_panic(int argc, char **argv);
 
-int ptl_set_cfg_record_cb(cfg_record_cb_t cb);
-
 /* l_ioctl.c */
 typedef int (ioc_handler_t)(int dev_id, unsigned int opc, void *buf);
 void set_ioc_handler(ioc_handler_t *handler);
index c55e11e..8b3c997 100644 (file)
 #define SMFS_DEV_ID  2
 #define SMFS_DEV_PATH "/dev/snapdev"
 
-int ptl_name2nal(char *str);
-int ptl_parse_ipaddr (__u32 *ipaddrp, char *str);
-int ptl_parse_anynid (ptl_nid_t *nidp, char *str);
-int ptl_parse_nid (ptl_nid_t *nidp, char *str);
-char * ptl_nid2str (char *buffer, ptl_nid_t nid);
-
 int ptl_initialize(int argc, char **argv);
 int jt_ptl_network(int argc, char **argv);
 int jt_ptl_print_interfaces(int argc, char **argv);
@@ -51,7 +45,6 @@ int jt_ptl_disconnect(int argc, char **argv);
 int jt_ptl_push_connection(int argc, char **argv);
 int jt_ptl_print_active_txs(int argc, char **argv);
 int jt_ptl_ping(int argc, char **argv);
-int jt_ptl_shownid(int argc, char **argv);
 int jt_ptl_mynid(int argc, char **argv);
 int jt_ptl_add_uuid(int argc, char **argv);
 int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility  */
@@ -77,8 +70,6 @@ int jt_dbg_mark_debug_buf(int argc, char **argv);
 int jt_dbg_modules(int argc, char **argv);
 int jt_dbg_panic(int argc, char **argv);
 
-int ptl_set_cfg_record_cb(cfg_record_cb_t cb);
-
 /* l_ioctl.c */
 typedef int (ioc_handler_t)(int dev_id, unsigned int opc, void *buf);
 void set_ioc_handler(ioc_handler_t *handler);
index 826e455..84377b7 100644 (file)
@@ -251,11 +251,6 @@ typedef struct _gmnal_data_t {
 extern gmnal_data_t    *global_nal_data;
 
 /*
- * for ioctl get pid
- */
-#define GMNAL_IOC_GET_GNID 1   
-
-/*
  *     Return codes
  */
 #define GMNAL_STATUS_OK        0
index 0af6295..88d8671 100644 (file)
@@ -31,7 +31,7 @@ gmnal_data_t  *global_nal_data = NULL;
 #define         GLOBAL_NID_STR_LEN      16
 char            global_nid_str[GLOBAL_NID_STR_LEN] = {0};
 
-extern int gmnal_cmd(struct portals_cfg *pcfg, void *private);
+extern int gmnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
 
 /*
  *      Write the global nid /proc/sys/gmnal/globalnid
@@ -68,9 +68,6 @@ gmnal_shutdown(ptl_ni_t *ni)
         LASSERT(nal_data == global_nal_data);
        CDEBUG(D_TRACE, "gmnal_shutdown: nal_data [%p]\n", nal_data);
 
-        /* Stop portals calling our ioctl handler */
-        libcfs_nal_cmd_unregister(GMNAL);
-
         /* XXX for shutdown "under fire" we probably need to set a shutdown
          * flag so when portals calls us we fail immediately and dont queue any
          * more work but our threads can still call into portals OK.  THEN
@@ -292,23 +289,6 @@ gmnal_startup(ptl_ni_t *ni, char **interfaces)
        CDEBUG(D_INFO, "portals_pid is [%u]\n", ni->ni_pid);
        CDEBUG(D_INFO, "portals_nid is ["LPU64"]\n", ni->ni_nid);
        
-       if (libcfs_nal_cmd_register(GMNAL, &gmnal_cmd, nal_data) != 0) {
-               CDEBUG(D_INFO, "libcfs_nal_cmd_register failed\n");
-
-                /* XXX these cleanup cases should be restructured to
-                 * minimise duplication... */
-               gmnal_stop_rxthread(nal_data);
-               gmnal_stop_ctthread(nal_data);
-               gmnal_free_txd(nal_data);
-               gmnal_free_srxd(nal_data);
-               GMNAL_GM_LOCK(nal_data);
-               gm_close(nal_data->gm_port);
-               gm_finalize();
-               GMNAL_GM_UNLOCK(nal_data);
-               PORTAL_FREE(nal_data, sizeof(gmnal_data_t));    
-               return(PTL_FAIL);
-        }
-
         /* might be better to initialise this at module load rather than in
          * NAL startup */
         nal_data->sysctl = NULL;
@@ -318,6 +298,7 @@ gmnal_startup(ptl_ni_t *ni, char **interfaces)
 
        global_nal_data = nal_data;
 
+        PORTAL_MODULE_USE;
        return(PTL_OK);
 }
 
@@ -325,6 +306,7 @@ ptl_nal_t the_gm_nal = {
         .nal_type           = GMNAL,
         .nal_startup        = gmnal_startup,
         .nal_shutdown       = gmnal_shutdown,
+        .nal_cmd            = gmnal_ctl,
         .nal_send           = gmnal_cb_send,
         .nal_send_pages     = gmnal_cb_send_pages,
         .nal_recv           = gmnal_cb_recv,
index 5ee7e98..87121f4 100644 (file)
@@ -152,9 +152,9 @@ ptl_err_t gmnal_cb_recv_pages(ptl_ni_t *ni, void *private,
 
 
 ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-                        ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
-                        unsigned int niov, struct iovec *iov, size_t offset,
-                        size_t len)
+                        ptl_hdr_t *hdr, int type, ptl_process_id_t target,
+                        int routing, unsigned int niov, struct iovec *iov, 
+                        size_t offset, size_t len)
 {
 
        gmnal_data_t    *nal_data;
@@ -163,11 +163,16 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
 
 
        CDEBUG(D_TRACE, "gmnal_cb_send niov[%d] offset["LPSZ"] len["LPSZ
-               "] nid["LPU64"]\n", niov, offset, len, nid);
+               "] target %s\n", niov, offset, len, libcfs_id2str(target));
        nal_data = ni->ni_data;
         CDEBUG(D_INFO, "nal_data [%p]\n", nal_data);
         LASSERT (nal_data != NULL);
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+
        if (GMNAL_IS_SMALL_MESSAGE(nal_data, niov, iov, len)) {
                CDEBUG(D_INFO, "This is a small message send\n");
                /*
@@ -198,13 +203,13 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
                        }
                        iov++;
                }
-               gmnal_small_tx(ni, private, cookie, hdr, type, nid, pid,
+               gmnal_small_tx(ni, private, cookie, hdr, type, target.nid, target.pid,
                               stxd,  len);
        } else {
                CDEBUG(D_ERROR, "Large message send is not supported\n");
                ptl_finalize(ni, private, cookie, PTL_FAIL);
                return(PTL_FAIL);
-               gmnal_large_tx(ni, private, cookie, hdr, type, nid, pid,
+               gmnal_large_tx(ni, private, cookie, hdr, type, target.nid, target.pid,
                                niov, iov, offset, len);
        }
        return(PTL_OK);
@@ -212,8 +217,9 @@ ptl_err_t gmnal_cb_send(ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
 
 ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private,
                               ptl_msg_t *cookie, ptl_hdr_t *hdr, int type,
-                              ptl_nid_t nid, ptl_pid_t pid, unsigned int kniov,
-                              ptl_kiov_t *kiov, size_t offset, size_t len)
+                              ptl_process_id_t target, int routing,
+                              unsigned int kniov, ptl_kiov_t *kiov, 
+                              size_t offset, size_t len)
 {
 
        gmnal_data_t    *nal_data;
@@ -222,12 +228,17 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private,
        gmnal_stxd_t    *stxd = NULL;
        ptl_err_t       status = PTL_OK;
 
-       CDEBUG(D_TRACE, "gmnal_cb_send_pages nid ["LPU64"] niov[%d] offset["
-               LPSZ"] len["LPSZ"]\n", nid, kniov, offset, len);
+       CDEBUG(D_TRACE, "gmnal_cb_send_pages target %s niov[%d] offset["
+               LPSZ"] len["LPSZ"]\n", libcfs_id2str(target), kniov, offset, len);
        nal_data = ni->ni_data;
         CDEBUG(D_INFO, "nal_data [%p]\n", nal_data);
         LASSERT (nal_data != NULL);
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+
        /* HP SFS 1380: Need to do the gm_bcopy after the kmap so we can kunmap
         * more aggressively.  This is the fix for a livelock situation under
         * load on ia32 that occurs when there are no more available entries in
@@ -275,8 +286,8 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private,
                        }
                         kiov++;
                }
-               status = gmnal_small_tx(ni, private, cookie, hdr, type, nid,
-                                       pid, stxd, len);
+               status = gmnal_small_tx(ni, private, cookie, hdr, type, target.nid,
+                                       target.pid, stxd, len);
        } else {
                int     i = 0;
                struct  iovec   *iovec = NULL, *iovec_dup = NULL;
@@ -299,8 +310,8 @@ ptl_err_t gmnal_cb_send_pages(ptl_ni_t *ni, void *private,
                         iovec++;
                         kiov++;
                }
-               gmnal_large_tx(ni, private, cookie, hdr, type, nid, 
-                               pid, kniov, iovec, offset, len);
+               gmnal_large_tx(ni, private, cookie, hdr, type, target.nid, 
+                               target.pid, kniov, iovec, offset, len);
                for (i=0; i<kniov; i++) {
                        kunmap(kiov_dup->kiov_page);
                        kiov_dup++;
index 3851649..77a6172 100644 (file)
@@ -33,8 +33,9 @@ int num_stxds = 5;
 int gm_port_id = 4;
 
 int
-gmnal_cmd(struct portals_cfg *pcfg, void *private)
+gmnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
+        struct portal_ioctl_data *data = arg;
        gmnal_data_t    *nal_data = NULL;
        char            *name = NULL;
        int             nid = -2;
@@ -42,18 +43,20 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private)
        gm_status_t     gm_status;
 
 
-       CDEBUG(D_TRACE, "gmnal_cmd [%d] private [%p]\n", 
-              pcfg->pcfg_command, private);
-       nal_data = (gmnal_data_t*)private;
-       switch(pcfg->pcfg_command) {
-       /*
-        * just reuse already defined GET_NID. Should define GMNAL version
-        */
-       case(GMNAL_IOC_GET_GNID):
-
-               PORTAL_ALLOC(name, pcfg->pcfg_plen1);
-               copy_from_user(name, PCFG_PBUF(pcfg, 1), pcfg->pcfg_plen1);
-       
+       CDEBUG(D_TRACE, "gmnal_cmd [%d] ni_data [%p]\n", cmd, ni->ni_data);
+       nal_data = (gmnal_data_t*)ni->ni_data;
+       switch(cmd) {
+       case IOC_PORTAL_GET_GMID:
+
+               PORTAL_ALLOC(name, data->ioc_plen1);
+                if (name == NULL)
+                        return -ENOMEM;
+                
+               if (copy_from_user(name, data->ioc_pbuf1, data->ioc_plen1)) {
+                        PORTAL_FREE(name, data->ioc_plen1);
+                        return -EFAULT;
+                }
+                
                GMNAL_GM_LOCK(nal_data);
                //nid = gm_host_name_to_node_id(nal_data->gm_port, name);
                 gm_status = gm_host_name_to_node_id_ex (nal_data->gm_port, 0, name, &nid);
@@ -61,9 +64,13 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private)
                 if (gm_status != GM_SUCCESS) {
                         CDEBUG(D_INFO, "gm_host_name_to_node_id_ex(...host %s) failed[%d]\n",
                                 name, gm_status);
-                        return (-1);
-                } else
-                       CDEBUG(D_INFO, "Local node %s id is [%d]\n", name, nid);
+                        PORTAL_FREE(name, data->ioc_plen1);
+                        return -ENOENT;
+                }
+
+                CDEBUG(D_INFO, "Local node %s id is [%d]\n", name, nid);
+                PORTAL_FREE(name, data->ioc_plen1);
+                
                GMNAL_GM_LOCK(nal_data);
                gm_status = gm_node_id_to_global_id(nal_data->gm_port, 
                                                    nid, &gnid);
@@ -71,18 +78,18 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private)
                if (gm_status != GM_SUCCESS) {
                        CDEBUG(D_INFO, "gm_node_id_to_global_id failed[%d]\n", 
                               gm_status);
-                       return(-1);
+                        return -ENOENT;
                }
                CDEBUG(D_INFO, "Global node is is [%u][%x]\n", gnid, gnid);
-               copy_to_user(PCFG_PBUF(pcfg, 2), &gnid, pcfg->pcfg_plen2);
-       break;
+
+                /* gnid returned to userspace in ioc_nid!!! */
+                data->ioc_nid = gnid;
+                return 0;
+        
        default:
-               CDEBUG(D_INFO, "gmnal_cmd UNKNOWN[%d]\n", pcfg->pcfg_command);
-               pcfg->pcfg_nid2 = -1;
+               CDEBUG(D_INFO, "gmnal_cmd UNKNOWN[%d]\n", cmd);
+                return -EINVAL;
        }
-
-
-       return(0);
 }
 
 
index dc92f36..6a59e59 100644 (file)
@@ -27,6 +27,7 @@ ptl_nal_t kibnal_nal = {
         .nal_type          = IIBNAL,
         .nal_startup       = kibnal_startup,
         .nal_shutdown      = kibnal_shutdown,
+        .nal_ctl           = kibnal_ctl,
         .nal_send          = kibnal_send,
         .nal_send_pages    = kibnal_send_pages,
         .nal_recv          = kibnal_recv,
@@ -294,7 +295,7 @@ kibnal_set_mynid(ptl_nid_t nid)
         /* Delete all existing peers and their connections after new
          * NID/incarnation set to ensure no old connections in our brave
          * new world. */
-        kibnal_del_peer (PTL_NID_ANY, 0);
+        kibnal_del_peer(PTL_NID_ANY);
 
         if (kibnal_data.kib_ni->ni_nid == PTL_NID_ANY) {
                 /* No new NID to install */
@@ -338,7 +339,7 @@ kibnal_set_mynid(ptl_nid_t nid)
                 iibt_cm_destroy_cep (kibnal_data.kib_cep);
                 /* remove any peers that sprung up while I failed to
                  * advertise myself */
-                kibnal_del_peer (PTL_NID_ANY, 0);
+                kibnal_del_peer(PTL_NID_ANY);
         }
 
         kibnal_data.kib_ni->ni_nid = PTL_NID_ANY;
@@ -515,19 +516,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid)
 }
 
 static void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
 {
         struct list_head *ctmp;
         struct list_head *cnxt;
         kib_conn_t       *conn;
 
-        if (!single_share)
-                peer->ibp_persistence = 0;
-        else if (peer->ibp_persistence > 0)
-                peer->ibp_persistence--;
-
-        if (peer->ibp_persistence != 0)
-                return;
+        peer->ibp_persistence = 0;
 
         if (list_empty(&peer->ibp_conns)) {
                 kibnal_unlink_peer_locked(peer);
@@ -545,7 +540,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
 }
 
 int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t)
 {
         unsigned long      flags;
         struct list_head  *ptmp;
@@ -575,11 +570,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share)
                         if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
                                 continue;
 
-                        kibnal_del_peer_locked (peer, single_share);
+                        kibnal_del_peer_locked (peer);
                         rc = 0;         /* matched something */
-
-                        if (single_share)
-                                goto out;
                 }
         }
  out:
@@ -925,63 +917,55 @@ kibnal_close_matching_conns (ptl_nid_t nid)
         return (count == 0 ? -ENOENT : 0);
 }
 
-static int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+int
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
-        int rc = -EINVAL;
+        struct portal_ioctl_data *data = arg;
+        int                       rc = -EINVAL;
         ENTRY;
 
-        LASSERT (pcfg != NULL);
+        LASSERT (ni == kibnal_data.kib_ni);
 
-        switch(pcfg->pcfg_command) {
-        case NAL_CMD_GET_PEER: {
+        switch(data->ioc_command) {
+        case IOC_PORTAL_GET_PEER: {
                 ptl_nid_t   nid = 0;
                 int         share_count = 0;
 
-                rc = kibnal_get_peer_info(pcfg->pcfg_count,
+                rc = kibnal_get_peer_info(data->ioc_count,
                                           &nid, &share_count);
-                pcfg->pcfg_nid   = nid;
-                pcfg->pcfg_size  = 0;
-                pcfg->pcfg_id    = 0;
-                pcfg->pcfg_misc  = 0;
-                pcfg->pcfg_count = 0;
-                pcfg->pcfg_wait  = share_count;
+                data->ioc_nid   = nid;
+                data->ioc_count = share_count;
                 break;
         }
-        case NAL_CMD_ADD_PEER: {
-                rc = kibnal_add_persistent_peer (pcfg->pcfg_nid);
+        case IOC_PORTAL_ADD_PEER: {
+                rc = kibnal_add_persistent_peer (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_DEL_PEER: {
-                rc = kibnal_del_peer (pcfg->pcfg_nid, 
-                                       /* flags == single_share */
-                                       pcfg->pcfg_flags != 0);
+        case IOC_PORTAL_DEL_PEER: {
+                rc = kibnal_del_peer (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_GET_CONN: {
-                kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+        case IOC_PORTAL_GET_CONN: {
+                kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
 
                 if (conn == NULL)
                         rc = -ENOENT;
                 else {
                         rc = 0;
-                        pcfg->pcfg_nid   = conn->ibc_peer->ibp_nid;
-                        pcfg->pcfg_id    = 0;
-                        pcfg->pcfg_misc  = 0;
-                        pcfg->pcfg_flags = 0;
+                        data->ioc_nid = conn->ibc_peer->ibp_nid;
                         kibnal_put_conn (conn);
                 }
                 break;
         }
-        case NAL_CMD_CLOSE_CONNECTION: {
-                rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+        case IOC_PORTAL_CLOSE_CONNECTION: {
+                rc = kibnal_close_matching_conns (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_REGISTER_MYNID: {
-                if (pcfg->pcfg_nid == PTL_NID_ANY)
+        case IOC_PORTAL_REGISTER_MYNID: {
+                if (data->ioc_nid == PTL_NID_ANY)
                         rc = -EINVAL;
                 else
-                        rc = kibnal_set_mynid (pcfg->pcfg_nid);
+                        rc = kibnal_set_mynid (data->ioc_nid);
                 break;
         }
         }
@@ -1175,10 +1159,6 @@ kibnal_shutdown (ptl_ni_t *ni)
                 LBUG();
 
         case IBNAL_INIT_ALL:
-                /* stop calls to nal_cmd */
-                libcfs_nal_cmd_unregister(IIBNAL);
-                /* No new peers */
-
                 /* resetting my NID to unadvertises me, removes my
                  * listener and nukes all current peers */
                 kibnal_set_mynid (PTL_NID_ANY);
@@ -1296,6 +1276,7 @@ kibnal_shutdown (ptl_ni_t *ni)
                atomic_read(&portal_kmemory));
 
         kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+        PORTAL_MODULE_UNUSE;
 }
 
 #define roundup_power(val, power) \
@@ -1346,6 +1327,8 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 return -ENOSYS;
         }
 
+        PORTAL_MODULE_USE;
+
         init_MUTEX (&kibnal_data.kib_nid_mutex);
         init_MUTEX_LOCKED (&kibnal_data.kib_nid_signal);
         kibnal_data.kib_ni->ni_nid = PTL_NID_ANY;
@@ -1619,14 +1602,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 }
         }
         
-        /*****************************************************/
-
-        rc = libcfs_nal_cmd_register(IIBNAL, &kibnal_cmd, NULL);
-        if (rc != 0) {
-                CERROR ("Can't initialise command interface (rc = %d)\n", rc);
-                goto failed;
-        }
-
         /* flag everything initialised */
         kibnal_data.kib_init = IBNAL_INIT_ALL;
         /*****************************************************/
index 1354ba2..4eadbc9 100644 (file)
@@ -858,14 +858,17 @@ kibnal_whole_mem(void)
 
 extern ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
 extern void kibnal_shutdown (ptl_ni_t *ni);
-extern ptl_err_t kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-                              ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
-                              unsigned int payload_niov, struct iovec *payload_iov,
-                              size_t payload_offset, size_t payload_len);
-extern ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 
-                                    ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
-                                    unsigned int payload_niov, ptl_kiov_t *payload_kiov, 
-                                    size_t payload_offset, size_t payload_len);
+extern int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
+ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
+                       ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+                       int type, ptl_process_id_t tgt, int routing,
+                       unsigned int payload_niov, struct iovec *payload_iov,
+                       size_t payload_offset, size_t payload_nob);
+ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
+                             ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
+                             int type, ptl_process_id_t tgt, int routing,
+                             unsigned int payload_niov, ptl_kiov_t *payload_kiov,
+                             size_t payload_offset, size_t payload_nob);
 extern ptl_err_t kibnal_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
                               unsigned int niov, struct iovec *iov, 
                               size_t offset, size_t mlen, size_t rlen);
@@ -875,7 +878,7 @@ extern ptl_err_t kibnal_recv_pages (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
 
 extern kib_peer_t *kibnal_create_peer (ptl_nid_t nid);
 extern void kibnal_destroy_peer (kib_peer_t *peer);
-extern int kibnal_del_peer (ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer (ptl_nid_t nid);
 extern kib_peer_t *kibnal_find_peer_locked (ptl_nid_t nid);
 extern void kibnal_unlink_peer_locked (kib_peer_t *peer);
 extern int  kibnal_close_stale_conns_locked (kib_peer_t *peer,
index 45655a9..bb1bb07 100644 (file)
@@ -1488,18 +1488,18 @@ init_tx:
 }
 
 static ptl_err_t
-kibnal_sendmsg(ptl_ni_t     *ni, 
-               void         *private,
-               ptl_msg_t    *ptlmsg,
-               ptl_hdr_t    *hdr, 
-               int           type, 
-               ptl_nid_t     nid, 
-               ptl_pid_t     pid,
-               unsigned int  payload_niov, 
-               struct iovec *payload_iov, 
-               ptl_kiov_t   *payload_kiov,
-               size_t        payload_offset,
-               size_t        payload_nob)
+kibnal_sendmsg(ptl_ni_t        *ni, 
+               void            *private,
+               ptl_msg_t       *ptlmsg,
+               ptl_hdr_t       *hdr, 
+               int              type, 
+               ptl_process_id_t target,
+               int              routing,
+               unsigned int     payload_niov, 
+               struct iovec    *payload_iov, 
+               ptl_kiov_t      *payload_kiov,
+               size_t           payload_offset,
+               size_t           payload_nob)
 {
         kib_msg_t  *ibmsg;
         kib_tx_t   *tx;
@@ -1507,8 +1507,8 @@ kibnal_sendmsg(ptl_ni_t     *ni,
 
         /* NB 'private' is different depending on what we're sending.... */
 
-        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid:"LPX64
-               " pid %d\n", payload_nob, payload_niov, nid , pid);
+        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n", 
+               payload_nob, payload_niov, libcfs_id2str(target));
 
         LASSERT (payload_nob == 0 || payload_niov > 0);
         LASSERT (payload_niov <= PTL_MD_MAX_IOV);
@@ -1518,6 +1518,11 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         /* payload is either all vaddrs or all pages */
         LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+        
         switch (type) {
         default:
                 LBUG();
@@ -1539,7 +1544,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 /* Incoming message consistent with immediate reply? */
                 if (rx->rx_msg->ibm_type != IBNAL_MSG_IMMEDIATE) {
                         CERROR ("REPLY to "LPX64" bad opbm type %d!!!\n",
-                                nid, rx->rx_msg->ibm_type);
+                                target.nid, rx->rx_msg->ibm_type);
                         return (PTL_FAIL);
                 }
 
@@ -1547,7 +1552,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
                 if (nob >= IBNAL_MSG_SIZE) {
                         CERROR("REPLY for "LPX64" too big (RDMA not requested): %d\n", 
-                               nid, payload_nob);
+                               target.nid, payload_nob);
                         return (PTL_FAIL);
                 }
                 break;
@@ -1558,7 +1563,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[ptlmsg->msg_md->md_length]);
                 if (nob > IBNAL_MSG_SIZE)
                         return (kibnal_start_passive_rdma(IBNAL_MSG_GET_RDMA, 
-                                                          nid, ptlmsg, hdr));
+                                                          target.nid, ptlmsg, hdr));
                 break;
 
         case PTL_MSG_ACK:
@@ -1570,7 +1575,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
                 if (nob > IBNAL_MSG_SIZE)
                         return (kibnal_start_passive_rdma(IBNAL_MSG_PUT_RDMA,
-                                                          nid, ptlmsg, hdr));
+                                                          target.nid, ptlmsg, hdr));
                 
                 break;
         }
@@ -1580,7 +1585,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                   in_interrupt()));
         if (tx == NULL) {
                 CERROR ("Can't send %d to "LPX64": tx descs exhausted%s\n", 
-                        type, nid, in_interrupt() ? " (intr)" : "");
+                        type, target.nid, in_interrupt() ? " (intr)" : "");
                 return (PTL_NO_SPACE);
         }
 
@@ -1605,30 +1610,30 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         /* ptlmsg gets finalized when tx completes */
         tx->tx_ptlmsg[0] = ptlmsg;
 
-        kibnal_launch_tx(tx, nid);
+        kibnal_launch_tx(tx, target.nid);
         return (PTL_OK);
 }
 
 ptl_err_t
 kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-             ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+             ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing, 
              unsigned int payload_niov, struct iovec *payload_iov,
              size_t payload_offset, size_t payload_len)
 {
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, payload_iov, NULL,
                                payload_offset, payload_len));
 }
 
 ptl_err_t
 kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 
-                   ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                   ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                    unsigned int payload_niov, ptl_kiov_t *payload_kiov, 
                    size_t payload_offset, size_t payload_len)
 {
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, NULL, payload_kiov,
                                payload_offset, payload_len));
 }
index 1f63d25..0469b23 100644 (file)
@@ -57,8 +57,6 @@ klonal_startup (ptl_ni_t *ni, char **interfaces)
 
        CDEBUG (D_NET, "start\n");
 
-#warning fixme
-        ni->ni_nid = 0;
         klonal_instanced = 1;
 
        PORTAL_MODULE_USE;
index 582b3de..a2ee0ed 100644 (file)
@@ -27,6 +27,7 @@ ptl_nal_t               kibnal_nal = {
         .nal_type       = OPENIBNAL,
         .nal_startup    = kibnal_startup,
         .nal_shutdown   = kibnal_shutdown,
+        .nal_ctl        = kibnal_ctl,
         .nal_send       = kibnal_send,
         .nal_send_pages = kibnal_send_pages,
         .nal_recv       = kibnal_recv,
@@ -1180,19 +1181,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid, __u32 ip, int port)
 }
 
 void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
 {
         struct list_head *ctmp;
         struct list_head *cnxt;
         kib_conn_t       *conn;
 
-        if (!single_share)
-                peer->ibp_persistence = 0;
-        else if (peer->ibp_persistence > 0)
-                peer->ibp_persistence--;
-
-        if (peer->ibp_persistence != 0)
-                return;
+        peer->ibp_persistence = 0;
 
         if (list_empty(&peer->ibp_conns)) {
                 kibnal_unlink_peer_locked(peer);
@@ -1210,7 +1205,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
 }
 
 int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t nid)
 {
         unsigned long      flags;
         struct list_head  *ptmp;
@@ -1240,11 +1235,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share)
                         if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
                                 continue;
 
-                        kibnal_del_peer_locked (peer, single_share);
+                        kibnal_del_peer_locked (peer);
                         rc = 0;         /* matched something */
-
-                        if (single_share)
-                                goto out;
                 }
         }
  out:
@@ -1576,65 +1568,59 @@ kibnal_close_matching_conns (ptl_nid_t nid)
 }
 
 int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
-        int rc = -EINVAL;
+        struct portal_ioctl_data *data = arg;
+        int                       rc = -EINVAL;
 
-        LASSERT (pcfg != NULL);
+        LASSERT (ni == kibnal_data.kib_ni);
 
-        switch(pcfg->pcfg_command) {
-        case NAL_CMD_GET_PEER: {
+        switch(cmd) {
+        case IOC_PORTAL_GET_PEER: {
                 ptl_nid_t   nid = 0;
                 __u32       ip = 0;
                 int         port = 0;
                 int         share_count = 0;
 
-                rc = kibnal_get_peer_info(pcfg->pcfg_count,
+                rc = kibnal_get_peer_info(data->ioc_count,
                                           &nid, &ip, &port, &share_count);
-                pcfg->pcfg_nid   = nid;
-                pcfg->pcfg_size  = 0;
-                pcfg->pcfg_id    = ip;
-                pcfg->pcfg_misc  = port;
-                pcfg->pcfg_count = 0;
-                pcfg->pcfg_wait  = share_count;
+                data->ioc_nid    = nid;
+                data->ioc_count  = share_count;
+                data->ioc_u32[0] = ip;
+                data->ioc_u32[1] = port;
                 break;
         }
-        case NAL_CMD_ADD_PEER: {
-                rc = kibnal_add_persistent_peer (pcfg->pcfg_nid,
-                                                 pcfg->pcfg_id, /* IP */
-                                                 pcfg->pcfg_misc); /* port */
+        case IOC_PORTAL_ADD_PEER: {
+                rc = kibnal_add_persistent_peer (data->ioc_nid,
+                                                 data->ioc_u32[0], /* IP */
+                                                 data->ioc_u32[1]); /* port */
                 break;
         }
-        case NAL_CMD_DEL_PEER: {
-                rc = kibnal_del_peer (pcfg->pcfg_nid, 
-                                       /* flags == single_share */
-                                       pcfg->pcfg_flags != 0);
+        case IOC_PORTAL_DEL_PEER: {
+                rc = kibnal_del_peer (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_GET_CONN: {
-                kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+        case IOC_PORTAL_GET_CONN: {
+                kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
 
                 if (conn == NULL)
                         rc = -ENOENT;
                 else {
                         rc = 0;
-                        pcfg->pcfg_nid   = conn->ibc_peer->ibp_nid;
-                        pcfg->pcfg_id    = 0;
-                        pcfg->pcfg_misc  = 0;
-                        pcfg->pcfg_flags = 0;
+                        data->ioc_nid = conn->ibc_peer->ibp_nid;
                         kibnal_put_conn (conn);
                 }
                 break;
         }
-        case NAL_CMD_CLOSE_CONNECTION: {
-                rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+        case IOC_PORTAL_CLOSE_CONNECTION: {
+                rc = kibnal_close_matching_conns (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_REGISTER_MYNID: {
-                if (pcfg->pcfg_nid == PTL_NID_ANY)
+        case IOC_PORTAL_REGISTER_MYNID: {
+                if (data->ioc_nid == PTL_NID_ANY)
                         rc = -EINVAL;
                 else
-                        rc = kibnal_set_mynid (pcfg->pcfg_nid);
+                        rc = kibnal_set_mynid (data->ioc_nid);
                 break;
         }
         }
@@ -1805,10 +1791,6 @@ kibnal_shutdown (ptl_ni_t *ni)
                 LBUG();
 
         case IBNAL_INIT_ALL:
-                /* stop calls to nal_cmd */
-                libcfs_nal_cmd_unregister(OPENIBNAL);
-                /* No new peers */
-
                 /* resetting my NID unadvertises me, removes my
                  * listener and nukes all current peers */
                 kibnal_set_mynid (PTL_NID_ANY);
@@ -1823,9 +1805,7 @@ kibnal_shutdown (ptl_ni_t *ni)
                         set_current_state (TASK_INTERRUPTIBLE);
                         schedule_timeout (HZ);
                 }
-                /* fall through */
 
-        case IBNAL_INIT_CQ:
                 rc = ib_cq_destroy (kibnal_data.kib_cq);
                 if (rc != 0)
                         CERROR ("Destroy CQ error: %d\n", rc);
@@ -1898,6 +1878,7 @@ kibnal_shutdown (ptl_ni_t *ni)
                atomic_read(&portal_kmemory));
 
         kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+        PORTAL_MODULE_UNUSE;
 }
 
 ptl_err_t
@@ -1916,6 +1897,7 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 return PTL_FAIL;
         }
 
+        PORTAL_MODULE_USE;
         memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */
 
         kibnal_data.kib_ni = ni;
@@ -2097,16 +2079,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 LASSERT (rc == 0);
         }
         
-        /* flag CQ initialised */
-        kibnal_data.kib_init = IBNAL_INIT_CQ;
-        /*****************************************************/
-        
-        rc = libcfs_nal_cmd_register(OPENIBNAL, &kibnal_cmd, NULL);
-        if (rc != 0) {
-                CERROR ("Can't initialise command interface (rc = %d)\n", rc);
-                goto failed;
-        }
-
         /* flag everything initialised */
         kibnal_data.kib_init = IBNAL_INIT_ALL;
         /*****************************************************/
index 9641fbb..fdfc043 100644 (file)
@@ -207,8 +207,7 @@ typedef struct
 #define IBNAL_INIT_PD              3
 #define IBNAL_INIT_FMR             4
 #define IBNAL_INIT_TXD             5
-#define IBNAL_INIT_CQ              6
-#define IBNAL_INIT_ALL             7
+#define IBNAL_INIT_ALL             6
 
 typedef struct kib_acceptsock                   /* accepted socket queued for connd */
 {
@@ -507,17 +506,16 @@ kibnal_wreqid_is_rx (__u64 wreqid)
 
 ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
 void kibnal_shutdown (ptl_ni_t *ni);
+int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
 ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
                        ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                       int type, ptl_nid_t nid, ptl_pid_t pid,
-                       unsigned int payload_niov, 
-                       struct iovec *payload_iov,
+                       int type, ptl_process_id_t tgt, int routing,
+                       unsigned int payload_niov, struct iovec *payload_iov,
                        size_t payload_offset, size_t payload_nob);
 ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
                              ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                             int type, ptl_nid_t nid, ptl_pid_t pid,
-                             unsigned int payload_niov, 
-                             ptl_kiov_t *payload_kiov,
+                             int type, ptl_process_id_t tgt, int routing,
+                             unsigned int payload_niov, ptl_kiov_t *payload_kiov,
                              size_t payload_offset, size_t payload_nob);
 ptl_err_t kibnal_recv(ptl_ni_t *ni, void *private,
                       ptl_msg_t *ptlmsg, unsigned int niov,
@@ -540,7 +538,7 @@ extern int kibnal_listener_procint(ctl_table *table, int write,
                                    size_t *lenp);
 extern kib_peer_t *kibnal_create_peer (ptl_nid_t nid);
 extern void kibnal_put_peer (kib_peer_t *peer);
-extern int kibnal_del_peer (ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer (ptl_nid_t nid);
 extern kib_peer_t *kibnal_find_peer_locked (ptl_nid_t nid);
 extern void kibnal_unlink_peer_locked (kib_peer_t *peer);
 extern int  kibnal_close_stale_conns_locked (kib_peer_t *peer,
@@ -577,8 +575,3 @@ extern void kibnal_start_active_rdma (int type, int status,
                                       unsigned int niov,
                                       struct iovec *iov, ptl_kiov_t *kiov,
                                       int offset, int nob);
-
-
-
-
-
index 6d2492b..6d38da0 100644 (file)
@@ -1210,18 +1210,18 @@ kibnal_start_active_rdma (int type, int status,
 }
 
 ptl_err_t
-kibnal_sendmsg(ptl_ni_t     *ni, 
-               void         *private,
-               ptl_msg_t    *ptlmsg,
-               ptl_hdr_t    *hdr, 
-               int           type, 
-               ptl_nid_t     nid, 
-               ptl_pid_t     pid,
-               unsigned int  payload_niov, 
-               struct iovec *payload_iov, 
-               ptl_kiov_t   *payload_kiov,
-               int           payload_offset,
-               int           payload_nob)
+kibnal_sendmsg(ptl_ni_t        *ni, 
+               void            *private,
+               ptl_msg_t       *ptlmsg,
+               ptl_hdr_t       *hdr, 
+               int              type, 
+               ptl_process_id_t target,
+               int              routing,
+               unsigned int     payload_niov, 
+               struct iovec    *payload_iov, 
+               ptl_kiov_t      *payload_kiov,
+               int              payload_offset,
+               int              payload_nob)
 {
         kib_msg_t  *ibmsg;
         kib_tx_t   *tx;
@@ -1229,8 +1229,8 @@ kibnal_sendmsg(ptl_ni_t     *ni,
 
         /* NB 'private' is different depending on what we're sending.... */
 
-        CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64" pid %d\n",
-               payload_nob, payload_niov, nid , pid);
+        CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n",
+               payload_nob, payload_niov, libcfs_id2str(target));
 
         LASSERT (payload_nob == 0 || payload_niov > 0);
         LASSERT (payload_niov <= PTL_MD_MAX_IOV);
@@ -1240,6 +1240,11 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         /* payload is either all vaddrs or all pages */
         LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+        
         switch (type) {
         default:
                 LBUG();
@@ -1261,7 +1266,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 /* Incoming message consistent with immediate reply? */
                 if (rx->rx_msg->ibm_type != IBNAL_MSG_IMMEDIATE) {
                         CERROR ("REPLY to "LPX64" bad opbm type %d!!!\n",
-                                nid, rx->rx_msg->ibm_type);
+                                target.nid, rx->rx_msg->ibm_type);
                         return (PTL_FAIL);
                 }
 
@@ -1269,7 +1274,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
                 if (nob > IBNAL_MSG_SIZE) {
                         CERROR("REPLY for "LPX64" too big (RDMA not requested): %d\n", 
-                               nid, payload_nob);
+                               target.nid, payload_nob);
                         return (PTL_FAIL);
                 }
                 break;
@@ -1280,7 +1285,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[ptlmsg->msg_md->md_length]);
                 if (nob > IBNAL_MSG_SIZE)
                         return (kibnal_start_passive_rdma(IBNAL_MSG_GET_RDMA, 
-                                                          nid, ptlmsg, hdr));
+                                                          target.nid, ptlmsg, hdr));
                 break;
 
         case PTL_MSG_ACK:
@@ -1292,7 +1297,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_msg_t, ibm_u.immediate.ibim_payload[payload_nob]);
                 if (nob > IBNAL_MSG_SIZE)
                         return (kibnal_start_passive_rdma(IBNAL_MSG_PUT_RDMA,
-                                                          nid, ptlmsg, hdr));
+                                                          target.nid, ptlmsg, hdr));
                 
                 break;
         }
@@ -1302,7 +1307,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                   in_interrupt()));
         if (tx == NULL) {
                 CERROR ("Can't send %d to "LPX64": tx descs exhausted%s\n", 
-                        type, nid, in_interrupt() ? " (intr)" : "");
+                        type, target.nid, in_interrupt() ? " (intr)" : "");
                 return (PTL_NO_SPACE);
         }
 
@@ -1327,30 +1332,30 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         /* ptlmsg gets finalized when tx completes */
         tx->tx_ptlmsg[0] = ptlmsg;
 
-        kibnal_launch_tx(tx, nid);
+        kibnal_launch_tx(tx, target.nid);
         return (PTL_OK);
 }
 
 ptl_err_t
 kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-             ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+             ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
              unsigned int payload_niov, struct iovec *payload_iov,
              size_t payload_offset, size_t payload_len)
 {
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, payload_iov, NULL,
                                payload_offset, payload_len));
 }
 
 ptl_err_t
 kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 
-                   ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                   ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                    unsigned int payload_niov, ptl_kiov_t *payload_kiov, 
                    size_t payload_offset, size_t payload_len)
 {
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, NULL, payload_kiov,
                                payload_offset, payload_len));
 }
index 8ccf8f8..db7184f 100644 (file)
@@ -27,29 +27,24 @@ ptl_nal_t kqswnal_nal =
        .nal_type       = QSWNAL,
        .nal_startup    = kqswnal_startup,
        .nal_shutdown   = kqswnal_shutdown,
+       .nal_ctl        = kqswnal_ctl,
        .nal_send       = kqswnal_send,
         .nal_send_pages = kqswnal_send_pages,
         .nal_recv       = kqswnal_recv,
         .nal_recv_pages = kqswnal_recv_pages,
+       .nal_fwd        = kqswnal_fwd_packet,
 };
 
 kqswnal_data_t         kqswnal_data;
 
-kpr_nal_interface_t kqswnal_router_interface = {
-       kprni_nalid:    QSWNAL,
-       kprni_arg:      NULL,
-       kprni_fwd:      kqswnal_fwd_packet,
-       kprni_notify:   NULL,                   /* we're connectionless */
-};
-
 int
-kqswnal_get_tx_desc (struct portals_cfg *pcfg)
+kqswnal_get_tx_desc (struct portal_ioctl_data *data)
 {
        unsigned long      flags;
        struct list_head  *tmp;
        kqswnal_tx_t      *ktx;
        ptl_hdr_t         *hdr;
-       int                index = pcfg->pcfg_count;
+       int                index = data->ioc_count;
        int                rc = -ENOENT;
 
        spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags);
@@ -61,16 +56,14 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg)
                ktx = list_entry (tmp, kqswnal_tx_t, ktx_list);
                hdr = (ptl_hdr_t *)ktx->ktx_buffer;
 
-               memcpy(pcfg->pcfg_pbuf, ktx,
-                      MIN(sizeof(*ktx), pcfg->pcfg_plen1));
-               pcfg->pcfg_count = le32_to_cpu(hdr->type);
-               pcfg->pcfg_size  = le32_to_cpu(hdr->payload_length);
-               pcfg->pcfg_nid   = le64_to_cpu(hdr->dest_nid);
-               pcfg->pcfg_nid2  = ktx->ktx_nid;
-               pcfg->pcfg_misc  = ktx->ktx_launcher;
-               pcfg->pcfg_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) |
-                                 (!ktx->ktx_isnblk                    ? 0 : 2) |
-                                 (ktx->ktx_state << 2);
+               data->ioc_count  = le32_to_cpu(hdr->payload_length);
+               data->ioc_nid    = le64_to_cpu(hdr->dest_nid);
+               data->ioc_u64[0] = ktx->ktx_nid;
+               data->ioc_u32[0] = le32_to_cpu(hdr->type);
+               data->ioc_u32[1] = ktx->ktx_launcher;
+               data->ioc_flags  = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) |
+                                  (!ktx->ktx_isnblk                    ? 0 : 2) |
+                                  (ktx->ktx_state << 2);
                rc = 0;
                break;
        }
@@ -80,22 +73,26 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg)
 }
 
 int
-kqswnal_cmd (struct portals_cfg *pcfg, void *private)
+kqswnal_ctl (ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
-       LASSERT (pcfg != NULL);
-       
-       switch (pcfg->pcfg_command) {
-       case NAL_CMD_GET_TXDESC:
-               return (kqswnal_get_tx_desc (pcfg));
-
-       case NAL_CMD_REGISTER_MYNID:
-               CDEBUG (D_IOCTL, "setting NID offset to "LPX64" (was "LPX64")\n",
-                       pcfg->pcfg_nid - kqswnal_data.kqn_elanid,
-                       kqswnal_data.kqn_nid_offset);
-               kqswnal_data.kqn_nid_offset =
-                       pcfg->pcfg_nid - kqswnal_data.kqn_elanid;
-               kqswnal_data.kqn_ni->ni_nid = pcfg->pcfg_nid;
-               return (0);
+       struct portal_ioctl_data *data = arg;
+
+       LASSERT (ni == kqswnal_data.kqn_ni);
+
+       switch (cmd) {
+       case IOC_PORTAL_GET_TXDESC:
+               return (kqswnal_get_tx_desc (data));
+
+       case IOC_PORTAL_REGISTER_MYNID:
+               if (data->ioc_nid == ni->ni_nid)
+                       return 0;
+               
+               LASSERT (PTL_NIDNET(data->ioc_nid) == PTL_NIDNET(ni->ni_nid));
+
+               CERROR("obsolete IOC_PORTAL_REGISTER_MYNID for %s(%s)\n",
+                      libcfs_nid2str(data->ioc_nid),
+                      libcfs_nid2str(ni->ni_nid));
+               return 0;
                
        default:
                return (-EINVAL);
@@ -119,23 +116,11 @@ kqswnal_shutdown(ptl_ni_t *ni)
                LASSERT (0);
 
        case KQN_INIT_ALL:
-                libcfs_nal_cmd_unregister(QSWNAL);
-               /* fall through */
-
        case KQN_INIT_DATA:
                break;
-
-       case KQN_INIT_NOTHING:
-               return;
        }
 
        /**********************************************************************/
-       /* Tell router we're shutting down.  Any router calls my threads
-        * make will now fail immediately and the router will stop calling
-        * into me. */
-       kpr_shutdown (&kqswnal_data.kqn_router);
-       
-       /**********************************************************************/
        /* Signal the start of shutdown... */
        spin_lock_irqsave(&kqswnal_data.kqn_idletxd_lock, flags);
        kqswnal_data.kqn_shuttingdown = 1;
@@ -224,15 +209,10 @@ kqswnal_shutdown(ptl_ni_t *ni)
                kpr_fwd_desc_t *fwd = list_entry (kqswnal_data.kqn_idletxd_fwdq.next,
                                                  kpr_fwd_desc_t, kprfd_list);
                list_del (&fwd->kprfd_list);
-               kpr_fwd_done (&kqswnal_data.kqn_router, fwd, -ESHUTDOWN);
+               kpr_fwd_done (ni, fwd, -ESHUTDOWN);
        }
 
        /**********************************************************************/
-       /* finalise router */
-
-       kpr_deregister (&kqswnal_data.kqn_router);
-
-       /**********************************************************************/
        /* Unmap message buffers and free all descriptors and buffers
         */
 
@@ -323,6 +303,7 @@ kqswnal_shutdown(ptl_ni_t *ni)
 
        printk (KERN_INFO "Lustre: Routing QSW NAL unloaded (final mem %d)\n",
                 atomic_read(&portal_kmemory));
+       PORTAL_MODULE_UNUSE;
 }
 
 ptl_err_t
@@ -347,7 +328,7 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces)
         }
 
        CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read(&portal_kmemory));
-
+       
        /* ensure all pointers NULL etc */
        memset (&kqswnal_data, 0, sizeof (kqswnal_data));
 
@@ -377,6 +358,7 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces)
 
        /* pointers/lists/locks initialised */
        kqswnal_data.kqn_init = KQN_INIT_DATA;
+       PORTAL_MODULE_USE;
        
 #if MULTIRAIL_EKC
        kqswnal_data.kqn_ep = ep_system();
@@ -404,9 +386,10 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces)
        }
 #endif
 
-       kqswnal_data.kqn_nid_offset = 0;
-       kqswnal_data.kqn_nnodes     = ep_numnodes (kqswnal_data.kqn_ep);
-       kqswnal_data.kqn_elanid     = ep_nodeid (kqswnal_data.kqn_ep);
+       kqswnal_data.kqn_nnodes = ep_numnodes (kqswnal_data.kqn_ep);
+       kqswnal_data.kqn_elanid = ep_nodeid (kqswnal_data.kqn_ep);
+
+       ni->ni_nid = PTL_MKNID(PTL_NIDNET(ni->ni_nid), kqswnal_data.kqn_elanid);
        
        /**********************************************************************/
        /* Get the transmitter */
@@ -681,25 +664,11 @@ kqswnal_startup (ptl_ni_t *ni, char **interfaces)
                }
        }
 
-       /**********************************************************************/
-       /* Connect to the router */
-       rc = kpr_register (&kqswnal_data.kqn_router, &kqswnal_router_interface);
-       CDEBUG(D_NET, "Can't initialise routing interface (rc = %d): not routing\n",rc);
-
-       rc = libcfs_nal_cmd_register (QSWNAL, &kqswnal_cmd, NULL);
-       if (rc != 0) {
-               CERROR ("Can't initialise command interface (rc = %d)\n", rc);
-               kqswnal_shutdown (ni);
-               return (PTL_FAIL);
-       }
-
        kqswnal_data.kqn_init = KQN_INIT_ALL;
 
        printk(KERN_INFO "Lustre: Routing QSW NAL loaded on node %d of %d "
-              "(Routing %s, initial mem %d)\n", 
-              kqswnal_data.kqn_elanid, kqswnal_data.kqn_nnodes,
-              kpr_routing (&kqswnal_data.kqn_router) ? "enabled" : "disabled",
-              pkmem);
+              "(initial mem %d)\n", 
+              kqswnal_data.kqn_elanid, kqswnal_data.kqn_nnodes, pkmem);
 
        return (PTL_OK);
 }
index 005407b..6caa8c3 100644 (file)
@@ -260,9 +260,7 @@ typedef struct
         EP_XMTR           *kqn_eptx;            /* elan transmitter */
         EP_RCVR           *kqn_eprx_small;      /* elan receiver (small messages) */
         EP_RCVR           *kqn_eprx_large;      /* elan receiver (large messages) */
-        kpr_router_t       kqn_router;          /* connection to Kernel Portals Router module */
 
-        ptl_nid_t          kqn_nid_offset;      /* this cluster's NID offset */
         int                kqn_nnodes;          /* this cluster's size */
         int                kqn_elanid;          /* this nodes's elan ID */
 
@@ -281,24 +279,22 @@ extern kqswnal_data_t      kqswnal_data;
 extern int kqswnal_thread_start (int (*fn)(void *arg), void *arg);
 extern void kqswnal_rxhandler(EP_RXD *rxd);
 extern int kqswnal_scheduler (void *);
-extern void kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd);
+extern void kqswnal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
 extern void kqswnal_rx_done (kqswnal_rx_t *krx);
 
 static inline ptl_nid_t
 kqswnal_elanid2nid (int elanid)
 {
-        return (kqswnal_data.kqn_nid_offset + elanid);
+        return PTL_MKNID(PTL_NIDNET(kqswnal_data.kqn_ni->ni_nid), elanid);
 }
 
 static inline int
 kqswnal_nid2elanid (ptl_nid_t nid)
 {
-        /* not in this cluster? */
-        if (nid < kqswnal_data.kqn_nid_offset ||
-            nid >= kqswnal_data.kqn_nid_offset + kqswnal_data.kqn_nnodes)
-                return (-1);
+        int elanid = PTL_NIDADDR(nid);
 
-        return (nid - kqswnal_data.kqn_nid_offset);
+        /* not in this cluster? */
+        return (elanid >= kqswnal_data.kqn_nnodes) ? -1 : elanid;
 }
 
 static inline ptl_nid_t
@@ -378,15 +374,16 @@ ep_free_rcvr(EP_RCVR *r)
 
 ptl_err_t kqswnal_startup (ptl_ni_t *ni, char **interfaces);
 void kqswnal_shutdown (ptl_ni_t *ni);
+int kqswnal_ctl (ptl_ni_t *ni, unsigned int cmd, void *arg);
 ptl_err_t kqswnal_send (ptl_ni_t *ni, void *private,
                         ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                        int type, ptl_nid_t nid, ptl_pid_t pid,
+                        int type, ptl_process_id_t tgt, int routing,
                         unsigned int payload_niov, 
                         struct iovec *payload_iov,
                         size_t payload_offset, size_t payload_nob);
 ptl_err_t kqswnal_send_pages (ptl_ni_t *ni, void *private,
                               ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                              int type, ptl_nid_t nid, ptl_pid_t pid,
+                              int type, ptl_process_id_t tgt, int routing,
                               unsigned int payload_niov, 
                               ptl_kiov_t *payload_kiov,
                               size_t payload_offset, size_t payload_nob);
index 7f2b1c9..b951939 100644 (file)
@@ -32,7 +32,7 @@ kqswnal_notify_peer_down(kqswnal_tx_t *ktx)
         do_gettimeofday (&now);
         then = now.tv_sec - (jiffies - ktx->ktx_launchtime)/HZ;
 
-        kpr_notify(&kqswnal_data.kqn_router, ktx->ktx_nid, 0, then);
+        kpr_notify(kqswnal_data.kqn_ni, ktx->ktx_nid, 0, then);
 }
 
 void
@@ -424,7 +424,7 @@ kqswnal_tx_done (kqswnal_tx_t *ktx, int error)
 {
         switch (ktx->ktx_state) {
         case KTX_FORWARDING:       /* router asked me to forward this packet */
-                kpr_fwd_done (&kqswnal_data.kqn_router,
+                kpr_fwd_done (kqswnal_data.kqn_ni,
                               (kpr_fwd_desc_t *)ktx->ktx_args[0], error);
                 break;
 
@@ -1001,22 +1001,21 @@ kqswnal_rdma (kqswnal_rx_t *krx, ptl_msg_t *ptlmsg, int type,
 }
 
 static ptl_err_t
-kqswnal_sendmsg (ptl_ni_t     *ni,
-                 void         *private,
-                 ptl_msg_t    *ptlmsg,
-                 ptl_hdr_t    *hdr,
-                 int           type,
-                 ptl_nid_t     nid,
-                 ptl_pid_t     pid,
-                 unsigned int  payload_niov,
-                 struct iovec *payload_iov,
-                 ptl_kiov_t   *payload_kiov,
-                 size_t        payload_offset,
-                 size_t        payload_nob)
+kqswnal_sendmsg (ptl_ni_t        *ni,
+                 void            *private,
+                 ptl_msg_t       *ptlmsg,
+                 ptl_hdr_t       *hdr,
+                 int              type,
+                 ptl_process_id_t target,
+                 int              routing,
+                 unsigned int     payload_niov,
+                 struct iovec    *payload_iov,
+                 ptl_kiov_t      *payload_kiov,
+                 size_t           payload_offset,
+                 size_t           payload_nob)
 {
         kqswnal_tx_t      *ktx;
         int                rc;
-        ptl_nid_t          targetnid;
 #if KQSW_CHECKSUM
         int                i;
         kqsw_csum_t        csum;
@@ -1026,8 +1025,8 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
         /* NB 1. hdr is in network byte order */
         /*    2. 'private' depends on the message type */
         
-        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid: "LPX64
-               " pid %u\n", payload_nob, payload_niov, nid, pid);
+        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n",
+               payload_nob, payload_niov, libcfs_id2str(target));
 
         LASSERT (payload_nob == 0 || payload_niov > 0);
         LASSERT (payload_niov <= PTL_MD_MAX_IOV);
@@ -1052,20 +1051,10 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
                 return ((rc == 0) ? PTL_OK : PTL_FAIL);
         }
 
-        targetnid = nid;
-        if (kqswnal_nid2elanid (nid) < 0) {     /* Can't send direct: find gateway? */
-                rc = kpr_lookup (&kqswnal_data.kqn_router, nid, 
-                                 sizeof (ptl_hdr_t) + payload_nob, &targetnid);
-                if (rc != 0) {
-                        CERROR("Can't route to "LPX64": router error %d\n",
-                               nid, rc);
-                        return (PTL_FAIL);
-                }
-                if (kqswnal_nid2elanid (targetnid) < 0) {
-                        CERROR("Bad gateway "LPX64" for "LPX64"\n",
-                               targetnid, nid);
-                        return (PTL_FAIL);
-                }
+        
+        if (kqswnal_nid2elanid (target.nid) < 0) {
+                CERROR("%s not in my cluster\n", libcfs_nid2str(target.nid));
+                return PTL_FAIL;
         }
 
         /* I may not block for a transmit descriptor if I might block the
@@ -1074,13 +1063,13 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
                                           type == PTL_MSG_REPLY ||
                                           in_interrupt()));
         if (ktx == NULL) {
-                CERROR ("Can't get txd for msg type %d for "LPX64"\n",
-                        type, ptlmsg->msg_ev.initiator.nid);
+                CERROR ("Can't get txd for msg type %d for %s\n",
+                        type, libcfs_nid2str(target.nid));
                 return (PTL_NO_SPACE);
         }
 
         ktx->ktx_state   = KTX_SENDING;
-        ktx->ktx_nid     = targetnid;
+        ktx->ktx_nid     = target.nid;
         ktx->ktx_args[0] = private;
         ktx->ktx_args[1] = ptlmsg;
         ktx->ktx_args[2] = NULL;    /* set when a GET commits to REPLY */
@@ -1129,7 +1118,7 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
          * portals header. */
         ktx->ktx_nfrag = ktx->ktx_firsttmpfrag = 1;
 
-        if (nid == targetnid &&                 /* not forwarding */
+        if (!routing &&                         /* target.nid is final dest */
             ((type == PTL_MSG_GET &&            /* optimize GET? */
               kqswnal_tunables.kqn_optimized_gets != 0 &&
               le32_to_cpu(hdr->msg.get.sink_length) >= 
@@ -1183,7 +1172,7 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
                 if (type == PTL_MSG_GET) {
                         /* Allocate reply message now while I'm in thread context */
                         ktx->ktx_args[2] = ptl_create_reply_msg (
-                                kqswnal_data.kqn_ni, nid, ptlmsg);
+                                kqswnal_data.kqn_ni, target.nid, ptlmsg);
                         if (ktx->ktx_args[2] == NULL)
                                 goto out;
 
@@ -1239,10 +1228,10 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
         rc = kqswnal_launch (ktx);
 
  out:
-        CDEBUG(rc == 0 ? D_NET : D_ERROR, 
-               "%s "LPSZ" bytes to "LPX64" via "LPX64": rc %d\n", 
+        CDEBUG(rc == 0 ? D_NET : D_ERROR, "%s "LPSZ" bytes to %s%s: rc %d\n", 
                rc == 0 ? "Sent" : "Failed to send",
-               payload_nob, nid, targetnid, rc);
+               payload_nob, libcfs_nid2str(target.nid), 
+               routing ? "(routing)" : "", rc);
 
         if (rc != 0) {
                 if (ktx->ktx_state == KTX_GETTING &&
@@ -1266,43 +1255,43 @@ kqswnal_sendmsg (ptl_ni_t     *ni,
 }
 
 ptl_err_t
-kqswnal_send (ptl_ni_t     *ni,
-              void         *private,
-              ptl_msg_t    *ptlmsg,
-              ptl_hdr_t    *hdr,
-              int           type,
-              ptl_nid_t     nid,
-              ptl_pid_t     pid,
-              unsigned int  payload_niov,
-              struct iovec *payload_iov,
-              size_t        payload_offset,
-              size_t        payload_nob)
+kqswnal_send (ptl_ni_t        *ni,
+              void            *private,
+              ptl_msg_t       *ptlmsg,
+              ptl_hdr_t       *hdr,
+              int              type,
+              ptl_process_id_t tgt,
+              int              routing,
+              unsigned int     payload_niov,
+              struct iovec    *payload_iov,
+              size_t           payload_offset,
+              size_t           payload_nob)
 {
-        return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, nid, pid,
+        return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, tgt, routing,
                                  payload_niov, payload_iov, NULL, 
                                  payload_offset, payload_nob));
 }
 
 ptl_err_t
-kqswnal_send_pages (ptl_ni_t     *ni,
-                    void         *private,
-                    ptl_msg_t    *ptlmsg,
-                    ptl_hdr_t    *hdr,
-                    int           type,
-                    ptl_nid_t     nid,
-                    ptl_pid_t     pid,
-                    unsigned int  payload_niov,
-                    ptl_kiov_t   *payload_kiov,
-                    size_t        payload_offset,
-                    size_t        payload_nob)
+kqswnal_send_pages (ptl_ni_t        *ni,
+                    void            *private,
+                    ptl_msg_t       *ptlmsg,
+                    ptl_hdr_t       *hdr,
+                    int              type,
+                    ptl_process_id_t tgt,
+                    int              routing,
+                    unsigned int     payload_niov,
+                    ptl_kiov_t      *payload_kiov,
+                    size_t           payload_offset,
+                    size_t           payload_nob)
 {
-        return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, nid, pid,
+        return (kqswnal_sendmsg (ni, private, ptlmsg, hdr, type, tgt, routing,
                                  payload_niov, NULL, payload_kiov, 
                                  payload_offset, payload_nob));
 }
 
 void
-kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
+kqswnal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
 {
         int             rc;
         kqswnal_tx_t   *ktx;
@@ -1323,15 +1312,9 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
         if (ktx == NULL)        /* can't get txd right now */
                 return;         /* fwd will be scheduled when tx desc freed */
 
-        if (nid == kqswnal_data.kqn_ni->ni_nid) /* gateway is me */
+        if (nid == ni->ni_nid)                  /* gateway is me */
                 nid = fwd->kprfd_target_nid;    /* target is final dest */
 
-        if (kqswnal_nid2elanid (nid) < 0) {
-                CERROR("Can't forward [%p] to "LPX64": not a peer\n", fwd, nid);
-                rc = -EHOSTUNREACH;
-                goto out;
-        }
-
         /* copy hdr into pre-mapped buffer */
         memcpy(ktx->ktx_buffer, fwd->kprfd_hdr, sizeof(ptl_hdr_t));
 
@@ -1342,6 +1325,12 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
         ktx->ktx_args[0] = fwd;
         ktx->ktx_nfrag   = ktx->ktx_firsttmpfrag = 1;
 
+        if (kqswnal_nid2elanid (nid) < 0) {
+                CERROR("Can't forward [%p] to "LPX64": not a peer\n", fwd, nid);
+                rc = -EHOSTUNREACH;
+                goto out;
+        }
+
         if (nob <= *kqswnal_tunables.kqn_tx_maxcontig) 
         {
                 /* send payload from ktx's pre-mapped contiguous buffer */
@@ -1384,7 +1373,7 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
 }
 
 void
-kqswnal_fwd_callback (void *arg, int error)
+kqswnal_fwd_callback (ptl_ni_t *ni, void *arg, int error)
 {
         kqswnal_rx_t *krx = (kqswnal_rx_t *)arg;
 
@@ -1552,7 +1541,7 @@ kqswnal_parse (kqswnal_rx_t *krx)
                       hdr, payload_nob, niov, krx->krx_kiov,
                       kqswnal_fwd_callback, krx);
 
-        kpr_fwd_start (&kqswnal_data.kqn_router, &krx->krx_fwd);
+        kpr_fwd_start (kqswnal_data.kqn_ni, &krx->krx_fwd);
 }
 
 /* Receive Interrupt Handler: posts to schedulers */
index 6caaca9..5cab1d0 100644 (file)
@@ -29,6 +29,7 @@ ptl_nal_t kranal_nal = {
         .nal_type       = RANAL,
         .nal_startup    = kranal_startup,
         .nal_shutdown   = kranal_shutdown,
+        .nal_ctl        = kranal_ctl,
         .nal_send       = kranal_send,
         .nal_send_pages = kranal_send_pages,
         .nal_recv       = kranal_recv,
@@ -1280,7 +1281,7 @@ kranal_set_mynid(ptl_nid_t nid)
         /* Delete all existing peers and their connections after new
          * NID/connstamp set to ensure no old connections in our brave
          * new world. */
-        kranal_del_peer(PTL_NID_ANY, 0);
+        kranal_del_peer(PTL_NID_ANY);
 
         if (nid != PTL_NID_ANY)
                 rc = kranal_start_listener();
@@ -1460,19 +1461,13 @@ kranal_add_persistent_peer (ptl_nid_t nid, __u32 ip, int port)
 }
 
 void
-kranal_del_peer_locked (kra_peer_t *peer, int single_share)
+kranal_del_peer_locked (kra_peer_t *peer)
 {
         struct list_head *ctmp;
         struct list_head *cnxt;
         kra_conn_t       *conn;
 
-        if (!single_share)
-                peer->rap_persistence = 0;
-        else if (peer->rap_persistence > 0)
-                peer->rap_persistence--;
-
-        if (peer->rap_persistence != 0)
-                return;
+        peer->rap_persistence = 0;
 
         if (list_empty(&peer->rap_conns)) {
                 kranal_unlink_peer_locked(peer);
@@ -1487,7 +1482,7 @@ kranal_del_peer_locked (kra_peer_t *peer, int single_share)
 }
 
 int
-kranal_del_peer (ptl_nid_t nid, int single_share)
+kranal_del_peer (ptl_nid_t nid)
 {
         unsigned long      flags;
         struct list_head  *ptmp;
@@ -1516,11 +1511,8 @@ kranal_del_peer (ptl_nid_t nid, int single_share)
                         if (!(nid == PTL_NID_ANY || peer->rap_nid == nid))
                                 continue;
 
-                        kranal_del_peer_locked(peer, single_share);
+                        kranal_del_peer_locked(peer);
                         rc = 0;         /* matched something */
-
-                        if (single_share)
-                                goto out;
                 }
         }
  out:
@@ -1629,65 +1621,60 @@ kranal_close_matching_conns (ptl_nid_t nid)
 }
 
 int
-kranal_cmd(struct portals_cfg *pcfg, void * private)
+kranal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
-        int rc = -EINVAL;
+        struct portal_ioctl_data *data = arg;
+        int                       rc = -EINVAL;
 
-        LASSERT (pcfg != NULL);
+        LASSERT (ni == kranal_data.kra_ni);
 
-        switch(pcfg->pcfg_command) {
-        case NAL_CMD_GET_PEER: {
+        switch(cmd) {
+        case IOC_PORTAL_GET_PEER: {
                 ptl_nid_t   nid = 0;
                 __u32       ip = 0;
                 int         port = 0;
                 int         share_count = 0;
 
-                rc = kranal_get_peer_info(pcfg->pcfg_count,
+                rc = kranal_get_peer_info(data->ioc_count,
                                           &nid, &ip, &port, &share_count);
-                pcfg->pcfg_nid   = nid;
-                pcfg->pcfg_size  = 0;
-                pcfg->pcfg_id    = ip;
-                pcfg->pcfg_misc  = port;
-                pcfg->pcfg_count = 0;
-                pcfg->pcfg_wait  = share_count;
+                data->ioc_nid    = nid;
+                data->ioc_count  = share_count;
+                data->ioc_u32[0] = ip;
+                data->ioc_u32[1] = port;
                 break;
         }
-        case NAL_CMD_ADD_PEER: {
-                rc = kranal_add_persistent_peer(pcfg->pcfg_nid,
-                                                pcfg->pcfg_id, /* IP */
-                                                pcfg->pcfg_misc); /* port */
+        case IOC_PORTAL_ADD_PEER: {
+                rc = kranal_add_persistent_peer(data->ioc_nid,
+                                                data->ioc_u32[0], /* IP */
+                                                data->ioc_u32[1]); /* port */
                 break;
         }
-        case NAL_CMD_DEL_PEER: {
-                rc = kranal_del_peer(pcfg->pcfg_nid,
-                                     /* flags == single_share */
-                                     pcfg->pcfg_flags != 0);
+        case IOC_PORTAL_DEL_PEER: {
+                rc = kranal_del_peer(data->ioc_nid);
                 break;
         }
-        case NAL_CMD_GET_CONN: {
-                kra_conn_t *conn = kranal_get_conn_by_idx(pcfg->pcfg_count);
+        case IOC_PORTAL_GET_CONN: {
+                kra_conn_t *conn = kranal_get_conn_by_idx(data->ioc_count);
 
                 if (conn == NULL)
                         rc = -ENOENT;
                 else {
                         rc = 0;
-                        pcfg->pcfg_nid   = conn->rac_peer->rap_nid;
-                        pcfg->pcfg_id    = conn->rac_device->rad_id;
-                        pcfg->pcfg_misc  = 0;
-                        pcfg->pcfg_flags = 0;
+                        data->ioc_nid    = conn->rac_peer->rap_nid;
+                        data->ioc_u32[0] = conn->rac_device->rad_id;
                         kranal_conn_decref(conn);
                 }
                 break;
         }
-        case NAL_CMD_CLOSE_CONNECTION: {
-                rc = kranal_close_matching_conns(pcfg->pcfg_nid);
+        case IOC_PORTAL_CLOSE_CONNECTION: {
+                rc = kranal_close_matching_conns(data->ioc_nid);
                 break;
         }
-        case NAL_CMD_REGISTER_MYNID: {
-                if (pcfg->pcfg_nid == PTL_NID_ANY)
+        case IOC_PORTAL_REGISTER_MYNID: {
+                if (data->ioc_nid == PTL_NID_ANY)
                         rc = -EINVAL;
                 else
-                        rc = kranal_set_mynid(pcfg->pcfg_nid);
+                        rc = kranal_set_mynid(data->ioc_nid);
                 break;
         }
         }
@@ -1825,10 +1812,6 @@ kranal_shutdown (ptl_ni_t *ni)
                 LBUG();
 
         case RANAL_INIT_ALL:
-                /* stop calls to nal_cmd */
-                libcfs_nal_cmd_unregister(RANAL);
-                /* No new persistent peers */
-
                 /* resetting my NID to unadvertises me, removes my
                  * listener and nukes all current peers */
                 kranal_set_mynid(PTL_NID_ANY);
@@ -1920,6 +1903,7 @@ kranal_shutdown (ptl_ni_t *ni)
                atomic_read(&portal_kmemory));
 
         kranal_data.kra_init = RANAL_INIT_NOTHING;
+        PORTAL_MODULE_UNUSE;
 }
 
 ptl_err_t
@@ -1985,6 +1969,7 @@ kranal_startup (ptl_ni_t *ni, char **interfaces)
 
         /* OK to call kranal_api_shutdown() to cleanup now */
         kranal_data.kra_init = RANAL_INIT_DATA;
+        PORTAL_MODULE_USE;
 
         kranal_data.kra_peer_hash_size = RANAL_PEER_HASH_SIZE;
         PORTAL_ALLOC(kranal_data.kra_peers,
@@ -2054,16 +2039,10 @@ kranal_startup (ptl_ni_t *ni, char **interfaces)
                 }
         }
 
-        rc = libcfs_nal_cmd_register(RANAL, &kranal_cmd, NULL);
-        if (rc != 0) {
-                CERROR("Can't initialise command interface (rc = %d)\n", rc);
-                goto failed;
-        }
-
         /* flag everything initialised */
         kranal_data.kra_init = RANAL_INIT_ALL;
         /*****************************************************/
-
+        
         CDEBUG(D_MALLOC, "initial kmem %d\n", atomic_read(&portal_kmemory));
         printk(KERN_INFO "Lustre: RapidArray NAL loaded "
                "(initial mem %d)\n", pkmem);
index 532daec..942e5bb 100644 (file)
@@ -447,17 +447,16 @@ kranal_page2phys (struct page *p)
 
 ptl_err_t kranal_startup (ptl_ni_t *ni, char **interfaces);
 void kranal_shutdown (ptl_ni_t *ni);
+int kranal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
 ptl_err_t kranal_send (ptl_ni_t *ni, void *private,
                        ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                       int type, ptl_nid_t nid, ptl_pid_t pid,
-                       unsigned int payload_niov, 
-                       struct iovec *payload_iov,
+                       int type, ptl_process_id_t tgt, int routing,
+                       unsigned int payload_niov, struct iovec *payload_iov,
                        size_t payload_offset, size_t payload_nob);
 ptl_err_t kranal_send_pages (ptl_ni_t *ni, void *private,
                              ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                             int type, ptl_nid_t nid, ptl_pid_t pid,
-                             unsigned int payload_niov, 
-                             ptl_kiov_t *payload_kiov,
+                             int type, ptl_process_id_t tgt, int routing,
+                             unsigned int payload_niov, ptl_kiov_t *payload_kiov,
                              size_t payload_offset, size_t payload_nob);
 ptl_err_t kranal_recv(ptl_ni_t *ni, void *private,
                       ptl_msg_t *ptlmsg, unsigned int niov,
@@ -479,7 +478,7 @@ extern void kranal_schedule_conn (kra_conn_t *conn);
 extern kra_peer_t *kranal_create_peer (ptl_nid_t nid);
 extern kra_peer_t *kranal_find_peer_locked (ptl_nid_t nid);
 extern void kranal_post_fma (kra_conn_t *conn, kra_tx_t *tx);
-extern int kranal_del_peer (ptl_nid_t nid, int single_share);
+extern int kranal_del_peer (ptl_nid_t nid);
 extern void kranal_device_callback (RAP_INT32 devid, RAP_PVOID arg);
 extern int kranal_thread_start (int(*fn)(void *arg), void *arg);
 extern int kranal_connd (void *arg);
index 67ccbbe..53dabb8 100644 (file)
@@ -569,18 +569,18 @@ kranal_consume_rxmsg (kra_conn_t *conn, void *buffer, int nob)
 }
 
 ptl_err_t
-kranal_do_send (ptl_ni_t     *ni,
-                void         *private,
-                ptl_msg_t    *ptlmsg,
-                ptl_hdr_t    *hdr,
-                int           type,
-                ptl_nid_t     nid,
-                ptl_pid_t     pid,
-                unsigned int  niov,
-                struct iovec *iov,
-                ptl_kiov_t   *kiov,
-                int           offset,
-                int           nob)
+kranal_do_send (ptl_ni_t        *ni,
+                void            *private,
+                ptl_msg_t       *ptlmsg,
+                ptl_hdr_t       *hdr,
+                int              type,
+                ptl_process_id_t target,
+                int              routing,
+                unsigned int     niov,
+                struct iovec    *iov,
+                ptl_kiov_t      *kiov,
+                int              offset,
+                int              nob)
 {
         kra_conn_t *conn;
         kra_tx_t   *tx;
@@ -588,8 +588,8 @@ kranal_do_send (ptl_ni_t     *ni,
 
         /* NB 'private' is different depending on what we're sending.... */
 
-        CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64" pid %d\n",
-               nob, niov, nid, pid);
+        CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n",
+               nob, niov, libcfs_id2str(target));
 
         LASSERT (nob == 0 || niov > 0);
         LASSERT (niov <= PTL_MD_MAX_IOV);
@@ -598,6 +598,11 @@ kranal_do_send (ptl_ni_t     *ni,
         /* payload is either all vaddrs or all pages */
         LASSERT (!(kiov != NULL && iov != NULL));
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+
         switch(type) {
         default:
                 LBUG();
@@ -610,7 +615,7 @@ kranal_do_send (ptl_ni_t     *ni,
                 if (conn->rac_rxmsg->ram_type == RANAL_MSG_IMMEDIATE) {
                         if (nob > RANAL_FMA_MAX_DATA) {
                                 CERROR("Can't REPLY IMMEDIATE %d to "LPX64"\n",
-                                       nob, nid);
+                                       nob, target.nid);
                                 return PTL_FAIL;
                         }
                         break;                  /* RDMA not expected */
@@ -619,7 +624,7 @@ kranal_do_send (ptl_ni_t     *ni,
                 /* Incoming message consistent with RDMA? */
                 if (conn->rac_rxmsg->ram_type != RANAL_MSG_GET_REQ) {
                         CERROR("REPLY to "LPX64" bad msg type %x!!!\n",
-                               nid, conn->rac_rxmsg->ram_type);
+                               target.nid, conn->rac_rxmsg->ram_type);
                         return PTL_FAIL;
                 }
 
@@ -677,10 +682,9 @@ kranal_do_send (ptl_ni_t     *ni,
                         return PTL_FAIL;
                 }
 
-                tx->tx_ptlmsg[1] = ptl_create_reply_msg(kranal_data.kra_ni, 
-                                                        nid, ptlmsg);
+                tx->tx_ptlmsg[1] = ptl_create_reply_msg(ni, target.nid, ptlmsg);
                 if (tx->tx_ptlmsg[1] == NULL) {
-                        CERROR("Can't create reply for GET to "LPX64"\n", nid);
+                        CERROR("Can't create reply for GET to "LPX64"\n", target.nid);
                         kranal_tx_done(tx, rc);
                         return PTL_FAIL;
                 }
@@ -688,7 +692,7 @@ kranal_do_send (ptl_ni_t     *ni,
                 tx->tx_ptlmsg[0] = ptlmsg;
                 tx->tx_msg.ram_u.get.ragm_hdr = *hdr;
                 /* rest of tx_msg is setup just before it is sent */
-                kranal_launch_tx(tx, nid);
+                kranal_launch_tx(tx, target.nid);
                 return PTL_OK;
 
         case PTL_MSG_ACK:
@@ -714,7 +718,7 @@ kranal_do_send (ptl_ni_t     *ni,
                 tx->tx_ptlmsg[0] = ptlmsg;
                 tx->tx_msg.ram_u.putreq.raprm_hdr = *hdr;
                 /* rest of tx_msg is setup just before it is sent */
-                kranal_launch_tx(tx, nid);
+                kranal_launch_tx(tx, target.nid);
                 return PTL_OK;
         }
 
@@ -736,32 +740,30 @@ kranal_do_send (ptl_ni_t     *ni,
 
         tx->tx_msg.ram_u.immediate.raim_hdr = *hdr;
         tx->tx_ptlmsg[0] = ptlmsg;
-        kranal_launch_tx(tx, nid);
+        kranal_launch_tx(tx, target.nid);
         return PTL_OK;
 }
 
 ptl_err_t
 kranal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-             ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+             ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
              unsigned int niov, struct iovec *iov,
              size_t offset, size_t len)
 {
         return kranal_do_send(ni, private, cookie,
-                              hdr, type, nid, pid,
-                              niov, iov, NULL,
-                              offset, len);
+                              hdr, type, tgt, routing,
+                              niov, iov, NULL, offset, len);
 }
 
 ptl_err_t
 kranal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-                   ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                   ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                    unsigned int niov, ptl_kiov_t *kiov,
                    size_t offset, size_t len)
 {
         return kranal_do_send(ni, private, cookie,
-                              hdr, type, nid, pid,
-                              niov, NULL, kiov,
-                              offset, len);
+                              hdr, type, tgt, routing,
+                              niov, NULL, kiov, offset, len);
 }
 
 ptl_err_t
index 5d42135..af36f04 100644 (file)
@@ -29,19 +29,16 @@ ptl_nal_t ksocknal_nal = {
         .nal_type       = SOCKNAL,
         .nal_startup    = ksocknal_startup,
         .nal_shutdown   = ksocknal_shutdown,
+        .nal_ctl        = ksocknal_ctl,
         .nal_send       = ksocknal_send,
         .nal_send_pages = ksocknal_send_pages,
         .nal_recv       = ksocknal_recv,
         .nal_recv_pages = ksocknal_recv_pages,
+        .nal_fwd        = ksocknal_fwd_packet,
+        .nal_notify     = ksocknal_notify,
 };
-ksock_nal_data_t        ksocknal_data;
 
-kpr_nal_interface_t ksocknal_router_interface = {
-        kprni_nalid:      SOCKNAL,
-        kprni_arg:        &ksocknal_data,
-        kprni_fwd:        ksocknal_fwd_packet,
-        kprni_notify:     ksocknal_notify,
-};
+ksock_nal_data_t        ksocknal_data;
 
 int
 ksocknal_set_mynid(ptl_nid_t nid)
@@ -57,6 +54,7 @@ ksocknal_set_mynid(ptl_nid_t nid)
         CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n",
                nid, ni->ni_nid);
 
+        LASSERT (PTL_NIDNET(nid) == PTL_NIDNET(ni->ni_nid));
         ni->ni_nid = nid;
         return (0);
 }
@@ -181,7 +179,7 @@ ksocknal_find_peer_locked (ptl_nid_t nid)
 }
 
 ksock_peer_t *
-ksocknal_get_peer (ptl_nid_t nid)
+ksocknal_find_peer (ptl_nid_t nid)
 {
         ksock_peer_t     *peer;
 
@@ -471,7 +469,7 @@ ksocknal_add_peer (ptl_nid_t nid, __u32 ipaddr, int port)
 }
 
 void
-ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share)
+ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip)
 {
         ksock_conn_t     *conn;
         ksock_route_t    *route;
@@ -487,25 +485,13 @@ ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share)
         list_for_each_safe (tmp, nxt, &peer->ksnp_routes) {
                 route = list_entry(tmp, ksock_route_t, ksnr_list);
 
-                if (single_share && route->ksnr_share_count == 0)
-                        continue;
-
                 /* no match */
                 if (!(ip == 0 || route->ksnr_ipaddr == ip))
                         continue;
 
-                if (!single_share)
-                        route->ksnr_share_count = 0;
-                else if (route->ksnr_share_count > 0)
-                        route->ksnr_share_count--;
-
-                if (route->ksnr_share_count == 0) {
-                        /* This deletes associated conns too */
-                        ksocknal_del_route_locked (route);
-                }
-
-                if (single_share)
-                        break;
+                route->ksnr_share_count = 0;
+                /* This deletes associated conns too */
+                ksocknal_del_route_locked (route);
         }
 
         nshared = 0;
@@ -538,7 +524,7 @@ ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share)
 }
 
 int
-ksocknal_del_peer (ptl_nid_t nid, __u32 ip, int single_share)
+ksocknal_del_peer (ptl_nid_t nid, __u32 ip)
 {
         unsigned long      flags;
         struct list_head  *ptmp;
@@ -565,11 +551,8 @@ ksocknal_del_peer (ptl_nid_t nid, __u32 ip, int single_share)
                         if (!(nid == PTL_NID_ANY || peer->ksnp_nid == nid))
                                 continue;
 
-                        ksocknal_del_peer_locked (peer, ip, single_share);
+                        ksocknal_del_peer_locked (peer, ip);
                         rc = 0;                 /* matched! */
-
-                        if (single_share)
-                                break;
                 }
         }
 
@@ -1380,7 +1363,7 @@ ksocknal_terminate_conn (ksock_conn_t *conn)
         ksocknal_connsock_decref(conn);
 
         if (notify)
-                kpr_notify (&ksocknal_data.ksnd_router, peer->ksnp_nid,
+                kpr_notify (ksocknal_data.ksnd_ni, peer->ksnp_nid,
                             0, then);
 }
 
@@ -1424,7 +1407,8 @@ ksocknal_destroy_conn (ksock_conn_t *conn)
                               conn->ksnc_cookie, PTL_FAIL);
                 break;
         case SOCKNAL_RX_BODY_FWD:
-                ksocknal_fmb_callback (conn->ksnc_cookie, -ECONNABORTED);
+                ksocknal_fmb_callback (ksocknal_data.ksnd_ni,
+                                       conn->ksnc_cookie, -ECONNABORTED);
                 break;
         case SOCKNAL_RX_HEADER:
         case SOCKNAL_RX_SLOP:
@@ -1547,7 +1531,7 @@ ksocknal_close_matching_conns (ptl_nid_t nid, __u32 ipaddr)
 }
 
 void
-ksocknal_notify (void *arg, ptl_nid_t gw_nid, int alive)
+ksocknal_notify (ptl_ni_t *ni, ptl_nid_t gw_nid, int alive)
 {
         /* The router is telling me she's been notified of a change in
          * gateway state.... */
@@ -1607,7 +1591,7 @@ ksocknal_push (ptl_nid_t nid)
         int                rc = -ENOENT;
 
         if (nid != PTL_NID_ANY) {
-                peer = ksocknal_get_peer (nid);
+                peer = ksocknal_find_peer (nid);
 
                 if (peer != NULL) {
                         rc = 0;
@@ -1791,42 +1775,45 @@ ksocknal_del_interface(__u32 ipaddress)
 }
 
 int
-ksocknal_cmd(struct portals_cfg *pcfg, void * private)
+ksocknal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
+        struct portal_ioctl_data *data = arg;
         int rc;
 
-        switch(pcfg->pcfg_command) {
-        case NAL_CMD_GET_INTERFACE: {
+        LASSERT(ni == ksocknal_data.ksnd_ni);
+
+        switch(cmd) {
+        case IOC_PORTAL_GET_INTERFACE: {
                 ksock_interface_t *iface;
 
                 read_lock (&ksocknal_data.ksnd_global_lock);
 
-                if (pcfg->pcfg_count < 0 ||
-                    pcfg->pcfg_count >= ksocknal_data.ksnd_ninterfaces) {
+                if (data->ioc_count < 0 ||
+                    data->ioc_count >= ksocknal_data.ksnd_ninterfaces) {
                         rc = -ENOENT;
                 } else {
                         rc = 0;
-                        iface = &ksocknal_data.ksnd_interfaces[pcfg->pcfg_count];
+                        iface = &ksocknal_data.ksnd_interfaces[data->ioc_count];
 
-                        pcfg->pcfg_id    = iface->ksni_ipaddr;
-                        pcfg->pcfg_misc  = iface->ksni_netmask;
-                        pcfg->pcfg_fd    = iface->ksni_npeers;
-                        pcfg->pcfg_count = iface->ksni_nroutes;
+                        data->ioc_u32[0] = iface->ksni_ipaddr;
+                        data->ioc_u32[1] = iface->ksni_netmask;
+                        data->ioc_u32[2] = iface->ksni_npeers;
+                        data->ioc_u32[3] = iface->ksni_nroutes;
                 }
 
                 read_unlock (&ksocknal_data.ksnd_global_lock);
                 break;
         }
-        case NAL_CMD_ADD_INTERFACE: {
-                rc = ksocknal_add_interface(pcfg->pcfg_id, /* IP address */
-                                            pcfg->pcfg_misc); /* net mask */
+        case IOC_PORTAL_ADD_INTERFACE: {
+                rc = ksocknal_add_interface(data->ioc_u32[0], /* IP address */
+                                            data->ioc_u32[1]); /* net mask */
                 break;
         }
-        case NAL_CMD_DEL_INTERFACE: {
-                rc = ksocknal_del_interface(pcfg->pcfg_id); /* IP address */
+        case IOC_PORTAL_DEL_INTERFACE: {
+                rc = ksocknal_del_interface(data->ioc_u32[0]); /* IP address */
                 break;
         }
-        case NAL_CMD_GET_PEER: {
+        case IOC_PORTAL_GET_PEER: {
                 ptl_nid_t    nid = 0;
                 __u32        myip = 0;
                 __u32        ip = 0;
@@ -1834,48 +1821,30 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private)
                 int          conn_count = 0;
                 int          share_count = 0;
 
-                rc = ksocknal_get_peer_info(pcfg->pcfg_count, &nid,
+                rc = ksocknal_get_peer_info(data->ioc_count, &nid,
                                             &myip, &ip, &port,
                                             &conn_count,  &share_count);
-                pcfg->pcfg_nid   = nid;
-                pcfg->pcfg_size  = myip;
-                pcfg->pcfg_id    = ip;
-                pcfg->pcfg_misc  = port;
-                pcfg->pcfg_count = conn_count;
-                pcfg->pcfg_wait  = share_count;
+                data->ioc_nid    = nid;
+                data->ioc_count  = share_count;
+                data->ioc_u32[0] = ip;
+                data->ioc_u32[1] = port;
+                data->ioc_u32[2] = myip;
+                data->ioc_u32[3] = conn_count;
                 break;
         }
-        case NAL_CMD_ADD_PEER: {
-#if 1
-                CDEBUG(D_WARNING, "ADD_PEER: ignoring "
-                       LPX64"@%u.%u.%u.%u:%d\n",
-                       pcfg->pcfg_nid, 
-                       HIPQUAD(pcfg->pcfg_id),  /* IP */
-                       pcfg->pcfg_misc);        /* port */
-                rc = 0;
-#else
-                rc = ksocknal_add_peer (pcfg->pcfg_nid,
-                                        pcfg->pcfg_id, /* IP */
-                                        pcfg->pcfg_misc); /* port */
-#endif
+        case IOC_PORTAL_ADD_PEER: {
+                rc = ksocknal_add_peer (data->ioc_nid,
+                                        data->ioc_u32[0], /* IP */
+                                        data->ioc_u32[1]); /* port */
                 break;
         }
-        case NAL_CMD_DEL_PEER: {
-                if (pcfg->pcfg_flags) {         /* single_share */
-                        CDEBUG(D_WARNING, "DEL_PEER: ignoring "
-                               LPX64"@%u.%u.%u.%u\n",
-                               pcfg->pcfg_nid, 
-                               HIPQUAD(pcfg->pcfg_id)); /* IP */
-                        rc = 0;
-                        break;
-                }
-                rc = ksocknal_del_peer (pcfg->pcfg_nid,
-                                        pcfg->pcfg_id, /* IP */
-                                        pcfg->pcfg_flags); /* single_share? */
+        case IOC_PORTAL_DEL_PEER: {
+                rc = ksocknal_del_peer (data->ioc_nid,
+                                        data->ioc_u32[0]); /* IP */
                 break;
         }
-        case NAL_CMD_GET_CONN: {
-                ksock_conn_t *conn = ksocknal_get_conn_by_idx (pcfg->pcfg_count);
+        case IOC_PORTAL_GET_CONN: {
+                ksock_conn_t *conn = ksocknal_get_conn_by_idx (data->ioc_count);
 
                 if (conn == NULL)
                         rc = -ENOENT;
@@ -1887,31 +1856,31 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private)
                         ksocknal_lib_get_conn_tunables(conn, &txmem, &rxmem, &nagle);
 
                         rc = 0;
-                        pcfg->pcfg_nid    = conn->ksnc_peer->ksnp_nid;
-                        pcfg->pcfg_id     = conn->ksnc_ipaddr;
-                        pcfg->pcfg_misc   = conn->ksnc_port;
-                        pcfg->pcfg_fd     = conn->ksnc_myipaddr;
-                        pcfg->pcfg_flags  = conn->ksnc_type;
-                        pcfg->pcfg_gw_nal = conn->ksnc_scheduler -
+                        data->ioc_count  = txmem;
+                        data->ioc_nid    = conn->ksnc_peer->ksnp_nid;
+                        data->ioc_flags  = nagle;
+                        data->ioc_u32[0] = conn->ksnc_ipaddr;
+                        data->ioc_u32[1] = conn->ksnc_port;
+                        data->ioc_u32[2] = conn->ksnc_myipaddr;
+                        data->ioc_u32[3] = conn->ksnc_type;
+                        data->ioc_u32[4] = conn->ksnc_scheduler -
                                             ksocknal_data.ksnd_schedulers;
-                        pcfg->pcfg_count  = txmem;
-                        pcfg->pcfg_size   = rxmem;
-                        pcfg->pcfg_wait   = nagle;
+                        data->ioc_u32[5] = rxmem;
                         ksocknal_conn_decref(conn);
                 }
                 break;
         }
-        case NAL_CMD_CLOSE_CONNECTION: {
-                rc = ksocknal_close_matching_conns (pcfg->pcfg_nid,
-                                                    pcfg->pcfg_id);
+        case IOC_PORTAL_CLOSE_CONNECTION: {
+                rc = ksocknal_close_matching_conns (data->ioc_nid,
+                                                    data->ioc_u32[0]);
                 break;
         }
-        case NAL_CMD_REGISTER_MYNID: {
-                rc = ksocknal_set_mynid (pcfg->pcfg_nid);
+        case IOC_PORTAL_REGISTER_MYNID: {
+                rc = ksocknal_set_mynid (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_PUSH_CONNECTION: {
-                rc = ksocknal_push (pcfg->pcfg_nid);
+        case IOC_PORTAL_PUSH_CONNECTION: {
+                rc = ksocknal_push (data->ioc_nid);
                 break;
         }
         default:
@@ -1972,17 +1941,13 @@ ksocknal_shutdown (ptl_ni_t *ni)
         CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n",
                atomic_read (&portal_kmemory));
 
-        LASSERT(ni->ni_nal == &ksocknal_nal);
+        LASSERT(ni == ksocknal_data.ksnd_ni);
 
         switch (ksocknal_data.ksnd_init) {
         default:
                 LASSERT (0);
 
         case SOCKNAL_INIT_ALL:
-                libcfs_nal_cmd_unregister(SOCKNAL);
-                /* fall through */
-
-        case SOCKNAL_INIT_LISTENER:
                 ksocknal_stop_listener();
                 /* Wait for queued connreqs to clean up */
                 i = 2;
@@ -1996,11 +1961,8 @@ ksocknal_shutdown (ptl_ni_t *ni)
                 /* fall through */
 
         case SOCKNAL_INIT_DATA:
-                /* No more calls to ksocknal_cmd() to create new
-                 * peers/connections since we're being unloaded. */
-
                 /* Delete all peers */
-                ksocknal_del_peer(PTL_NID_ANY, 0, 0);
+                ksocknal_del_peer(PTL_NID_ANY, 0);
 
                 /* Wait for all peer state to clean up */
                 i = 2;
@@ -2034,9 +1996,6 @@ ksocknal_shutdown (ptl_ni_t *ni)
                                 LASSERT (kss->kss_nconns == 0);
                         }
 
-                /* stop router calling me */
-                kpr_shutdown (&ksocknal_data.ksnd_router);
-
                 /* flag threads to terminate; wake and wait for them to die */
                 ksocknal_data.ksnd_shuttingdown = 1;
                 cfs_waitq_broadcast (&ksocknal_data.ksnd_connd_waitq);
@@ -2061,14 +2020,9 @@ ksocknal_shutdown (ptl_ni_t *ni)
                 }
                 read_unlock(&ksocknal_data.ksnd_global_lock);
 
-                kpr_deregister (&ksocknal_data.ksnd_router);
-
                 ksocknal_free_buffers();
 
                 ksocknal_data.ksnd_init = SOCKNAL_INIT_NOTHING;
-                /* fall through */
-
-        case SOCKNAL_INIT_NOTHING:
                 break;
         }
 
@@ -2077,7 +2031,6 @@ ksocknal_shutdown (ptl_ni_t *ni)
 
         printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n",
                atomic_read(&portal_kmemory));
-
         PORTAL_MODULE_UNUSE;
 }
 
@@ -2208,12 +2161,7 @@ ksocknal_startup (ptl_ni_t *ni, char **interfaces)
                 return (rc);
         }
 
-        rc = kpr_register(&ksocknal_data.ksnd_router,
-                          &ksocknal_router_interface);
-        if (rc != 0) {
-                CDEBUG(D_NET, "Can't initialise routing interface "
-                       "(rc = %d): not routing\n", rc);
-        } else {
+        if (kpr_routing()) {
                 /* Only allocate forwarding buffers if there's a router */
 
                 for (i = 0; i < (SOCKNAL_SMALL_FWD_NMSGS +
@@ -2258,22 +2206,12 @@ ksocknal_startup (ptl_ni_t *ni, char **interfaces)
                 return rc;
         }
 
-        ksocknal_data.ksnd_init = SOCKNAL_INIT_LISTENER;
-        
-        rc = libcfs_nal_cmd_register(SOCKNAL, &ksocknal_cmd, NULL);
-        if (rc != 0) {
-                CERROR ("Can't initialise command interface (rc = %d)\n", rc);
-                ksocknal_shutdown (ni);
-                return (rc);
-        }
-
         /* flag everything initialised */
         ksocknal_data.ksnd_init = SOCKNAL_INIT_ALL;
 
         printk(KERN_INFO "Lustre: Routing socket NAL loaded "
-               "(Routing %s, initial mem %d, incarnation "LPX64")\n",
-               kpr_routing (&ksocknal_data.ksnd_router) ?
-               "enabled" : "disabled", pkmem, ksocknal_data.ksnd_incarnation);
+               "(initial mem %d, incarnation "LPX64")\n",
+               pkmem, ksocknal_data.ksnd_incarnation);
         
         return (0);
 }
index 0111087..916ba9c 100644 (file)
@@ -177,7 +177,7 @@ typedef struct
         atomic_t          ksnd_npeers;          /* total # peers extant */
         atomic_t          ksnd_nclosing_conns;  /* # closed conns extant */
 
-        kpr_router_t      ksnd_router;          /* THE router */
+        void             *ksnd_router;          /* router callback arg */
 
         ksock_fmb_pool_t  ksnd_small_fmp;       /* small message forwarding buffers */
         ksock_fmb_pool_t  ksnd_large_fmp;       /* large message forwarding buffers */
@@ -210,8 +210,7 @@ typedef struct
 
 #define SOCKNAL_INIT_NOTHING    0
 #define SOCKNAL_INIT_DATA       1
-#define SOCKNAL_INIT_LISTENER   2
-#define SOCKNAL_INIT_ALL        3
+#define SOCKNAL_INIT_ALL        2
 
 /* A packet just assembled for transmission is represented by 1 or more
  * struct iovec fragments (the first frag contains the portals header),
@@ -486,17 +485,16 @@ ksocknal_peer_decref (ksock_peer_t *peer)
 
 ptl_err_t ksocknal_startup (ptl_ni_t *ni, char **interfaces);
 void ksocknal_shutdown (ptl_ni_t *ni);
+int ksocknal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
 ptl_err_t ksocknal_send (ptl_ni_t *ni, void *private,
                          ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                         int type, ptl_nid_t nid, ptl_pid_t pid,
-                         unsigned int payload_niov, 
-                         struct iovec *payload_iov,
+                         int type, ptl_process_id_t tgt, int routing,
+                         unsigned int payload_niov, struct iovec *payload_iov,
                          size_t payload_offset, size_t payload_nob);
 ptl_err_t ksocknal_send_pages (ptl_ni_t *ni, void *private,
                                ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                               int type, ptl_nid_t nid, ptl_pid_t pid,
-                               unsigned int payload_niov, 
-                               ptl_kiov_t *payload_kiov,
+                               int type, ptl_process_id_t tgt, int routing,
+                               unsigned int payload_niov, ptl_kiov_t *payload_kiov,
                                size_t payload_offset, size_t payload_nob);
 ptl_err_t ksocknal_recv(ptl_ni_t *ni, void *private,
                         ptl_msg_t *ptlmsg, unsigned int niov,
@@ -510,7 +508,7 @@ ptl_err_t ksocknal_recv_pages(ptl_ni_t *ni, void *private,
 
 extern int ksocknal_add_peer(ptl_nid_t nid, __u32 ip, int port);
 extern ksock_peer_t *ksocknal_find_peer_locked (ptl_nid_t nid);
-extern ksock_peer_t *ksocknal_get_peer (ptl_nid_t nid);
+extern ksock_peer_t *ksocknal_find_peer (ptl_nid_t nid);
 extern int ksocknal_create_conn (ksock_route_t *route,
                                  struct socket *sock, int type);
 extern void ksocknal_close_conn_locked (ksock_conn_t *conn, int why);
@@ -522,9 +520,9 @@ extern int ksocknal_close_matching_conns (ptl_nid_t nid, __u32 ipaddr);
 
 extern void ksocknal_queue_tx_locked (ksock_tx_t *tx, ksock_conn_t *conn);
 extern void ksocknal_tx_done (ksock_tx_t *tx, int asynch);
-extern void ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd);
-extern void ksocknal_fmb_callback (void *arg, int error);
-extern void ksocknal_notify (void *arg, ptl_nid_t gw_nid, int alive);
+extern void ksocknal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd);
+extern void ksocknal_fmb_callback (ptl_ni_t *ni, void *arg, int error);
+extern void ksocknal_notify (ptl_ni_t *ni, ptl_nid_t gw_nid, int alive);
 extern int ksocknal_thread_start (int (*fn)(void *arg), void *arg);
 extern void ksocknal_thread_fini (void);
 extern int ksocknal_new_packet (ksock_conn_t *conn, int skip);
index 58c6002..627b0c1 100644 (file)
@@ -378,7 +378,7 @@ ksocknal_tx_done (ksock_tx_t *tx, int asynch)
         }
 
         if (tx->tx_isfwd) {             /* was a forwarded packet? */
-                kpr_fwd_done (&ksocknal_data.ksnd_router,
+                kpr_fwd_done (ksocknal_data.ksnd_ni,
                               KSOCK_TX_2_KPR_FWD_DESC (tx), 
                               (tx->tx_resid == 0) ? 0 : -ECONNABORTED);
                 EXIT;
@@ -513,42 +513,6 @@ ksocknal_launch_connection_locked (ksock_route_t *route)
         spin_unlock_irqrestore (&ksocknal_data.ksnd_connd_lock, flags);
 }
 
-#if 0
-ksock_peer_t *
-ksocknal_find_target_peer_locked (ksock_tx_t *tx, ptl_nid_t nid)
-{
-        ptl_nid_t     target_nid;
-        int           rc;
-        ksock_peer_t *peer = ksocknal_find_peer_locked (nid);
-
-        if (peer != NULL)
-                return (peer);
-
-        if (tx->tx_isfwd) {
-                CERROR ("Can't send packet to "LPX64
-                       " %s: routed target is not a peer\n",
-                        nid, libcfs_nid2str(nid));
-                return (NULL);
-        }
-
-        rc = kpr_lookup (&ksocknal_data.ksnd_router, nid, tx->tx_nob,
-                         &target_nid);
-        if (rc != 0) {
-                CERROR ("Can't route to "LPX64" %s: router error %d\n",
-                        nid, libcfs_nid2str(nid), rc);
-                return (NULL);
-        }
-
-        peer = ksocknal_find_peer_locked (target_nid);
-        if (peer != NULL)
-                return (peer);
-
-        CERROR ("Can't send packet to "LPX64" %s: no peer entry\n",
-                target_nid, libcfs_nid2str(target_nid));
-        return (NULL);
-}
-#endif
-
 ksock_conn_t *
 ksocknal_find_conn_locked (ksock_tx_t *tx, ksock_peer_t *peer)
 {
@@ -718,7 +682,7 @@ ksocknal_find_connecting_route_locked (ksock_peer_t *peer)
 }
 
 int
-ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid)
+ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid, int routing)
 {
         unsigned long     flags;
         ksock_peer_t     *peer;
@@ -762,7 +726,6 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid)
         
 #if !SOCKNAL_ROUND_ROBIN
         read_lock (g_lock);
-#warning "router issues"
         peer = ksocknal_find_peer_locked(nid);
         if (peer != NULL) {
                 if (ksocknal_find_connectable_route_locked(peer) == NULL) {
@@ -783,7 +746,6 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid)
 #endif
         write_lock_irqsave(g_lock, flags);
 
-#warning "router issues"
         peer = ksocknal_find_peer_locked(nid);
         if (peer == NULL) {
                 write_unlock_irqrestore(g_lock, flags);
@@ -830,18 +792,18 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid)
 }
 
 ptl_err_t
-ksocknal_sendmsg(ptl_ni_t     *ni, 
-                 void         *private, 
-                 ptl_msg_t    *cookie,
-                 ptl_hdr_t    *hdr, 
-                 int           type, 
-                 ptl_nid_t     nid, 
-                 ptl_pid_t     pid,
-                 unsigned int  payload_niov, 
-                 struct iovec *payload_iov, 
-                 ptl_kiov_t   *payload_kiov,
-                 size_t        payload_offset,
-                 size_t        payload_nob)
+ksocknal_sendmsg(ptl_ni_t        *ni, 
+                 void            *private, 
+                 ptl_msg_t       *cookie,
+                 ptl_hdr_t       *hdr, 
+                 int              type, 
+                 ptl_process_id_t target,
+                 int              routing,
+                 unsigned int     payload_niov, 
+                 struct iovec    *payload_iov, 
+                 ptl_kiov_t      *payload_kiov,
+                 size_t           payload_offset,
+                 size_t           payload_nob)
 {
         ksock_ltx_t  *ltx;
         int           desc_size;
@@ -850,8 +812,8 @@ ksocknal_sendmsg(ptl_ni_t     *ni,
         /* NB 'private' is different depending on what we're sending.
          * Just ignore it... */
 
-        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid:"LPX64
-               " pid %d\n", payload_nob, payload_niov, nid , pid);
+        CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to %s\n",
+               payload_nob, payload_niov, libcfs_id2str(target));
 
         LASSERT (payload_nob == 0 || payload_niov > 0);
         LASSERT (payload_niov <= PTL_MD_MAX_IOV);
@@ -918,7 +880,7 @@ ksocknal_sendmsg(ptl_ni_t     *ni,
                                          payload_offset, payload_nob);
         }
 
-        rc = ksocknal_launch_packet(&ltx->ltx_tx, nid);
+        rc = ksocknal_launch_packet(&ltx->ltx_tx, target.nid, routing);
         if (rc == 0)
                 return (PTL_OK);
         
@@ -928,40 +890,41 @@ ksocknal_sendmsg(ptl_ni_t     *ni,
 
 ptl_err_t
 ksocknal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-               ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+               ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                unsigned int payload_niov, struct iovec *payload_iov,
                size_t payload_offset, size_t payload_len)
 {
         return (ksocknal_sendmsg(ni, private, cookie,
-                                 hdr, type, nid, pid,
+                                 hdr, type, tgt, routing,
                                  payload_niov, payload_iov, NULL,
                                  payload_offset, payload_len));
 }
 
 ptl_err_t
 ksocknal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 
-                     ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                     ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                      unsigned int payload_niov, ptl_kiov_t *payload_kiov, 
                      size_t payload_offset, size_t payload_len)
 {
         return (ksocknal_sendmsg(ni, private, cookie,
-                                 hdr, type, nid, pid,
+                                 hdr, type, tgt, routing,
                                  payload_niov, NULL, payload_kiov,
                                  payload_offset, payload_len));
 }
 
 void
-ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
+ksocknal_fwd_packet (ptl_ni_t *ni, kpr_fwd_desc_t *fwd)
 {
         ptl_nid_t     nid = fwd->kprfd_gateway_nid;
         ksock_ftx_t  *ftx = (ksock_ftx_t *)&fwd->kprfd_scratch;
+        int           routing;
         int           rc;
         
         CDEBUG (D_NET, "Forwarding [%p] -> "LPX64" ("LPX64"))\n", fwd,
                 fwd->kprfd_gateway_nid, fwd->kprfd_target_nid);
 
-        /* I'm the gateway; must be the last hop */
-        if (nid == ksocknal_data.ksnd_ni->ni_nid)
+        routing = (nid != ksocknal_data.ksnd_ni->ni_nid);
+        if (!routing)
                 nid = fwd->kprfd_target_nid;
 
         /* setup iov for hdr */
@@ -975,9 +938,9 @@ ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd)
         ftx->ftx_tx.tx_nkiov = fwd->kprfd_niov;
         ftx->ftx_tx.tx_kiov  = fwd->kprfd_kiov;
 
-        rc = ksocknal_launch_packet (&ftx->ftx_tx, nid);
+        rc = ksocknal_launch_packet (&ftx->ftx_tx, nid, routing);
         if (rc != 0)
-                kpr_fwd_done (&ksocknal_data.ksnd_router, fwd, rc);
+                kpr_fwd_done (ni, fwd, rc);
 }
 
 int
@@ -1006,7 +969,7 @@ ksocknal_thread_fini (void)
 }
 
 void
-ksocknal_fmb_callback (void *arg, int error)
+ksocknal_fmb_callback (ptl_ni_t *ni, void *arg, int error)
 {
         ksock_fmb_t       *fmb = (ksock_fmb_t *)arg;
         ksock_fmb_pool_t  *fmp = fmb->fmb_pool;
@@ -1071,7 +1034,6 @@ ksocknal_get_idle_fmb (ksock_conn_t *conn)
         ksock_fmb_t      *fmb;
 
         LASSERT (conn->ksnc_rx_state == SOCKNAL_RX_GET_FMB);
-        LASSERT (kpr_routing(&ksocknal_data.ksnd_router));
 
         if (payload_nob <= SOCKNAL_SMALL_FWD_PAGES * CFS_PAGE_SIZE)
                 pool = &ksocknal_data.ksnd_small_fmp;
@@ -1144,7 +1106,7 @@ ksocknal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb)
                 CDEBUG (D_NET, "%p "LPX64"->"LPX64" fwd_start (immediate)\n",
                         conn, le64_to_cpu(conn->ksnc_hdr.src_nid), dest_nid);
 
-                kpr_fwd_start (&ksocknal_data.ksnd_router, &fmb->fmb_fwd);
+                kpr_fwd_start (ksocknal_data.ksnd_ni, &fmb->fmb_fwd);
 
                 ksocknal_new_packet (conn, 0);  /* on to next packet */
                 return (1);
@@ -1192,16 +1154,6 @@ ksocknal_fwd_parse (ksock_conn_t *conn)
                 return;
         }
 
-        if (!kpr_routing(&ksocknal_data.ksnd_router)) {    /* not forwarding */
-                CERROR("dropping packet from "LPX64" (%s) for "LPX64
-                       " (%s): not forwarding\n",
-                       src_nid, libcfs_nid2str(src_nid),
-                       dest_nid, libcfs_nid2str(dest_nid));
-                /* on to new packet (skip this one's body) */
-                ksocknal_new_packet (conn, body_len);
-                return;
-        }
-
         if (body_len > PTL_MTU) {      /* too big to forward */
                 CERROR ("dropping packet from "LPX64" (%s) for "LPX64
                         "(%s): packet size %d too big\n",
@@ -1214,7 +1166,7 @@ ksocknal_fwd_parse (ksock_conn_t *conn)
         }
 
         /* should have gone direct */
-        peer = ksocknal_get_peer (conn->ksnc_hdr.dest_nid);
+        peer = ksocknal_find_peer (conn->ksnc_hdr.dest_nid);
         if (peer != NULL) {
                 CERROR ("dropping packet from "LPX64" (%s) for "LPX64
                         "(%s): target is a peer\n",
@@ -1402,7 +1354,7 @@ ksocknal_process_receive (ksock_conn_t *conn)
                 /* forward the packet. NB ksocknal_init_fmb() put fmb into
                  * conn->ksnc_cookie */
                 fmb = (ksock_fmb_t *)conn->ksnc_cookie;
-                kpr_fwd_start (&ksocknal_data.ksnd_router, &fmb->fmb_fwd);
+                kpr_fwd_start (ksocknal_data.ksnd_ni, &fmb->fmb_fwd);
 
                 /* no slop in forwarded packets */
                 LASSERT (conn->ksnc_rx_nob_left == 0);
index b960020..7e28052 100644 (file)
@@ -28,6 +28,7 @@ ptl_nal_t               kibnal_nal = {
         .nal_type       = VIBNAL,
         .nal_startup    = kibnal_startup,
         .nal_shutdown   = kibnal_shutdown,
+        .nal_ctl        = kibnal_ctl,
         .nal_send       = kibnal_send,
         .nal_send_pages = kibnal_send_pages,
         .nal_recv       = kibnal_recv,
@@ -672,19 +673,13 @@ kibnal_add_persistent_peer (ptl_nid_t nid, __u32 ip)
 }
 
 void
-kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
+kibnal_del_peer_locked (kib_peer_t *peer)
 {
         struct list_head *ctmp;
         struct list_head *cnxt;
         kib_conn_t       *conn;
 
-        if (!single_share)
-                peer->ibp_persistence = 0;
-        else if (peer->ibp_persistence > 0)
-                peer->ibp_persistence--;
-
-        if (peer->ibp_persistence != 0)
-                return;
+        peer->ibp_persistence = 0;
 
         if (list_empty(&peer->ibp_conns)) {
                 kibnal_unlink_peer_locked(peer);
@@ -702,7 +697,7 @@ kibnal_del_peer_locked (kib_peer_t *peer, int single_share)
 }
 
 int
-kibnal_del_peer (ptl_nid_t nid, int single_share)
+kibnal_del_peer (ptl_nid_t nid)
 {
         struct list_head  *ptmp;
         struct list_head  *pnxt;
@@ -732,11 +727,8 @@ kibnal_del_peer (ptl_nid_t nid, int single_share)
                         if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid))
                                 continue;
 
-                        kibnal_del_peer_locked (peer, single_share);
+                        kibnal_del_peer_locked (peer);
                         rc = 0;         /* matched something */
-
-                        if (single_share)
-                                goto out;
                 }
         }
  out:
@@ -1177,63 +1169,57 @@ kibnal_close_matching_conns (ptl_nid_t nid)
 }
 
 int
-kibnal_cmd(struct portals_cfg *pcfg, void * private)
+kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg)
 {
-        int rc = -EINVAL;
+        struct portal_ioctl_data *data = arg;
+        int                       rc = -EINVAL;
 
-        LASSERT (pcfg != NULL);
+        LASSERT (ni == kibnal_data.kib_ni);
 
-        switch(pcfg->pcfg_command) {
-        case NAL_CMD_GET_PEER: {
+        switch(data->ioc_command) {
+        case IOC_PORTAL_GET_PEER: {
                 ptl_nid_t   nid = 0;
                 __u32       ip = 0;
                 int         share_count = 0;
 
-                rc = kibnal_get_peer_info(pcfg->pcfg_count,
+                rc = kibnal_get_peer_info(data->ioc_count,
                                           &nid, &ip, &share_count);
-                pcfg->pcfg_nid   = nid;
-                pcfg->pcfg_size  = 0;
-                pcfg->pcfg_id    = ip;
-                pcfg->pcfg_misc  = IBNAL_SERVICE_NUMBER; /* port */
-                pcfg->pcfg_count = 0;
-                pcfg->pcfg_wait  = share_count;
+                data->ioc_nid    = nid;
+                data->ioc_count  = share_count;
+                data->ioc_u32[0] = ip;
+                data->ioc_u32[1] = IBNAL_SERVICE_NUMBER; /* port */
                 break;
         }
-        case NAL_CMD_ADD_PEER: {
-                rc = kibnal_add_persistent_peer (pcfg->pcfg_nid,
-                                                 pcfg->pcfg_id); /* IP */
+        case IOC_PORTAL_ADD_PEER: {
+                rc = kibnal_add_persistent_peer (data->ioc_nid,
+                                                 data->ioc_u32[0]); /* IP */
                 break;
         }
-        case NAL_CMD_DEL_PEER: {
-                rc = kibnal_del_peer (pcfg->pcfg_nid, 
-                                       /* flags == single_share */
-                                       pcfg->pcfg_flags != 0);
+        case IOC_PORTAL_DEL_PEER: {
+                rc = kibnal_del_peer (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_GET_CONN: {
-                kib_conn_t *conn = kibnal_get_conn_by_idx (pcfg->pcfg_count);
+        case IOC_PORTAL_GET_CONN: {
+                kib_conn_t *conn = kibnal_get_conn_by_idx (data->ioc_count);
 
                 if (conn == NULL)
                         rc = -ENOENT;
                 else {
                         rc = 0;
-                        pcfg->pcfg_nid   = conn->ibc_peer->ibp_nid;
-                        pcfg->pcfg_id    = 0;
-                        pcfg->pcfg_misc  = 0;
-                        pcfg->pcfg_flags = 0;
+                        data->ioc_nid = conn->ibc_peer->ibp_nid;
                         kibnal_conn_decref(conn);
                 }
                 break;
         }
-        case NAL_CMD_CLOSE_CONNECTION: {
-                rc = kibnal_close_matching_conns (pcfg->pcfg_nid);
+        case IOC_PORTAL_CLOSE_CONNECTION: {
+                rc = kibnal_close_matching_conns (data->ioc_nid);
                 break;
         }
-        case NAL_CMD_REGISTER_MYNID: {
-                if (pcfg->pcfg_nid == PTL_NID_ANY)
+        case IOC_PORTAL_REGISTER_MYNID: {
+                if (data->ioc_nid == PTL_NID_ANY)
                         rc = -EINVAL;
                 else
-                        rc = kibnal_set_mynid (pcfg->pcfg_nid);
+                        rc = kibnal_set_mynid (data->ioc_nid);
                 break;
         }
         }
@@ -1503,10 +1489,6 @@ kibnal_shutdown (ptl_ni_t *ni)
         switch (kibnal_data.kib_init) {
 
         case IBNAL_INIT_ALL:
-                /* stop calls to nal_cmd */
-                libcfs_nal_cmd_unregister(VIBNAL);
-                /* No new peers */
-
                 /* resetting my NID removes my listener and nukes all current
                  * peers and their connections */
                 kibnal_set_mynid (PTL_NID_ANY);
@@ -1603,6 +1585,7 @@ kibnal_shutdown (ptl_ni_t *ni)
                atomic_read(&portal_kmemory));
 
         kibnal_data.kib_init = IBNAL_INIT_NOTHING;
+        PORTAL_MODULE_UNUSE;
 }
 
 ptl_err_t
@@ -1623,6 +1606,7 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 return PTL_FAIL;
         }
 
+        PORTAL_MODULE_USE;
         memset (&kibnal_data, 0, sizeof (kibnal_data)); /* zero pointers, flags etc */
 
         kibnal_data.kib_ni = ni;
@@ -1842,14 +1826,6 @@ kibnal_startup (ptl_ni_t *ni, char **interfaces)
                 }
         }
         
-        /*****************************************************/
-
-        rc = libcfs_nal_cmd_register(VIBNAL, &kibnal_cmd, NULL);
-        if (rc != 0) {
-                CERROR ("Can't initialise command interface (rc = %d)\n", rc);
-                goto failed;
-        }
-
         /* flag everything initialised */
         kibnal_data.kib_init = IBNAL_INIT_ALL;
         /*****************************************************/
index 5d0796e..be45e8f 100644 (file)
@@ -411,17 +411,16 @@ extern kib_tunables_t  kibnal_tunables;
 
 ptl_err_t kibnal_startup (ptl_ni_t *ni, char **interfaces);
 void kibnal_shutdown (ptl_ni_t *ni);
+int kibnal_ctl(ptl_ni_t *ni, unsigned int cmd, void *arg);
 ptl_err_t kibnal_send (ptl_ni_t *ni, void *private,
                        ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                       int type, ptl_nid_t nid, ptl_pid_t pid,
-                       unsigned int payload_niov, 
-                       struct iovec *payload_iov,
+                       int type, ptl_process_id_t tgt, int routing,
+                       unsigned int payload_niov, struct iovec *payload_iov,
                        size_t payload_offset, size_t payload_nob);
 ptl_err_t kibnal_send_pages (ptl_ni_t *ni, void *private,
                              ptl_msg_t *ptlmsg, ptl_hdr_t *hdr,
-                             int type, ptl_nid_t nid, ptl_pid_t pid,
-                             unsigned int payload_niov, 
-                             ptl_kiov_t *payload_kiov,
+                             int type, ptl_process_id_t tgt, int routing,
+                             unsigned int payload_niov, ptl_kiov_t *payload_kiov,
                              size_t payload_offset, size_t payload_nob);
 ptl_err_t kibnal_recv(ptl_ni_t *ni, void *private,
                       ptl_msg_t *ptlmsg, unsigned int niov,
@@ -438,7 +437,7 @@ extern void kibnal_pack_msg(kib_msg_t *msg, int credits, ptl_nid_t dstnid,
 extern int kibnal_unpack_msg(kib_msg_t *msg, int nob);
 extern kib_peer_t *kibnal_create_peer(ptl_nid_t nid);
 extern void kibnal_destroy_peer(kib_peer_t *peer);
-extern int kibnal_del_peer(ptl_nid_t nid, int single_share);
+extern int kibnal_del_peer(ptl_nid_t nid);
 extern kib_peer_t *kibnal_find_peer_locked(ptl_nid_t nid);
 extern void kibnal_unlink_peer_locked(kib_peer_t *peer);
 extern int  kibnal_close_stale_conns_locked(kib_peer_t *peer,
index 91033b0..60ccfc7 100644 (file)
@@ -1305,18 +1305,18 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
 }
 
 ptl_err_t
-kibnal_sendmsg(ptl_ni_t     *ni, 
-               void         *private,
-               ptl_msg_t    *ptlmsg,
-               ptl_hdr_t    *hdr, 
-               int           type, 
-               ptl_nid_t     nid, 
-               ptl_pid_t     pid,
-               unsigned int  payload_niov, 
-               struct iovec *payload_iov, 
-               ptl_kiov_t   *payload_kiov,
-               int           payload_offset,
-               int           payload_nob)
+kibnal_sendmsg(ptl_ni_t        *ni, 
+               void            *private,
+               ptl_msg_t       *ptlmsg,
+               ptl_hdr_t       *hdr, 
+               int              type, 
+               ptl_process_id_t target,
+               int              routing,
+               unsigned int     payload_niov, 
+               struct iovec    *payload_iov, 
+               ptl_kiov_t      *payload_kiov,
+               int              payload_offset,
+               int              payload_nob)
 {
         kib_msg_t  *ibmsg;
         kib_tx_t   *tx;
@@ -1326,8 +1326,8 @@ kibnal_sendmsg(ptl_ni_t     *ni,
 
         /* NB 'private' is different depending on what we're sending.... */
 
-        CDEBUG(D_NET, "sending %d bytes in %d frags to nid:"LPX64
-               " pid %d\n", payload_nob, payload_niov, nid , pid);
+        CDEBUG(D_NET, "sending %d bytes in %d frags to %s\n", 
+               payload_nob, payload_niov, libcfs_id2str(target));
 
         LASSERT (payload_nob == 0 || payload_niov > 0);
         LASSERT (payload_niov <= PTL_MD_MAX_IOV);
@@ -1337,6 +1337,11 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         /* payload is either all vaddrs or all pages */
         LASSERT (!(payload_kiov != NULL && payload_iov != NULL));
 
+        if (routing) {
+                CERROR ("Can't route\n");
+                return PTL_FAIL;
+        }
+        
         switch (type) {
         default:
                 LBUG();
@@ -1354,9 +1359,9 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                         if (nob > IBNAL_MSG_SIZE) {
                                 CERROR("REPLY for "LPX64" too big (RDMA not requested):"
                                        "%d (max for message is %d)\n", 
-                                       nid, payload_nob, IBNAL_MSG_SIZE);
+                                       target.nid, payload_nob, IBNAL_MSG_SIZE);
                                 CERROR("Can't REPLY IMMEDIATE %d to "LPX64"\n",
-                                       nob, nid);
+                                       nob, target.nid);
                                 return PTL_FAIL;
                         }
                         break;
@@ -1365,7 +1370,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 /* Incoming message consistent with RDMA? */
                 if (rx->rx_msg->ibm_type != IBNAL_MSG_GET_REQ) {
                         CERROR("REPLY to "LPX64" bad msg type %x!!!\n",
-                               nid, rx->rx_msg->ibm_type);
+                               target.nid, rx->rx_msg->ibm_type);
                         return PTL_FAIL;
                 }
 
@@ -1374,7 +1379,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
 
                 tx = kibnal_get_idle_tx(0);
                 if (tx == NULL) {
-                        CERROR("Can't get tx for REPLY to "LPX64"\n", nid);
+                        CERROR("Can't get tx for REPLY to "LPX64"\n", target.nid);
                         return PTL_FAIL;
                 }
 
@@ -1389,7 +1394,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                                   payload_niov, payload_kiov,
                                                   payload_offset, payload_nob);
                 if (rc != 0) {
-                        CERROR("Can't setup GET src for "LPX64": %d\n", nid, rc);
+                        CERROR("Can't setup GET src for "LPX64": %d\n", target.nid, rc);
                         kibnal_tx_done(tx);
                         return PTL_FAIL;
                 }
@@ -1399,7 +1404,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                       rx->rx_msg->ibm_u.get.ibgm_cookie);
                 if (rc < 0) {
                         CERROR("Can't setup rdma for GET from "LPX64": %d\n", 
-                               nid, rc);
+                               target.nid, rc);
                 } else if (rc == 0) {
                         /* No RDMA: local completion may happen now! */
                         ptl_finalize (kibnal_data.kib_ni, NULL, ptlmsg, PTL_OK);
@@ -1439,7 +1444,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                                   ptlmsg->msg_md->md_iov.kiov,
                                                   0, ptlmsg->msg_md->md_length);
                 if (rc != 0) {
-                        CERROR("Can't setup GET sink for "LPX64": %d\n", nid, rc);
+                        CERROR("Can't setup GET sink for "LPX64": %d\n", target.nid, rc);
                         kibnal_tx_done(tx);
                         return PTL_FAIL;
                 }
@@ -1448,16 +1453,16 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                 nob = offsetof(kib_get_msg_t, ibgm_rd.rd_frags[n]);
                 kibnal_init_tx_msg(tx, IBNAL_MSG_GET_REQ, nob);
 
-                tx->tx_ptlmsg[1] = ptl_create_reply_msg(kibnal_data.kib_ni, nid, ptlmsg);
+                tx->tx_ptlmsg[1] = ptl_create_reply_msg(kibnal_data.kib_ni, target.nid, ptlmsg);
                 if (tx->tx_ptlmsg[1] == NULL) {
-                        CERROR("Can't create reply for GET -> "LPX64"\n", nid);
+                        CERROR("Can't create reply for GET -> "LPX64"\n", target.nid);
                         kibnal_tx_done(tx);
                         return PTL_FAIL;
                 }
 
                 tx->tx_ptlmsg[0] = ptlmsg;      /* finalise ptlmsg[0,1] on completion */
                 tx->tx_waiting = 1;             /* waiting for GET_DONE */
-                kibnal_launch_tx(tx, nid);
+                kibnal_launch_tx(tx, target.nid);
                 return PTL_OK;
 
         case PTL_MSG_ACK:
@@ -1482,7 +1487,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
                                                   payload_niov, payload_kiov,
                                                   payload_offset, payload_nob);
                 if (rc != 0) {
-                        CERROR("Can't setup PUT src for "LPX64": %d\n", nid, rc);
+                        CERROR("Can't setup PUT src for "LPX64": %d\n", target.nid, rc);
                         kibnal_tx_done(tx);
                         return PTL_FAIL;
                 }
@@ -1494,7 +1499,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
 
                 tx->tx_ptlmsg[0] = ptlmsg;      /* finalise ptlmsg on completion */
                 tx->tx_waiting = 1;             /* waiting for PUT_{ACK,NAK} */
-                kibnal_launch_tx(tx, nid);
+                kibnal_launch_tx(tx, target.nid);
                 return PTL_OK;
         }
 
@@ -1504,7 +1509,7 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         tx = kibnal_get_idle_tx(!(type == PTL_MSG_ACK ||
                                   type == PTL_MSG_REPLY));
         if (tx == NULL) {
-                CERROR ("Can't send %d to "LPX64": tx descs exhausted\n", type, nid);
+                CERROR ("Can't send %d to "LPX64": tx descs exhausted\n", type, target.nid);
                 return PTL_NO_SPACE;
         }
 
@@ -1526,32 +1531,30 @@ kibnal_sendmsg(ptl_ni_t     *ni,
         kibnal_init_tx_msg (tx, IBNAL_MSG_IMMEDIATE, nob);
 
         tx->tx_ptlmsg[0] = ptlmsg;              /* finalise ptlmsg on completion */
-        kibnal_launch_tx(tx, nid);
+        kibnal_launch_tx(tx, target.nid);
         return PTL_OK;
 }
 
 ptl_err_t
 kibnal_send (ptl_ni_t *ni, void *private, ptl_msg_t *cookie,
-             ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+             ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
              unsigned int payload_niov, struct iovec *payload_iov,
              size_t payload_offset, size_t payload_len)
 {
-        CDEBUG(D_NET, "  pid = %d, nid="LPU64"\n",
-               pid, nid);
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, payload_iov, NULL,
                                payload_offset, payload_len));
 }
 
 ptl_err_t
 kibnal_send_pages (ptl_ni_t *ni, void *private, ptl_msg_t *cookie, 
-                   ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+                   ptl_hdr_t *hdr, int type, ptl_process_id_t tgt, int routing,
                    unsigned int payload_niov, ptl_kiov_t *payload_kiov, 
                    size_t payload_offset, size_t payload_len)
 {
         return (kibnal_sendmsg(ni, private, cookie,
-                               hdr, type, nid, pid,
+                               hdr, type, tgt, routing,
                                payload_niov, NULL, payload_kiov,
                                payload_offset, payload_len));
 }
index 7e2a6c3..d5744c8 100644 (file)
@@ -5,7 +5,15 @@
 #include <string.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+
 #include <portals/api-support.h>
+
+/* This ghastly hack to allows me to include lib-types.h It doesn't affect any
+ * assertions generated here (but fails-safe if it ever does) */
+typedef struct {
+        int     counter;
+} atomic_t;
+
 #include <portals/lib-types.h>
 
 #include "vibnal_wire.h"
index 4b2558b..0d9a1ec 100644 (file)
@@ -76,7 +76,7 @@ int portal_ioctl_getdata(char *buf, char *end, void *arg)
 
         RETURN(0);
 }
-                                                                                                                                                                        
+
 extern struct cfs_psdev_ops          libcfs_psdev_ops;
 
 static int 
index c6b63f8..2a85f9f 100644 (file)
 #include <portals/p30.h>
 #include <libcfs/kp30.h>
 
-struct nal_cmd_handler {
-        int                  nch_number;
-        nal_cmd_handler_fn  *nch_handler;
-        void                *nch_private;
-};
-
-static struct nal_cmd_handler nal_cmd[16];
-struct semaphore nal_cmd_mutex;
-
 void
 kportal_memhog_free (struct portals_device_userstate *pdu)
 {
@@ -180,144 +171,36 @@ static int libcfs_psdev_release(unsigned long flags, void *args)
         RETURN(0);
 }
 
-static inline void freedata(void *data, int len)
-{
-        PORTAL_FREE(data, len);
-}
-
-struct nal_cmd_handler *
-libcfs_find_nal_cmd_handler(int nal)
-{
-        int    i;
-
-        for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++)
-                if (nal_cmd[i].nch_handler != NULL &&
-                    nal_cmd[i].nch_number == nal)
-                        return (&nal_cmd[i]);
-
-        return (NULL);
-}
-
-int
-libcfs_nal_cmd_register(int nal, nal_cmd_handler_fn *handler, void *private)
-{
-        struct nal_cmd_handler *cmd;
-        int                     i;
-        int                     rc;
-
-        CDEBUG(D_IOCTL, "Register NAL %x, handler: %p\n", nal, handler);
-
-        mutex_down(&nal_cmd_mutex);
-
-        if (libcfs_find_nal_cmd_handler(nal) != NULL) {
-                mutex_up (&nal_cmd_mutex);
-                return (-EBUSY);
-        }
-
-        cmd = NULL;
-        for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++)
-                if (nal_cmd[i].nch_handler == NULL) {
-                        cmd = &nal_cmd[i];
-                        break;
-                }
-
-        if (cmd == NULL) {
-                rc = -EBUSY;
-        } else {
-                rc = 0;
-                cmd->nch_number = nal;
-                cmd->nch_handler = handler;
-                cmd->nch_private = private;
-        }
-
-        mutex_up(&nal_cmd_mutex);
-
-        return rc;
-}
-EXPORT_SYMBOL(libcfs_nal_cmd_register);
-
-void
-libcfs_nal_cmd_unregister(int nal)
-{
-        struct nal_cmd_handler *cmd;
-
-        CDEBUG(D_IOCTL, "Unregister NAL %x\n", nal);
-
-        mutex_down(&nal_cmd_mutex);
-        cmd = libcfs_find_nal_cmd_handler(nal);
-        LASSERT (cmd != NULL);
-        cmd->nch_handler = NULL;
-        cmd->nch_private = NULL;
-        mutex_up(&nal_cmd_mutex);
-}
-EXPORT_SYMBOL(libcfs_nal_cmd_unregister);
-
-int
-libcfs_nal_cmd(struct portals_cfg *pcfg)
-{
-#if CRAY_PORTALS
-        /* pretend success */
-        RETURN(0);
-#else
-        struct nal_cmd_handler *cmd;
-        __u32 nal = pcfg->pcfg_nal;
-        int   rc = -EINVAL;
-        ENTRY;
-
-        if (pcfg->pcfg_version != PORTALS_CFG_VERSION) {
-                RETURN(-EINVAL);
-        }
-
-        mutex_down(&nal_cmd_mutex);
-        cmd = libcfs_find_nal_cmd_handler(nal);
-        if (cmd != NULL) {
-                CDEBUG(D_IOCTL, "calling handler nal: %x, cmd: %d\n", nal,
-                       pcfg->pcfg_command);
-                rc = cmd->nch_handler(pcfg, cmd->nch_private);
-        } else {
-                CERROR("invalid nal: %x, cmd: %d\n", nal, pcfg->pcfg_command);
-        }
-        mutex_up(&nal_cmd_mutex);
-
-        RETURN(rc);
-#endif
-}
-EXPORT_SYMBOL(libcfs_nal_cmd);
-
 static struct rw_semaphore ioctl_list_sem;
 static struct list_head ioctl_list;
 
 int libcfs_register_ioctl(struct libcfs_ioctl_handler *hand)
 {
         int rc = 0;
-        down_read(&ioctl_list_sem);
+
+        down_write(&ioctl_list_sem);
         if (!list_empty(&hand->item))
                 rc = -EBUSY;
-        up_read(&ioctl_list_sem);
-
-        if (rc == 0) {
-                down_write(&ioctl_list_sem);
+        else
                 list_add_tail(&hand->item, &ioctl_list);
-                up_write(&ioctl_list_sem);
-        }
-        RETURN(0);
+        up_write(&ioctl_list_sem);
+
+        return rc;
 }
 EXPORT_SYMBOL(libcfs_register_ioctl);
 
 int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand)
 {
         int rc = 0;
-        down_read(&ioctl_list_sem);
+
+        down_write(&ioctl_list_sem);
         if (list_empty(&hand->item))
                 rc = -ENOENT;
-        up_read(&ioctl_list_sem);
-
-        if (rc == 0) {
-                down_write(&ioctl_list_sem);
+        else
                 list_del_init(&hand->item);
-                up_write(&ioctl_list_sem);
-        }
-        RETURN(0);
+        up_write(&ioctl_list_sem);
+
+        return rc;
 }
 EXPORT_SYMBOL(libcfs_deregister_ioctl);
 
@@ -352,7 +235,8 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a
                 RETURN(0);
 #if LWT_SUPPORT
         case IOC_PORTAL_LWT_CONTROL:
-                err = lwt_control (data->ioc_flags, data->ioc_misc);
+                err = lwt_control ((data->ioc_flags & 1) != 0, 
+                                   (data->ioc_flags & 2) != 0);
                 break;
 
         case IOC_PORTAL_LWT_SNAPSHOT: {
@@ -362,13 +246,13 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a
 
                 err = lwt_snapshot (&now, &ncpu, &total_size,
                                     data->ioc_pbuf1, data->ioc_plen1);
-                data->ioc_nid = now;
-                data->ioc_count = ncpu;
-                data->ioc_misc = total_size;
+                data->ioc_u64[0] = now;
+                data->ioc_u32[0] = ncpu;
+                data->ioc_u32[1] = total_size;
 
                 /* Hedge against broken user/kernel typedefs (e.g. cycles_t) */
-                data->ioc_nid2 = sizeof(lwt_event_t);
-                data->ioc_nid3 = offsetof(lwt_event_t, lwte_where);
+                data->ioc_u32[2] = sizeof(lwt_event_t);
+                data->ioc_u32[3] = offsetof(lwt_event_t, lwte_where);
 
                 if (err == 0 &&
                     copy_to_user((char *)arg, data, sizeof (*data)))
@@ -384,46 +268,6 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a
                         err = -EFAULT;
                 break;
 #endif
-        case IOC_PORTAL_NAL_CMD: {
-                struct portals_cfg pcfg;
-
-                if (data->ioc_plen1 != sizeof(pcfg)) {
-                        CERROR("Bad ioc_plen1 %d (wanted "LPSZ")\n",
-                               data->ioc_plen1, sizeof(pcfg));
-                        err = -EINVAL;
-                        break;
-                }
-
-                if (copy_from_user(&pcfg, (void *)data->ioc_pbuf1,
-                                   sizeof(pcfg))) {
-                        err = -EFAULT;
-                        break;
-                }
-
-                CDEBUG (D_IOCTL, "nal command nal %x cmd %d\n", pcfg.pcfg_nal,
-                        pcfg.pcfg_command);
-                if (pcfg.pcfg_version != PORTALS_CFG_VERSION) {
-                        /* set this so userspace can tell when they
-                         * have an incompatible version and print a
-                         * decent message to the user
-                         */
-                        pcfg.pcfg_version = PORTALS_CFG_VERSION;
-                        if (copy_to_user((char *)data->ioc_pbuf1, &pcfg,
-                                         sizeof (pcfg)))
-                                err = -EFAULT;
-                        else
-                                err = -EINVAL;
-                } else {
-                        err = libcfs_nal_cmd(&pcfg);
-
-                        if (err == 0 &&
-                            copy_to_user((char *)data->ioc_pbuf1, &pcfg,
-                                         sizeof (pcfg)))
-                                err = -EFAULT;
-                }
-                break;
-        }
-
         case IOC_PORTAL_MEMHOG:
                 if (pfile->private_data == NULL) {
                         err = -EINVAL;
@@ -438,17 +282,39 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a
                 }
                 break;
 
+        case IOC_PORTAL_PING: {
+                extern void (kping_client)(struct portal_ioctl_data *);
+                void (*ping)(struct portal_ioctl_data *);
+
+                CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n",
+                       data->ioc_count, data->ioc_nid,
+                       libcfs_nid2str(data->ioc_nid));
+                ping = PORTAL_SYMBOL_GET(kping_client);
+                if (!ping)
+                        CERROR("PORTAL_SYMBOL_GET failed\n");
+                else {
+                        ping(data);
+                        PORTAL_SYMBOL_PUT(kping_client);
+                }
+                RETURN(0);
+        }
+
         default: {
                 struct libcfs_ioctl_handler *hand;
                 err = -EINVAL;
                 down_read(&ioctl_list_sem);
                 list_for_each_entry(hand, &ioctl_list, item) {
-                        err = hand->handle_ioctl(data, cmd, (unsigned long)arg);
-                        if (err != -EINVAL)
+                        err = hand->handle_ioctl(cmd, data);
+                        if (err != -EINVAL) {
+                                if (copy_to_user((char *)arg, 
+                                                 data, sizeof (*data)))
+                                        err = -EFAULT;
                                 break;
+                        }
                 }
                 up_read(&ioctl_list_sem);
-                } break;
+                break;
+        }
         }
 
         RETURN(err);
@@ -484,7 +350,6 @@ static int init_libcfs_module(void)
         libcfs_init_nidstrings();
         init_rwsem(&tracefile_sem);
         init_mutex(&trace_thread_sem);
-        init_mutex(&nal_cmd_mutex);
         init_rwsem(&ioctl_list_sem);
         CFS_INIT_LIST_HEAD(&ioctl_list);
 
index 6f78cd9..71a5dc5 100644 (file)
 # define EXPORT_SYMTAB
 #endif
 
-# define DEBUG_SUBSYSTEM S_PORTALS
+#define DEBUG_SUBSYSTEM S_PORTALS
 
+#include <portals/p30.h>
 #include <libcfs/kp30.h>
-#include <libcfs/libcfs.h>
+#ifndef __KERNEL__
+#include <netdb.h>
+#endif
+
+/* CAVEAT VENDITOR! Keep the canonical string representation of nets/nids
+ * consistent in all conversion functions.  Some code fragments are copied
+ * around for the sake of clarity...
+ */
 
 /* CAVEAT EMPTOR! Racey temporary buffer allocation!
  * Choose the number of nidstrings to support the MAXIMUM expected number of
  * between getting its string and using it.
  */
 
-static char        libcfs_nidstrings[128][PTL_NALFMT_SIZE];
-static int         libcfs_nidstring_idx;
-static spinlock_t  libcfs_nidstring_lock;
+static char      libcfs_nidstrings[128][PTL_NALFMT_SIZE];
+static int       libcfs_nidstring_idx = 0;
 
-void
-libcfs_init_nidstrings (void)
+#ifdef __KERNEL__
+static spinlock_t libcfs_nidstring_lock;
+
+void libcfs_init_nidstrings (void)
 {
         spin_lock_init(&libcfs_nidstring_lock);
 }
 
+# define NIDSTR_LOCK(f)   spin_lock_irqsave(&libcfs_nidstring_lock, f)
+# define NIDSTR_UNLOCK(f) spin_unlock_irqrestore(&libcfs_nidstring_lock, f)
+#else
+# define NIDSTR_LOCK(f)   (f)                   /* avoid unused var warnings */
+# define NIDSTR_UNLOCK(f) (f)
+#endif
+
 static char *
 libcfs_next_nidstring (void)
 {
-       unsigned long  flags;
        char          *str;
-       
-       spin_lock_irqsave(&libcfs_nidstring_lock, flags);
-       
+       unsigned long  flags;
+
+       NIDSTR_LOCK(flags);
+
        str = libcfs_nidstrings[libcfs_nidstring_idx++];
        if (libcfs_nidstring_idx ==
            sizeof(libcfs_nidstrings)/sizeof(libcfs_nidstrings[0]))
                libcfs_nidstring_idx = 0;
 
-       spin_unlock_irqrestore(&libcfs_nidstring_lock, flags);
-
+        NIDSTR_UNLOCK(flags);
        return str;
 }
 
@@ -72,14 +87,14 @@ static int  libcfs_ip_str2addr(char *str, int nob, __u32 *addr);
 static void libcfs_num_addr2str(__u32 addr, char *str);
 static int  libcfs_num_str2addr(char *str, int nob, __u32 *addr);
 
-struct nettype {
-        int          type;
-        char        *name;
-        void       (*addr2str)(__u32 addr, char *str);
-        int        (*str2addr)(char *str, int nob, __u32 *addr);
+struct nalstrfns {
+        int          nf_nal;
+        char        *nf_name;
+        void       (*nf_addr2str)(__u32 addr, char *str);
+        int        (*nf_str2addr)(char *str, int nob, __u32 *addr);
 };
 
-static struct nettype  libcfs_nettypes[] = {
+static struct nalstrfns  libcfs_nalstrfns[] = {
         {LONAL,     "lo",     libcfs_lo_addr2str,  libcfs_lo_str2addr},
         {SOCKNAL,   "tcp",    libcfs_ip_addr2str,  libcfs_ip_str2addr},
         {OPENIBNAL, "openib", libcfs_ip_addr2str,  libcfs_ip_str2addr},
@@ -90,7 +105,7 @@ static struct nettype  libcfs_nettypes[] = {
         {GMNAL,     "gm",     libcfs_num_addr2str, libcfs_num_str2addr},
 };
 
-const int libcfs_nnettypes = sizeof(libcfs_nettypes)/sizeof(libcfs_nettypes[0]);
+const int libcfs_nnalstrfns = sizeof(libcfs_nalstrfns)/sizeof(libcfs_nalstrfns[0]);
 
 void
 libcfs_lo_addr2str(__u32 addr, char *str)
@@ -111,7 +126,19 @@ libcfs_lo_str2addr(char *str, int nob, __u32 *addr)
 void
 libcfs_ip_addr2str(__u32 addr, char *str)
 {
-        snprintf(str, PTL_NALFMT_SIZE, "%u.%u.%u.%u", HIPQUAD(addr));
+#if !defined(__KERNEL__) && defined HAVE_GETHOSTBYNAME
+        __u32           netip = htonl(addr);
+        struct hostent *he = gethostbyaddr(&netip, sizeof(netip), AF_INET);
+        
+        if (he != NULL && 
+            strlen(he->h_name) < PTL_NALFMT_SIZE) {
+                strcpy(str, he->h_name);
+                return;
+        }
+#endif
+        snprintf(str, PTL_NALFMT_SIZE, "%u.%u.%u.%u",
+                 (addr >> 24) & 0xff, (addr >> 16) & 0xff,
+                 (addr >> 8) & 0xff, addr & 0xff);
 }
 
 int
@@ -122,17 +149,31 @@ libcfs_ip_str2addr(char *str, int nob, __u32 *addr)
         int   c;
         int   d;
         int   n;
-        
-        if (sscanf(str, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n) < 4 ||
-            n != nob)
-                return 0;
 
-        if ((a & ~0xff) != 0 || (b & ~0xff) != 0 ||
-            (c & ~0xff) != 0 || (d & ~0xff) != 0)
-                return 0;
-        
-        *addr = ((a<<24)|(b<<16)|(c<<8)|d);
-        return 1;
+        /* numeric IP? */
+        if (sscanf(str, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n) >= 4 &&
+            n == nob &&
+            (a & ~0xff) == 0 && (b & ~0xff) == 0 &&
+            (c & ~0xff) == 0 && (d & ~0xff) == 0) {
+                *addr = ((a<<24)|(b<<16)|(c<<8)|d);
+                return 1;
+        }
+
+#if !defined(__KERNEL__) && defined HAVE_GETHOSTBYNAME
+        /* known hostname? */
+        if (('a' <= str[0] && str[0] <= 'z') ||
+            ('A' <= str[0] && str[0] <= 'Z')) {
+                struct hostent *he = gethostbyname(str);
+                
+                if (he != NULL) {
+                        __u32 ip = *(__u32 *)he->h_addr;
+
+                        *addr = ntohl(ip);
+                        return 1;
+                }
+        }
+#endif
+        return 0;
 }
 
 void
@@ -155,118 +196,200 @@ libcfs_num_str2addr(char *str, int nob, __u32 *addr)
         return 1;
 }
 
-struct nettype *
-libcfs_get_nettype(int type) 
+struct nalstrfns *
+libcfs_nal2nalstrfns(int nal) 
+{
+        int    i;
+        
+        for (i = 0; i < libcfs_nnalstrfns; i++)
+                if (nal == libcfs_nalstrfns[i].nf_nal)
+                        return &libcfs_nalstrfns[i];
+
+        return NULL;
+}
+
+struct nalstrfns *
+libcfs_name2nalstrfns(char *name)
 {
         int    i;
         
-        for (i = 0; i < libcfs_nnettypes; i++)
-                if (type == libcfs_nettypes[i].type)
-                        return &libcfs_nettypes[i];
+        for (i = 0; i < libcfs_nnalstrfns; i++)
+                if (!strcmp(libcfs_nalstrfns[i].nf_name, name))
+                        return &libcfs_nalstrfns[i];
 
         return NULL;
 }
 
 int
-libcfs_isknown_nettype(int type)
+libcfs_isknown_nal(int nal)
 {
-        return libcfs_get_nettype(type) != NULL;
+        return libcfs_nal2nalstrfns(nal) != NULL;
 }
 
 char *
-libcfs_nettype2str(int type
+libcfs_nal2str(int nal
 {
         char           *str;
-        struct nettype *nt = libcfs_get_nettype(type);
+        struct nalstrfns *nf = libcfs_nal2nalstrfns(nal);
         
-        if (nt != NULL)
-                return nt->name;
+        if (nf != NULL)
+                return nf->nf_name;
         
         str = libcfs_next_nidstring();
-        snprintf(str, PTL_NALFMT_SIZE, "?%u?", type);
+        snprintf(str, PTL_NALFMT_SIZE, "?%u?", nal);
+        return str;
+}
+
+int
+libcfs_str2nal(char *str)
+{
+        struct nalstrfns *nf = libcfs_name2nalstrfns(str);
+        
+        if (nf != NULL)
+                return nf->nf_nal;
+        
+        return -1;
+}
+
+char *
+libcfs_net2str(__u32 net)
+{
+        int             nal = PTL_NETNAL(net);
+        int             num = PTL_NETNUM(net);
+        struct nalstrfns *nf = libcfs_nal2nalstrfns(nal);
+       char           *str = libcfs_next_nidstring();
+
+        if (nf == NULL) 
+                snprintf(str, PTL_NALFMT_SIZE, "t<%u>%u", nal, num);
+        else if (num == 0)
+                snprintf(str, PTL_NALFMT_SIZE, "%s", nf->nf_name);
+        else
+                snprintf(str, PTL_NALFMT_SIZE, "%s%u", nf->nf_name, num);
+
         return str;
 }
 
 char *
 libcfs_nid2str(ptl_nid_t nid)
 {
-       char           *str = libcfs_next_nidstring();
-       __u32           lo  = (__u32)nid;
-       __u32           hi  = (__u32)(nid>>32);
-        int             nnum  = hi & 0xffff;
-        int             ntype = (hi >> 16) & 0xffff;
-        struct nettype *nettype = libcfs_get_nettype(ntype);
+        __u32           addr = PTL_NIDADDR(nid);
+        __u32           net = PTL_NIDNET(nid);
+        int             nal = PTL_NETNAL(net);
+        int             nnum = PTL_NETNUM(net);
+        struct nalstrfns *nf;
+       char           *str;
         int             nob;
 
-        if (nid == PTL_NID_ANY) {
-                snprintf(str, PTL_NALFMT_SIZE, "%s", "PTL_NID_ANY");
-        } else if (nettype == NULL) {
-                snprintf(str, PTL_NALFMT_SIZE, "%x@%u.%u", lo, nnum, ntype);
-        } else {
-               nettype->addr2str(lo, str);
-               nob = strlen(str);
-               if (nnum == 0)
-                       snprintf(str + nob, PTL_NALFMT_SIZE - nob,
-                                "@%s", nettype->name);
-               else
-                       snprintf(str + nob, PTL_NALFMT_SIZE - nob,
-                                "@%s%u", nettype->name, nnum);
+        if (nid == PTL_NID_ANY)
+                return "PTL_NID_ANY";
+
+        nf = libcfs_nal2nalstrfns(PTL_NETNAL(net));
+       str = libcfs_next_nidstring();
+
+        if (nf == NULL)
+                snprintf(str, PTL_NALFMT_SIZE, "%x@t<%u>%u", addr, nal, nnum);
+        else {
+                nf->nf_addr2str(addr, str);
+                nob = strlen(str);
+                if (nnum == 0)
+                        snprintf(str + nob, PTL_NALFMT_SIZE - nob, "@%s",
+                                 nf->nf_name);
+                else
+                        snprintf(str + nob, PTL_NALFMT_SIZE - nob, "@%s%u",
+                                 nf->nf_name, nnum);
         }
 
         return str;
 }
 
-ptl_nid_t
-libcfs_str2nid(char *str)
+static struct nalstrfns *
+libcfs_str2net_internal(char *str, __u32 *net)
 {
-        char           *sep = strchr(str, '@');
-        struct nettype *nettype;
+        struct nalstrfns *nf;
         int             nob;
-        int             net;
-        __u32           addr;
+        int             netnum;
         int             i;
 
-        if (sep == NULL) {
-                sep = str + strlen(str);
-                net = 0;
-                nettype = libcfs_get_nettype(SOCKNAL);
-                LASSERT (nettype != NULL);
-        } else {
-                for (i = 0; i < libcfs_nnettypes; i++) {
-                        nettype = &libcfs_nettypes[i];
+        for (i = 0; i < libcfs_nnalstrfns; i++) {
+                nf = &libcfs_nalstrfns[i];
 
-                        if (!strncmp(sep + 1, nettype->name, 
-                                    strlen(nettype->name)))
-                                break;
-                }
-                if (i == libcfs_nnettypes)
-                        return PTL_NID_ANY;
+                if (!strncmp(str, nf->nf_name, strlen(nf->nf_name)))
+                        break;
+        }
+        if (i == libcfs_nnalstrfns)
+                return NULL;
+
+        nob = strlen(nf->nf_name);
+
+        if (strlen(str) == nob)
+                netnum = 0;
+        else if (nf->nf_nal == LONAL || /* net number not allowed */
+                 sscanf(str + nob, "%u%n", &netnum, &i) < 1 ||
+                 i != strlen(str + nob) ||
+                 (netnum & ~0xffff) != 0)
+                return NULL;
 
-                nob = strlen(nettype->name);
+        *net = PTL_MKNET(nf->nf_nal, netnum);
+        return nf;
+}
+
+__u32
+libcfs_str2net(char *str)
+{
+        __u32  net;
+        
+        if (libcfs_str2net_internal(str, &net) != NULL)
+                return net;
+        
+        return PTL_NIDNET(PTL_NID_ANY);
+}
+
+ptl_nid_t
+libcfs_str2nid(char *str)
+{
+        char           *sep = strchr(str, '@');
+        struct nalstrfns *nf;
+        int             nob;
+        __u32           net;
+        __u32           addr;
 
-                if (strlen(sep + 1) == nob)
-                        net = 0;
-                else if (nettype->type == LONAL || /* net number not allowed */
-                        sscanf(sep + 1 + nob, "%u%n", &net, &i) < 1 ||
-                         i != strlen(sep + 1 + nob) ||
-                         (net & ~0xffff) != 0)
+        if (sep != NULL) {
+                nf = libcfs_str2net_internal(sep + 1, &net);
+                if (nf == NULL)
                         return PTL_NID_ANY;
+        } else {
+                sep = str + strlen(str);
+                net = PTL_MKNET(SOCKNAL, 0);
+                nf = libcfs_nal2nalstrfns(SOCKNAL);
+                LASSERT (nf != NULL);
         }
-        
-        if (!nettype->str2addr(str, sep - str, &addr))
+
+        if (!nf->nf_str2addr(str, sep - str, &addr))
                 return PTL_NID_ANY;
         
-        return (((__u64)((nettype->type<<16)|net))<<32)|addr;
+        return PTL_MKNID(net, addr);
 }
 #else  /* CRAY_PORTALS */
 int
-libcfs_isknown_nettype(int type)
+libcfs_isknown_nal(int nal)
 {
         return 1;
 }
 
 char *
-libcfs_nettype2str(int type)
+libcfs_nal2str(int nal)
+{
+        return "cray";
+}
+
+int
+libcfs_str2nal(char *str)
+{
+        return 0;
+}
+
+char *
+libcfs_net2str(__u32 net)
 {
         return "cray";
 }
@@ -279,6 +402,12 @@ libcfs_nid2str(ptl_nid_t nid)
        snprintf(str, PTL_NALFMT_SIZE, "%llx", (unsigned long long)nid);
 }
 
+__u32
+libcfs_str2net(char *str)
+{
+        return 0;
+}
+
 ptl_nid_t
 libcfs_str2nid(char *str)
 {
@@ -318,7 +447,26 @@ libcfs_id2str(ptl_process_id_t id)
         return str;
 }
 
-EXPORT_SYMBOL(libcfs_isknown_nettype);
-EXPORT_SYMBOL(libcfs_nettype2str);
+int
+libcfs_str2anynid(ptl_nid_t *nidp, char *str)
+{
+        if (!strcmp(str, "*")) {
+                *nidp = PTL_NID_ANY;
+                return 1;
+        }
+
+        *nidp = libcfs_str2nid(str);
+        return *nidp != PTL_NID_ANY;
+}
+
+#ifdef __KERNEL__
+EXPORT_SYMBOL(libcfs_isknown_nal);
+EXPORT_SYMBOL(libcfs_nal2str);
+EXPORT_SYMBOL(libcfs_str2nal);
+EXPORT_SYMBOL(libcfs_net2str);
 EXPORT_SYMBOL(libcfs_nid2str);
+EXPORT_SYMBOL(libcfs_str2net);
+EXPORT_SYMBOL(libcfs_str2nid);
 EXPORT_SYMBOL(libcfs_id2str);
+EXPORT_SYMBOL(libcfs_str2anynid);
+#endif
index 0fed502..3c00d77 100644 (file)
@@ -1,6 +1,18 @@
 MODULES := portals
+
+router_objs := $(ROUTER)r_router.o
+router_objs += $(ROUTER)r_proc.o
+
 portals-objs := api-errno.o api-ni.o
 portals-objs += lib-me.o lib-msg.o lib-eq.o lib-md.o
 portals-objs += lib-move.o module.o
+portals-objs += $(router_objs)
+
+default: all
+
+r_%.c:  ../router/%.c
+       ln -sf $< $@
+
+EXTRA_PRE_CFLAGS := -I../router
 
 @INCLUDE_RULES@
index 4b0a891..c73068a 100644 (file)
@@ -166,11 +166,11 @@ ptl_register_nal (ptl_nal_t *nal)
         ptl_mutex_enter();
 
         LASSERT (ptl_init);
-        LASSERT (libcfs_isknown_nettype(nal->nal_type));
+        LASSERT (libcfs_isknown_nal(nal->nal_type));
         LASSERT (ptl_find_nal_by_type(nal->nal_type) == NULL);
         
         list_add (&nal->nal_list, &ptl_nal_table);
-        nal->nal_refcount = 0;
+        atomic_set(&nal->nal_refcount, 0);
 
         ptl_mutex_exit();
 }
@@ -182,7 +182,7 @@ ptl_unregister_nal (ptl_nal_t *nal)
 
         LASSERT (ptl_init);
         LASSERT (ptl_find_nal_by_type(nal->nal_type) == nal);
-        LASSERT (nal->nal_refcount == 0);
+        LASSERT (atomic_read(&nal->nal_refcount) == 0);
         
         list_del (&nal->nal_list);
 
@@ -409,9 +409,9 @@ ptl_invalidate_handle (ptl_libhandle_t *lh)
 }
 
 int
-ptl_startup_apini(ptl_pid_t requested_pid,
-                  ptl_ni_limits_t *requested_limits,
-                  ptl_ni_limits_t *actual_limits)
+ptl_apini_init(ptl_pid_t requested_pid,
+               ptl_ni_limits_t *requested_limits,
+               ptl_ni_limits_t *actual_limits)
 {
         int               rc = PTL_OK;
         int               ptl_size;
@@ -435,6 +435,7 @@ ptl_startup_apini(ptl_pid_t requested_pid,
         CFS_INIT_LIST_HEAD (&ptl_apini.apini_active_eqs);
         CFS_INIT_LIST_HEAD (&ptl_apini.apini_test_peers);
         CFS_INIT_LIST_HEAD (&ptl_apini.apini_nis);
+        CFS_INIT_LIST_HEAD (&ptl_apini.apini_zombie_nis);
 
 #ifdef __KERNEL__
         spin_lock_init (&ptl_apini.apini_lock);
@@ -490,7 +491,7 @@ ptl_startup_apini(ptl_pid_t requested_pid,
 }
 
 int
-ptl_shutdown_apini (void)
+ptl_apini_fini (void)
 {
         int       idx;
         
@@ -499,9 +500,14 @@ ptl_shutdown_apini (void)
          * descriptors, even those that appear committed to a network op (eg MD
          * with non-zero pending count) */
 
+        ptl_fail_nid(PTL_NID_ANY, 0);
+
+        LASSERT (list_empty(&ptl_apini.apini_test_peers));
         LASSERT (ptl_apini.apini_refcount == 0);
         LASSERT (list_empty(&ptl_apini.apini_nis));
-
+        LASSERT (list_empty(&ptl_apini.apini_zombie_nis));
+        LASSERT (ptl_apini.apini_nzombie_nis == 0);
+               
         for (idx = 0; idx < ptl_apini.apini_nportals; idx++)
                 while (!list_empty (&ptl_apini.apini_portals[idx])) {
                         ptl_me_t *me = list_entry (ptl_apini.apini_portals[idx].next,
@@ -553,24 +559,103 @@ ptl_shutdown_apini (void)
         return (PTL_OK);
 }
 
+ptl_ni_t  *
+ptl_net2ni (__u32 net)
+{
+        struct list_head *tmp;
+        ptl_ni_t         *ni;
+        unsigned long     flags;
+
+        PTL_LOCK(flags);
+        list_for_each (tmp, &ptl_apini.apini_nis) {
+                ni = list_entry(tmp, ptl_ni_t, ni_list);
+
+                if (PTL_NIDNET(ni->ni_nid) == net) {
+                        ptl_ni_addref(ni);
+                        PTL_UNLOCK(flags);
+                        return ni;
+                }
+        }
+        
+        PTL_UNLOCK(flags);
+        return NULL;
+}
+
+void
+ptl_queue_zombie_ni (ptl_ni_t *ni)
+{
+        unsigned long flags;
+
+        LASSERT (atomic_read(&ni->ni_refcount) == 0);
+        LASSERT (ptl_init);
+        
+        PTL_LOCK(flags);
+        list_add_tail(&ni->ni_list, &ptl_apini.apini_zombie_nis);
+        PTL_UNLOCK(flags);
+}
+
 void
 ptl_shutdown_nalnis (void)
 {
+        int                i;
         ptl_ni_t          *ni;
+        ptl_nal_t         *nal;
         struct list_head  *tmp;
         struct list_head  *nxt;
+        unsigned long      flags;
+
+        /* NB called holding the global mutex */
 
         /* All quiet on the API front */
         LASSERT (ptl_apini.apini_refcount == 0);
-        
-        list_for_each_safe (tmp, nxt, &ptl_apini.apini_nis) {
-                ni = list_entry(tmp, ptl_ni_t, ni_list);
+        LASSERT (list_empty(&ptl_apini.apini_zombie_nis));
+        LASSERT (ptl_apini.apini_nzombie_nis == 0);
 
-                (ni->ni_nal->nal_shutdown)(ni);
-                ni->ni_nal->nal_refcount--;
+        /* First unlink the NIs from the global list and drop its ref.  When
+         * the last ref goes, the NI is queued on apini_zombie_nis....*/
+
+        PTL_LOCK(flags);
+        while (!list_empty(&ptl_apini.apini_nis)) {
+                ni = list_entry(ptl_apini.apini_nis.next, 
+                                ptl_ni_t, ni_list);
                 list_del (&ni->ni_list);
 
+                ni->ni_shutdown = 1;
+                ptl_ni_decref(ni); /* drop apini's ref (shutdown on last ref) */
+                ptl_apini.apini_nzombie_nis++;
+        }
+        PTL_UNLOCK(flags);
+
+        PTL_LOCK(flags);
+
+        /* Now wait for the NI's I just nuked to show up on apini_zombie_nis
+         * and shut them down in guaranteed thread context */
+        i = 2;
+        while (ptl_apini.apini_nzombie_nis != 0) {
+
+                while (list_empty(&ptl_apini.apini_zombie_nis)) {
+                        PTL_UNLOCK(flags);
+                        ++i;
+                        if ((i & (-i)) == i)
+                                CDEBUG(D_WARNING,"Waiting for %d zombie NIs\n",
+                                       ptl_apini.apini_nzombie_nis);
+                        set_current_state(TASK_UNINTERRUPTIBLE);
+                        schedule_timeout(cfs_time_seconds(1));
+                        PTL_LOCK(flags);
+                }
+
+                ni = list_entry(ptl_apini.apini_zombie_nis.next,
+                                ptl_ni_t, ni_list);
+
+                PTL_UNLOCK(flags);
+
+                LASSERT (!in_interrupt());
+                atomic_dec(&ni->ni_nal->nal_refcount);
+                (ni->ni_nal->nal_shutdown)(ni);
                 PORTAL_FREE(ni, sizeof(*ni));
+
+                PTL_LOCK(flags);
+                ptl_apini.apini_nzombie_nis--;
         }
 }
 
@@ -579,9 +664,12 @@ ptl_startup_nalnis (void)
 {
         ptl_nal_t         *nal;
         ptl_ni_t          *ni;
+        ptl_ni_t          *ni2;
         struct list_head  *tmp;
+        struct list_head  *tmp2;
         ptl_err_t          rc = PTL_OK;
         char              *interface = NULL;
+        unsigned long      flags;
         
         list_for_each (tmp, &ptl_nal_table) {
                 nal = list_entry(tmp, ptl_nal_t, nal_list);
@@ -589,25 +677,29 @@ ptl_startup_nalnis (void)
                 PORTAL_ALLOC(ni, sizeof(*ni));
                 if (ni == NULL) {
                         CERROR("Can't allocate NI for %s NAL\n", 
-                               libcfs_nettype2str(nal->nal_type));
+                               libcfs_nal2str(nal->nal_type));
                         rc = PTL_FAIL;
                         break;
                 }
 
                 ni->ni_nal = nal;
-                //                ni->ni_nid = (nal->nal_type << 16)
-                nal->nal_refcount++;
+                ni->ni_nid = PTL_MKNID(PTL_MKNET(nal->nal_type, 0), 0);
+                /* for now */
+
+                atomic_inc(&nal->nal_refcount);
 
                 rc = (nal->nal_startup)(ni, &interface);
                 if (rc != PTL_OK) {
                         CERROR("Error %d staring up NI %s\n",
-                               rc, libcfs_nettype2str(nal->nal_type));
+                               rc, libcfs_nal2str(nal->nal_type));
                         PORTAL_FREE(ni, sizeof(*ni));
-                        nal->nal_refcount--;
+                        atomic_dec(&nal->nal_refcount);
                         break;
                 }
 
-                list_add(&ni->ni_list, &ptl_apini.apini_nis);
+                PTL_LOCK(flags);
+                list_add_tail(&ni->ni_list, &ptl_apini.apini_nis);
+                PTL_UNLOCK(flags);
         }
  
         if (rc != PTL_OK)
@@ -681,14 +773,15 @@ PtlNIInit(ptl_interface_t interface, ptl_pid_t requested_pid,
                 goto out;
         }
 
-        rc = ptl_startup_apini(requested_pid, 
-                               requested_limits, actual_limits);
+        rc = ptl_apini_init(requested_pid, requested_limits, actual_limits);
         if (rc != PTL_OK)
                 goto out;
 
+        kpr_initialise();
+        
         rc = ptl_startup_nalnis();
         if (rc != PTL_OK) {
-                ptl_shutdown_apini();
+                ptl_apini_fini();
                 goto out;
         }
 
@@ -715,13 +808,78 @@ PtlNIFini(ptl_handle_ni_t ni)
         ptl_apini.apini_refcount--;
         if (ptl_apini.apini_refcount == 0) {
                 ptl_shutdown_nalnis();
-                ptl_shutdown_apini();
+                kpr_finalise();
+                ptl_apini_fini();
         }
 
         ptl_mutex_exit ();
         return PTL_OK;
 }
 
+int
+PtlNICtl(ptl_handle_ni_t nih, unsigned int cmd, void *arg)
+{
+        struct portal_ioctl_data *data = arg;
+        struct list_head         *tmp;
+        ptl_ni_t                 *ni;
+        int                       rc;
+        unsigned long             flags;
+        int                       count;
+
+        ptl_mutex_enter ();
+        
+        LASSERT (ptl_init);
+        LASSERT (ptl_apini.apini_refcount > 0);
+
+        switch (cmd) {
+        case IOC_PORTAL_GET_NI:
+                count = data->ioc_count;
+                data->ioc_nid = PTL_NID_ANY;
+                rc = -ENOENT;
+
+                PTL_LOCK(flags);
+                list_for_each (tmp, &ptl_apini.apini_nis) {
+                        if (count-- != 0)
+                                continue;
+         
+                        ni = list_entry(tmp, ptl_ni_t, ni_list);
+                        data->ioc_nid = ni->ni_nid;
+                        rc = 0;
+                        break;
+                }
+                PTL_UNLOCK(flags);
+                break;
+
+        case IOC_PORTAL_FAIL_NID:
+                rc = ptl_fail_nid(data->ioc_nid, data->ioc_count);
+                break;
+                
+        case IOC_PORTAL_ADD_ROUTE:
+        case IOC_PORTAL_DEL_ROUTE:
+        case IOC_PORTAL_GET_ROUTE:
+        case IOC_PORTAL_NOTIFY_ROUTER:
+                rc = kpr_ctl(cmd, arg);
+                break;
+
+        default:
+                ni = ptl_net2ni(data->ioc_net);
+                if (ni == NULL) {
+                        rc = -EINVAL;
+                } else {
+                        if (ni->ni_nal->nal_ctl == NULL)
+                                rc = -EINVAL;
+                        else
+                                rc = ni->ni_nal->nal_ctl(ni, cmd, arg);
+
+                        ptl_ni_decref(ni);
+                }
+                break;
+        }
+        
+        ptl_mutex_exit();
+        return rc;
+}
+
 ptl_err_t
 PtlGetId(ptl_handle_ni_t ni_handle, ptl_process_id_t *id)
 {
index 8af6fee..2eb95de 100644 (file)
@@ -1,6 +1,7 @@
 my_sources =    api-errno.c api-ni.c \
                lib-me.c lib-msg.c lib-eq.c \
-               lib-md.c lib-move.c
+               lib-md.c lib-move. \
+               $(top_srcdir)/portals/router/router.c
 
 if !CRAY_PORTALS
 
index 7a708b6..6c48234 100644 (file)
@@ -39,8 +39,7 @@ static ptl_err_t do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr,
                               void *private, int loopback);
 
 static ptl_libmd_t *
-ptl_match_md(int index, int op_mask,
-             ptl_nid_t src_nid, ptl_pid_t src_pid,
+ptl_match_md(int index, int op_mask, ptl_process_id_t src,
              ptl_size_t rlength, ptl_size_t roffset,
              ptl_match_bits_t match_bits, ptl_msg_t *msg,
              ptl_size_t *mlength_out, ptl_size_t *offset_out)
@@ -53,8 +52,8 @@ ptl_match_md(int index, int op_mask,
         ptl_size_t        offset;
         ENTRY;
 
-        CDEBUG (D_NET, "Request from "LPX64".%d of length %d into portal %d "
-                "MB="LPX64"\n", src_nid, src_pid, rlength, index, match_bits);
+        CDEBUG (D_NET, "Request from %s of length %d into portal %d "
+                "MB="LPX64"\n", libcfs_id2str(src), rlength, index, match_bits);
 
         if (index < 0 || index >= ptl_apini.apini_nportals) {
                 CERROR("Invalid portal %d not in [0-%d]\n",
@@ -82,14 +81,11 @@ ptl_match_md(int index, int op_mask,
 
                 /* mismatched ME nid/pid? */
                 if (me->me_match_id.nid != PTL_NID_ANY &&
-                    me->me_match_id.nid != src_nid)
+                    me->me_match_id.nid != src.nid)
                         continue;
 
-                CDEBUG(D_NET, "match_id.pid [%x], src_pid [%x]\n",
-                       me->me_match_id.pid, src_pid);
-
                 if (me->me_match_id.pid != PTL_PID_ANY &&
-                    me->me_match_id.pid != src_pid)
+                    me->me_match_id.pid != src.pid)
                         continue;
 
                 /* mismatched ME matchbits? */
@@ -121,18 +117,17 @@ ptl_match_md(int index, int op_mask,
                 }
 
                 /* Commit to this ME/MD */
-                CDEBUG(D_NET, "Incoming %s index %x from "LPX64"/%u of "
+                CDEBUG(D_NET, "Incoming %s index %x from %s of "
                        "length %d/%d into md "LPX64" [%d] + %d\n",
                        (op_mask == PTL_MD_OP_PUT) ? "put" : "get",
-                       index, src_nid, src_pid, mlength, rlength,
+                       index, libcfs_id2str(src), mlength, rlength,
                        md->md_lh.lh_cookie, md->md_niov, offset);
 
                 ptl_commit_md(md, msg);
                 md->md_offset = offset + mlength;
 
                 /* NB Caller sets ev.type and ev.hdr_data */
-                msg->msg_ev.initiator.nid = src_nid;
-                msg->msg_ev.initiator.pid = src_pid;
+                msg->msg_ev.initiator = src;
                 msg->msg_ev.pt_index = index;
                 msg->msg_ev.match_bits = match_bits;
                 msg->msg_ev.rlength = rlength;
@@ -156,16 +151,15 @@ ptl_match_md(int index, int op_mask,
         }
 
  failed:
-        CERROR ("Dropping %s from "LPX64".%d portal %d match "LPX64
+        CERROR ("Dropping %s from %s portal %d match "LPX64
                 " offset %d length %d: no match\n",
                 (op_mask == PTL_MD_OP_GET) ? "GET" : "PUT",
-                src_nid, src_pid, index, match_bits, roffset, rlength);
+                libcfs_id2str(src), index, match_bits, roffset, rlength);
         RETURN(NULL);
 }
 
 ptl_err_t
-PtlFailNid (ptl_handle_ni_t interface, 
-            ptl_nid_t nid, unsigned int threshold)
+ptl_fail_nid (ptl_nid_t nid, unsigned int threshold)
 {
         ptl_test_peer_t   *tp;
         unsigned long      flags;
@@ -693,9 +687,6 @@ ptl_lo_txkiov (ptl_ni_t     *ni,
                void         *private,
                ptl_msg_t    *libmsg,
                ptl_hdr_t    *hdr,
-               int           type,
-               ptl_nid_t     nid,
-               ptl_pid_t     pid,
                unsigned int  payload_niov,
                ptl_kiov_t   *payload_kiov,
                size_t        payload_offset,
@@ -790,9 +781,6 @@ ptl_lo_txiov (ptl_ni_t     *ni,
               void         *private,
               ptl_msg_t    *libmsg,
               ptl_hdr_t    *hdr,
-              int           type,
-              ptl_nid_t     nid,
-              ptl_pid_t     pid,
               unsigned int  payload_niov,
               struct iovec *payload_iov,
               size_t        payload_offset,
@@ -853,49 +841,82 @@ ptl_recv (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_libmd_t *md,
 
 ptl_err_t
 ptl_send (ptl_ni_t *ni, void *private, ptl_msg_t *msg,
-          ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid,
+          ptl_hdr_t *hdr, int type, ptl_process_id_t target,
           ptl_libmd_t *md, ptl_size_t offset, ptl_size_t len)
 {
-        int loopback = (nid == ni->ni_nid);
+        ptl_nid_t gw_nid;
+        int       routing;
+        int       loopback;
+        ptl_err_t rc;
+
+        /* CAVEAT EMPTOR! ni != NULL == interface pre-determined (ACK) */
+
+        gw_nid = kpr_lookup (&ni, target.nid, sizeof(*hdr) + len);
+        if (gw_nid == PTL_NID_ANY) {
+                CERROR("No route to %s\n", libcfs_id2str(target));
+                return PTL_FAIL;
+        }
+
+        routing = (gw_nid != ni->ni_nid);       /* gateway will forward */
+        loopback = (target.nid == ni->ni_nid);  /* it's for me! */
+
+        if (routing && loopback) {              /* very strange */
+                CERROR("Inconsistent route table: target %s gw %s ni %s\n",
+                       libcfs_id2str(target), libcfs_nid2str(gw_nid), 
+                       libcfs_nid2str(ni->ni_nid));
+                rc = PTL_FAIL;
+                goto out;
+        }
+
+        hdr->type           = cpu_to_le32(type);
+        hdr->dest_nid       = cpu_to_le64(target.nid);
+        hdr->dest_pid       = cpu_to_le32(target.pid);
+        hdr->src_nid        = cpu_to_le64(ni->ni_nid);
+        hdr->src_pid        = cpu_to_le64(ptl_apini.apini_pid);
+        hdr->payload_length = cpu_to_le32(len);
 
+        /* set the completion event's initiator.nid now we know it */
+        if (type == PTL_MSG_PUT || type == PTL_MSG_GET)
+                msg->msg_ev.initiator.nid = ni->ni_nid;
+                
+        if (routing)
+                target.nid = gw_nid;
+        
         if (len == 0) {
                 if (loopback)
-                        return ptl_lo_txiov(ni, private, msg,
-                                            hdr, type, nid, pid,
-                                            0, NULL,
-                                            offset, len);
+                        rc = ptl_lo_txiov(ni, private, msg, hdr,
+                                          0, NULL, offset, len);
                 else
-                        return (ni->ni_nal->nal_send)(ni, private, msg,
-                                                      hdr, type, nid, pid,
-                                                      0, NULL,
-                                                      offset, len);
-        }
-
-        if ((md->md_options & PTL_MD_KIOV) == 0) {
+                        rc = (ni->ni_nal->nal_send)(ni, private, msg, hdr, 
+                                                    type, target, routing,
+                                                    0, NULL, offset, len);
+        } else if ((md->md_options & PTL_MD_KIOV) == 0) {
                 if (loopback)
-                        return ptl_lo_txiov(ni, private, msg,
-                                            hdr, type, nid, pid,
-                                            md->md_niov, md->md_iov.iov,
+                        rc = ptl_lo_txiov(ni, private, msg, hdr, 
+                                          md->md_niov, md->md_iov.iov,
+                                          offset, len);
+                else
+                        rc = (ni->ni_nal->nal_send)
+                                     (ni, private, msg, hdr, 
+                                      type, target, routing,
+                                      md->md_niov, md->md_iov.iov,
+                                      offset, len);
+        } else {
+                if (loopback)
+                        rc =  ptl_lo_txkiov(ni, private, msg, hdr, 
+                                            md->md_niov, md->md_iov.kiov,
                                             offset, len);
                 else
-                        return (ni->ni_nal->nal_send)(ni, private, msg,
-                                                      hdr, type, nid, pid,
-                                                      md->md_niov,
-                                                      md->md_iov.iov,
-                                                      offset, len);
+                        rc = (ni->ni_nal->nal_send_pages)
+                                     (ni, private, msg, hdr, 
+                                      type, target, routing,
+                                      md->md_niov, md->md_iov.kiov,
+                                      offset, len);
         }
 
-        if (loopback)
-                return ptl_lo_txkiov(ni, private, msg,
-                                     hdr, type, nid, pid,
-                                     md->md_niov, md->md_iov.kiov,
-                                     offset, len);
-        else
-                return (ni->ni_nal->nal_send_pages)(ni, private, msg,
-                                                    hdr, type, nid, pid,
-                                                    md->md_niov, 
-                                                    md->md_iov.kiov,
-                                                    offset, len);
+ out:
+        ptl_ni_decref(ni);                      /* lose ref from kpr_lookup */
+        return rc;
 }
 
 static void
@@ -955,6 +976,8 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
 {
         ptl_size_t       mlength = 0;
         ptl_size_t       offset = 0;
+        ptl_process_id_t src = {.nid = hdr->src_nid,
+                                .pid = hdr->src_pid};
         ptl_err_t        rc;
         ptl_libmd_t     *md;
         unsigned long    flags;
@@ -966,8 +989,7 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
 
         PTL_LOCK(flags);
 
-        md = ptl_match_md(hdr->msg.put.ptl_index, PTL_MD_OP_PUT,
-                          hdr->src_nid, hdr->src_pid,
+        md = ptl_match_md(hdr->msg.put.ptl_index, PTL_MD_OP_PUT, src,
                           hdr->payload_length, hdr->msg.put.offset,
                           hdr->msg.put.match_bits, msg,
                           &mlength, &offset);
@@ -997,8 +1019,8 @@ ptl_parse_put(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
                               hdr->payload_length);
 
         if (rc != PTL_OK)
-                CERROR(LPX64": error on receiving PUT from "LPX64": %d\n",
-                       ni->ni_nid, hdr->src_nid, rc);
+                CERROR("%s: error on receiving PUT from %s: %d\n",
+                       libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
 
         return (rc);
 }
@@ -1009,6 +1031,8 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
 {
         ptl_size_t       mlength = 0;
         ptl_size_t       offset = 0;
+        ptl_process_id_t src = {.nid = hdr->src_nid,
+                                .pid = hdr->src_pid};
         ptl_libmd_t     *md;
         ptl_hdr_t        reply;
         unsigned long    flags;
@@ -1022,8 +1046,7 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
 
         PTL_LOCK(flags);
 
-        md = ptl_match_md(hdr->msg.get.ptl_index, PTL_MD_OP_GET,
-                          hdr->src_nid, hdr->src_pid,
+        md = ptl_match_md(hdr->msg.get.ptl_index, PTL_MD_OP_GET, src,
                           hdr->msg.get.sink_length, hdr->msg.get.src_offset,
                           hdr->msg.get.match_bits, msg,
                           &mlength, &offset);
@@ -1041,23 +1064,16 @@ ptl_parse_get(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
         PTL_UNLOCK(flags);
 
         memset (&reply, 0, sizeof (reply));
-        reply.type     = cpu_to_le32(PTL_MSG_REPLY);
-        reply.dest_nid = cpu_to_le64(hdr->src_nid);
-        reply.dest_pid = cpu_to_le32(hdr->src_pid);
-        reply.src_nid  = cpu_to_le64(ni->ni_nid);
-        reply.src_pid  = cpu_to_le32(ptl_apini.apini_pid);
-        reply.payload_length = cpu_to_le32(mlength);
-
         reply.msg.reply.dst_wmd = hdr->msg.get.return_wmd;
 
         /* NB call ptl_send() _BEFORE_ ptl_recv() completes the incoming
          * message.  Some NALs _require_ this to implement optimized GET */
 
-        rc = ptl_send (ni, private, msg, &reply, PTL_MSG_REPLY,
-                       hdr->src_nid, hdr->src_pid, md, offset, mlength);
+        rc = ptl_send (ni, private, msg, &reply, PTL_MSG_REPLY, src,
+                       md, offset, mlength);
         if (rc != PTL_OK)
-                CERROR(LPX64": Unable to send REPLY for GET from "LPX64": %d\n",
-                       ni->ni_nid, hdr->src_nid, rc);
+                CERROR("%s: Unable to send REPLY for GET from %s: %d\n",
+                       libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
 
         /* Discard any junk after the hdr */
         if (!loopback)
@@ -1071,6 +1087,8 @@ static ptl_err_t
 ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
                 ptl_msg_t *msg, int loopback)
 {
+        ptl_process_id_t src = {.nid = hdr->src_nid,
+                                .pid = hdr->src_pid};
         ptl_libmd_t     *md;
         int              rlength;
         int              length;
@@ -1082,8 +1100,9 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
         /* NB handles only looked up by creator (no flips) */
         md = ptl_wire_handle2md(&hdr->msg.reply.dst_wmd);
         if (md == NULL || md->md_threshold == 0) {
-                CERROR (LPX64": Dropping REPLY from "LPX64" for %s MD "
-                        LPX64"."LPX64"\n", ni->ni_nid, hdr->src_nid,
+                CERROR ("%s: Dropping REPLY from %s for %s "
+                        "MD "LPX64"."LPX64"\n", 
+                        libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
                         (md == NULL) ? "invalid" : "inactive",
                         hdr->msg.reply.dst_wmd.wh_interface_cookie,
                         hdr->msg.reply.dst_wmd.wh_object_cookie);
@@ -1098,10 +1117,10 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
 
         if (length > md->md_length) {
                 if ((md->md_options & PTL_MD_TRUNCATE) == 0) {
-                        CERROR (LPX64": Dropping REPLY from "LPX64
-                                " length %d for MD "LPX64" would overflow (%d)\n",
-                                ni->ni_nid, hdr->src_nid, length,
-                                hdr->msg.reply.dst_wmd.wh_object_cookie,
+                        CERROR ("%s: Dropping REPLY from %s length %d "
+                                "for MD "LPX64" would overflow (%d)\n",
+                                libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
+                                length, hdr->msg.reply.dst_wmd.wh_object_cookie,
                                 md->md_length);
                         PTL_UNLOCK(flags);
                         return (PTL_FAIL);
@@ -1109,16 +1128,14 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
                 length = md->md_length;
         }
 
-        CDEBUG(D_NET, LPX64": Reply from "LPX64
-               " of length %d/%d into md "LPX64"\n",
-               ni->ni_nid, hdr->src_nid, length, rlength,
-               hdr->msg.reply.dst_wmd.wh_object_cookie);
+        CDEBUG(D_NET, "%s: Reply from %s of length %d/%d into md "LPX64"\n",
+               libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), 
+               length, rlength, hdr->msg.reply.dst_wmd.wh_object_cookie);
 
         ptl_commit_md(md, msg);
 
         msg->msg_ev.type = PTL_EVENT_REPLY_END;
-        msg->msg_ev.initiator.nid = hdr->src_nid;
-        msg->msg_ev.initiator.pid = hdr->src_pid;
+        msg->msg_ev.initiator = src;
         msg->msg_ev.rlength = rlength;
         msg->msg_ev.mlength = length;
         msg->msg_ev.offset = 0;
@@ -1137,8 +1154,8 @@ ptl_parse_reply(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
                 rc = ptl_recv(ni, private, msg, md, 0, length, rlength);
 
         if (rc != PTL_OK)
-                CERROR(LPX64": error on receiving REPLY from "LPX64": %d\n",
-                       ni->ni_nid, hdr->src_nid, rc);
+                CERROR("%s: error on receiving REPLY from %s: %d\n",
+                       libcfs_nid2str(ni->ni_nid), libcfs_id2str(src), rc);
 
         return (rc);
 }
@@ -1147,8 +1164,10 @@ static ptl_err_t
 ptl_parse_ack(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, 
               ptl_msg_t *msg, int loopback)
 {
-        ptl_libmd_t   *md;
-        unsigned long  flags;
+        ptl_process_id_t src = {.nid = hdr->src_nid,
+                                .pid = hdr->src_pid};
+        ptl_libmd_t     *md;
+        unsigned long    flags;
 
         /* Convert ack fields to host byte order */
         hdr->msg.ack.match_bits = le64_to_cpu(hdr->msg.ack.match_bits);
@@ -1159,25 +1178,24 @@ ptl_parse_ack(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private,
         /* NB handles only looked up by creator (no flips) */
         md = ptl_wire_handle2md(&hdr->msg.ack.dst_wmd);
         if (md == NULL || md->md_threshold == 0) {
-                CERROR (LPX64": Dropping ACK from "LPX64" to %s MD "
-                       LPX64"."LPX64"\n", ni->ni_nid, hdr->src_nid,
-                       (md == NULL) ? "invalid" : "inactive",
-                       hdr->msg.ack.dst_wmd.wh_interface_cookie,
-                       hdr->msg.ack.dst_wmd.wh_object_cookie);
+                CERROR ("%s: Dropping ACK from %s to %s MD "LPX64"."LPX64"\n",
+                        libcfs_nid2str(ni->ni_nid), libcfs_id2str(src),
+                        (md == NULL) ? "invalid" : "inactive",
+                        hdr->msg.ack.dst_wmd.wh_interface_cookie,
+                        hdr->msg.ack.dst_wmd.wh_object_cookie);
 
                 PTL_UNLOCK(flags);
                 return (PTL_FAIL);
         }
 
-        CDEBUG(D_NET, LPX64": ACK from "LPX64" into md "LPX64"\n",
-               ni->ni_nid, hdr->src_nid
+        CDEBUG(D_NET, "%s: ACK from %s into md "LPX64"\n",
+               libcfs_nid2str(ni->ni_nid), libcfs_id2str(src)
                hdr->msg.ack.dst_wmd.wh_object_cookie);
 
         ptl_commit_md(md, msg);
 
         msg->msg_ev.type = PTL_EVENT_ACK;
-        msg->msg_ev.initiator.nid = hdr->src_nid;
-        msg->msg_ev.initiator.pid = hdr->src_pid;
+        msg->msg_ev.initiator = src;
         msg->msg_ev.mlength = hdr->msg.ack.mlength;
         msg->msg_ev.match_bits = hdr->msg.ack.match_bits;
 
@@ -1222,11 +1240,15 @@ hdr_type_string (ptl_hdr_t *hdr)
 void
 ptl_print_hdr(ptl_hdr_t * hdr)
 {
+        ptl_process_id_t src = {.nid = hdr->src_nid,
+                                .pid = hdr->src_pid};
+        ptl_process_id_t dst = {.nid = hdr->dest_nid,
+                                .pid = hdr->dest_pid};
         char *type_str = hdr_type_string (hdr);
 
         CWARN("P3 Header at %p of type %s\n", hdr, type_str);
-        CWARN("    From nid/pid "LPX64"/%u", hdr->src_nid, hdr->src_pid);
-        CWARN("    To nid/pid "LPX64"/%u\n", hdr->dest_nid, hdr->dest_pid);
+        CWARN("    From %s\n", libcfs_id2str(src));
+        CWARN("    To   %s\n", libcfs_id2str(dst));
 
         switch (hdr->type) {
         default:
@@ -1310,11 +1332,11 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback)
                 if (mv->magic == PORTALS_PROTO_MAGIC &&
                     mv->version_major == PORTALS_PROTO_VERSION_MAJOR &&
                     mv->version_minor == PORTALS_PROTO_VERSION_MINOR) {
-                        CWARN (LPX64": Dropping unexpected HELLO message: "
-                               "magic %d, version %d.%d from "LPD64"\n",
-                               ni->ni_nid, mv->magic,
+                        CWARN ("%s: Dropping unexpected HELLO message: "
+                               "magic %d, version %d.%d from %s\n",
+                               libcfs_nid2str(ni->ni_nid), mv->magic,
                                mv->version_major, mv->version_minor,
-                               hdr->src_nid);
+                               libcfs_nid2str(hdr->src_nid));
 
                         /* it's good but we don't want it */
                         ptl_drop_message(ni, private, hdr, loopback);
@@ -1322,11 +1344,11 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback)
                 }
 
                 /* we got garbage */
-                CERROR (LPX64": Bad HELLO message: "
-                        "magic %d, version %d.%d from "LPD64"\n",
-                        ni->ni_nid, mv->magic,
+                CERROR ("%s: Bad HELLO message: "
+                        "magic %d, version %d.%d from %s\n",
+                        libcfs_nid2str(ni->ni_nid), mv->magic,
                         mv->version_major, mv->version_minor,
-                        hdr->src_nid);
+                        libcfs_nid2str(hdr->src_nid));
                 return PTL_FAIL;
         }
 
@@ -1336,17 +1358,19 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback)
         case PTL_MSG_REPLY:
                 hdr->dest_nid = le64_to_cpu(hdr->dest_nid);
                 if (hdr->dest_nid != ni->ni_nid) {
-                        CERROR(LPX64": BAD dest NID in %s message from"
-                               LPX64" to "LPX64" (not me)\n",
-                               ni->ni_nid, hdr_type_string(hdr),
-                               hdr->src_nid, hdr->dest_nid);
+                        CERROR("%s: BAD dest NID in %s message from %s to %s"
+                               "(not me)\n", libcfs_nid2str(ni->ni_nid), 
+                               hdr_type_string(hdr), 
+                               libcfs_nid2str(hdr->src_nid),
+                               libcfs_nid2str(hdr->dest_nid));
                         return PTL_FAIL;
                 }
                 break;
 
         default:
-                CERROR(LPX64": Bad message type 0x%x from "LPX64"\n",
-                       ni->ni_nid, hdr->type, hdr->src_nid);
+                CERROR("%s: Bad message type 0x%x from %s\n",
+                       libcfs_nid2str(ni->ni_nid), hdr->type, 
+                       libcfs_nid2str(hdr->src_nid));
                 return PTL_FAIL;
         }
 
@@ -1356,20 +1380,19 @@ do_ptl_parse(ptl_ni_t *ni, ptl_hdr_t *hdr, void *private, int loopback)
         if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
             fail_peer (hdr->src_nid, 0))        /* shall we now? */
         {
-                CERROR(LPX64": Dropping incoming %s from "LPX64
-                       ": simulated failure\n",
-                       ni->ni_nid, hdr_type_string (hdr),
-                       hdr->src_nid);
+                CERROR("%s: Dropping incoming %s from %s: simulated failure\n",
+                       libcfs_nid2str(ni->ni_nid), hdr_type_string (hdr),
+                       libcfs_nid2str(hdr->src_nid));
                 ptl_drop_message(ni, private, hdr, loopback);
                 return PTL_OK;
         }
 
         msg = ptl_msg_alloc();
         if (msg == NULL) {
-                CERROR(LPX64": Dropping incoming %s from "LPX64
-                       "can't allocate a ptl_msg_t\n",
-                       ni->ni_nid, hdr_type_string (hdr),
-                       hdr->src_nid);
+                CERROR("%s: Dropping incoming %s from %s: "
+                       "can't allocate a ptl_msg_t\n",
+                       libcfs_nid2str(ni->ni_nid), hdr_type_string (hdr),
+                       libcfs_nid2str(hdr->src_nid));
                 ptl_drop_message(ni, private, hdr, loopback);
                 return PTL_OK;
         }
@@ -1435,7 +1458,6 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack,
        ptl_ac_index_t ac, ptl_match_bits_t match_bits,
        ptl_size_t offset, ptl_hdr_data_t hdr_data)
 {
-        ptl_ni_t         *ni;
         ptl_msg_t        *msg;
         ptl_hdr_t         hdr;
         ptl_libmd_t      *md;
@@ -1448,48 +1470,33 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack,
         if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
             fail_peer (target.nid, 1))          /* shall we now? */
         {
-                CERROR("Dropping PUT to "LPX64": simulated failure\n",
-                       target.nid);
+                CERROR("Dropping PUT to %s: simulated failure\n",
+                       libcfs_id2str(target));
                 return PTL_PROCESS_INVALID;
         }
 
         msg = ptl_msg_alloc();
         if (msg == NULL) {
-                CERROR("Dropping PUT to "LPX64": ENOMEM on ptl_msg_t\n",
-                       target.nid);
+                CERROR("Dropping PUT to %s: ENOMEM on ptl_msg_t\n",
+                       libcfs_id2str(target));
                 return PTL_NO_SPACE;
         }
 
         PTL_LOCK(flags);
 
-        ni = ptl_nid2ni(target.nid);
-        if (ni == NULL) {
-                ptl_msg_free(msg);
-                PTL_UNLOCK(flags);
-
-                CERROR("Dropping PUT to "LPX64": not reachable\n", target.nid);
-                return PTL_PROCESS_INVALID;
-        }
-        
         md = ptl_handle2md(&mdh);
         if (md == NULL || md->md_threshold == 0) {
                 ptl_msg_free(msg);
                 PTL_UNLOCK(flags);
 
-                CERROR("Dropping PUT to "LPX64": MD invalid\n", target.nid);
+                CERROR("Dropping PUT to %s: MD invalid\n", 
+                       libcfs_id2str(target));
                 return PTL_MD_INVALID;
         }
 
-        CDEBUG(D_NET, LPX64": PtlPut -> "LPX64":%lu\n",
-               ni->ni_nid, target.nid, (unsigned long)target.pid);
+        CDEBUG(D_NET, "PtlPut -> %s\n", libcfs_id2str(target));
 
         memset (&hdr, 0, sizeof (hdr));
-        hdr.type     = cpu_to_le32(PTL_MSG_PUT);
-        hdr.dest_nid = cpu_to_le64(target.nid);
-        hdr.dest_pid = cpu_to_le32(target.pid);
-        hdr.src_nid  = cpu_to_le64(ni->ni_nid);
-        hdr.src_pid  = cpu_to_le32(ptl_apini.apini_pid);
-        hdr.payload_length = cpu_to_le32(md->md_length);
 
         /* NB handles only looked up by creator (no flips) */
         if (ack == PTL_ACK_REQ) {
@@ -1508,7 +1515,7 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack,
         ptl_commit_md(md, msg);
 
         msg->msg_ev.type = PTL_EVENT_SEND_END;
-        msg->msg_ev.initiator.nid = ni->ni_nid;
+        msg->msg_ev.initiator.nid = PTL_NID_ANY;
         msg->msg_ev.initiator.pid = ptl_apini.apini_pid;
         msg->msg_ev.pt_index = portal;
         msg->msg_ev.match_bits = match_bits;
@@ -1525,12 +1532,12 @@ PtlPut(ptl_handle_md_t mdh, ptl_ack_req_t ack,
 
         PTL_UNLOCK(flags);
 
-        rc = ptl_send (ni, NULL, msg, &hdr, PTL_MSG_PUT,
-                       target.nid, target.pid, md, 0, md->md_length);
+        rc = ptl_send (NULL, NULL, msg, &hdr, PTL_MSG_PUT, target, 
+                       md, 0, md->md_length);
         if (rc != PTL_OK) {
-                CERROR(LPX64": Error sending PUT to "LPX64": %d\n",
-                       ni->ni_nid, target.nid, rc);
-                ptl_finalize (ni, NULL, msg, rc);
+                CERROR("Error sending PUT to %s: %d\n",
+                       libcfs_id2str(target), rc);
+                ptl_finalize (NULL, NULL, msg, rc);
         }
 
         /* completion will be signalled by an event */
@@ -1556,21 +1563,22 @@ ptl_create_reply_msg (ptl_ni_t *ni, ptl_nid_t peer_nid, ptl_msg_t *getmsg)
         LASSERT (getmd->md_pending > 0);
 
         if (msg == NULL) {
-                CERROR (LPX64": Dropping REPLY from "LPX64": can't allocate msg\n",
-                        ni->ni_nid, peer_nid);
+                CERROR ("%s: Dropping REPLY from %s: can't allocate msg\n",
+                        libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid));
                 goto drop;
         }
 
         if (getmd->md_threshold == 0) {
-                CERROR (LPX64": Dropping REPLY from "LPX64" for inactive MD %p\n",
-                        ni->ni_nid, peer_nid, getmd);
+                CERROR ("%s: Dropping REPLY from %s for inactive MD %p\n",
+                        libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid), 
+                        getmd);
                 goto drop_msg;
         }
 
         LASSERT (getmd->md_offset == 0);
 
-        CDEBUG(D_NET, LPX64": Reply from "LPX64" md %p\n", 
-               ni->ni_nid, peer_nid, getmd);
+        CDEBUG(D_NET, "%s: Reply from %s md %p\n", 
+               libcfs_nid2str(ni->ni_nid), libcfs_nid2str(peer_nid), getmd);
 
         ptl_commit_md (getmd, msg);
 
@@ -1606,7 +1614,6 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target,
        ptl_pt_index_t portal, ptl_ac_index_t ac,
        ptl_match_bits_t match_bits, ptl_size_t offset)
 {
-        ptl_ni_t         *ni;
         ptl_msg_t        *msg;
         ptl_hdr_t         hdr;
         ptl_libmd_t      *md;
@@ -1619,48 +1626,33 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target,
         if (!list_empty (&ptl_apini.apini_test_peers) && /* normally we don't */
             fail_peer (target.nid, 1))          /* shall we now? */
         {
-                CERROR("Dropping GET to "LPX64": simulated failure\n",
-                       target.nid);
+                CERROR("Dropping GET to %s: simulated failure\n",
+                       libcfs_id2str(target));
                 return PTL_PROCESS_INVALID;
         }
 
         msg = ptl_msg_alloc();
         if (msg == NULL) {
-                CERROR("Dropping GET to "LPX64": ENOMEM on ptl_msg_t\n",
-                       target.nid);
+                CERROR("Dropping GET to %s: ENOMEM on ptl_msg_t\n",
+                       libcfs_id2str(target));
                 return PTL_NO_SPACE;
         }
 
         PTL_LOCK(flags);
 
-        ni = ptl_nid2ni(target.nid);
-        if (ni == NULL) {
-                ptl_msg_free(msg);
-                PTL_UNLOCK(flags);
-
-                CERROR("Dropping GET to "LPX64": not reachable\n", target.nid);
-                return PTL_PROCESS_INVALID;
-        }
-
         md = ptl_handle2md(&mdh);
         if (md == NULL || md->md_threshold == 0) {
                 ptl_msg_free(msg);
                 PTL_UNLOCK(flags);
 
-                CERROR("Dropping GET to "LPX64": MD invalid\n", target.nid);
+                CERROR("Dropping GET to %s: MD invalid\n",
+                       libcfs_id2str(target));
                 return PTL_MD_INVALID;
         }
 
-        CDEBUG(D_NET, LPX64": PtlGet -> "LPX64":%lu\n",
-               ni->ni_nid, target.nid, (unsigned long)target.pid);
+        CDEBUG(D_NET, "PtlGet -> %s\n", libcfs_id2str(target));
 
         memset (&hdr, 0, sizeof (hdr));
-        hdr.type     = cpu_to_le32(PTL_MSG_GET);
-        hdr.dest_nid = cpu_to_le64(target.nid);
-        hdr.dest_pid = cpu_to_le32(target.pid);
-        hdr.src_nid  = cpu_to_le64(ni->ni_nid);
-        hdr.src_pid  = cpu_to_le32(ptl_apini.apini_pid);
-        hdr.payload_length = 0;
 
         /* NB handles only looked up by creator (no flips) */
         hdr.msg.get.return_wmd.wh_interface_cookie = 
@@ -1675,7 +1667,7 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target,
         ptl_commit_md(md, msg);
 
         msg->msg_ev.type = PTL_EVENT_SEND_END;
-        msg->msg_ev.initiator.nid = ni->ni_nid;
+        msg->msg_ev.initiator.nid = PTL_NID_ANY;
         msg->msg_ev.initiator.pid = ptl_apini.apini_pid;
         msg->msg_ev.pt_index = portal;
         msg->msg_ev.match_bits = match_bits;
@@ -1691,12 +1683,12 @@ PtlGet(ptl_handle_md_t mdh, ptl_process_id_t target,
 
         PTL_UNLOCK(flags);
 
-        rc = ptl_send (ni, NULL, msg, &hdr, PTL_MSG_GET,
-                       target.nid, target.pid, NULL, 0, 0);
+        rc = ptl_send (NULL, NULL, msg, &hdr, PTL_MSG_GET, target, 
+                       NULL, 0, 0);
         if (rc != PTL_OK) {
-                CERROR(LPX64": error sending GET to "LPX64": %d\n",
-                       ni->ni_nid, target.nid, rc);
-                ptl_finalize (ni, NULL, msg, rc);
+                CERROR("error sending GET to %s: %d\n",
+                       libcfs_id2str(target), rc);
+                ptl_finalize (NULL, NULL, msg, rc);
         }
 
         /* completion will be signalled by an event */
index 667a7cc..edd0ce4 100644 (file)
@@ -84,21 +84,12 @@ ptl_finalize (ptl_ni_t *ni, void *private, ptl_msg_t *msg, ptl_err_t status)
                 LASSERT(msg->msg_ev.type == PTL_EVENT_PUT_END);
 
                 memset (&ack, 0, sizeof (ack));
-                ack.type     = cpu_to_le32(PTL_MSG_ACK);
-                ack.dest_nid = cpu_to_le64(msg->msg_ev.initiator.nid);
-                ack.dest_pid = cpu_to_le32(msg->msg_ev.initiator.pid);
-                ack.src_nid  = cpu_to_le64(ni->ni_nid);
-                ack.src_pid  = cpu_to_le32(ptl_apini.apini_pid);
-                ack.payload_length = 0;
-
                 ack.msg.ack.dst_wmd = msg->msg_ack_wmd;
                 ack.msg.ack.match_bits = msg->msg_ev.match_bits;
                 ack.msg.ack.mlength = cpu_to_le32(msg->msg_ev.mlength);
 
                 rc = ptl_send (ni, private, NULL, &ack, PTL_MSG_ACK,
-                               msg->msg_ev.initiator.nid, 
-                               msg->msg_ev.initiator.pid,
-                               NULL, 0, 0);
+                               msg->msg_ev.initiator, NULL, 0, 0);
                 if (rc != PTL_OK) {
                         /* send failed: there's nothing else to clean up. */
                         CERROR("Error %d sending ACK to "LPX64"\n",
index 56300f7..526183f 100644 (file)
 #define DEBUG_SUBSYSTEM S_PORTALS
 #include <portals/lib-p30.h>
 
-extern void (kping_client)(struct portal_ioctl_data *);
-
-static int kportal_ioctl(struct portal_ioctl_data *data,
-                         unsigned int cmd, unsigned long arg)
+static int kportal_ioctl(unsigned int cmd, struct portal_ioctl_data *data)
 {
-        int err;
-        ENTRY;
-
-        switch (cmd) {
-        case IOC_PORTAL_PING: {
-                void (*ping)(struct portal_ioctl_data *);
-
-                CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n",
-                       data->ioc_count, data->ioc_nid,
-                       libcfs_nid2str(data->ioc_nid));
-                ping = PORTAL_SYMBOL_GET(kping_client);
-                if (!ping)
-                        CERROR("PORTAL_SYMBOL_GET failed\n");
-                else {
-                        ping(data);
-                        PORTAL_SYMBOL_PUT(kping_client);
-                }
-                RETURN(0);
-        }
-
-        case IOC_PORTAL_GET_NID: {
-                ptl_handle_ni_t    nih;
-                ptl_process_id_t   pid;
-
-                CDEBUG (D_IOCTL, "Getting nid for nal [%x]\n", data->ioc_nal);
+        int                rc;
+        ptl_handle_ni_t    nih;
 
-                err = PtlNIInit(data->ioc_nal, LUSTRE_SRV_PTL_PID, NULL,
-                                NULL, &nih);
-                if (!(err == PTL_OK || err == PTL_IFACE_DUP))
-                        RETURN (-EINVAL);
+        rc = PtlNIInit(PTL_IFACE_DEFAULT, LUSTRE_SRV_PTL_PID, 
+                       NULL, NULL, &nih);
+        if (!(rc == PTL_OK || rc == PTL_IFACE_DUP))
+                RETURN (-EINVAL);
 
-                err = PtlGetId (nih, &pid);
-                LASSERT (err == PTL_OK);
+        rc = PtlNICtl(nih, cmd, data);
 
-                PtlNIFini(nih);
-
-                data->ioc_nid = pid.nid;
-                if (copy_to_user ((char *)arg, data, sizeof (*data)))
-                        RETURN (-EFAULT);
-                RETURN(0);
-        }
-
-        case IOC_PORTAL_FAIL_NID: {
-                ptl_handle_ni_t    nih;
-
-                CDEBUG (D_IOCTL, "fail nid: [%d] "LPU64" count %d\n",
-                        data->ioc_nal, data->ioc_nid, data->ioc_count);
-
-                err = PtlNIInit(PTL_IFACE_DEFAULT, LUSTRE_SRV_PTL_PID, NULL,
-                                NULL, &nih);
-                if (!(err == PTL_OK || err == PTL_IFACE_DUP))
-                        return (-EINVAL);
-
-                if (err == PTL_OK) {
-                        /* There's no point in failing an interface that
-                         * came into existance just for this */
-                        err = -EINVAL;
-                } else {
-                        err = PtlFailNid (nih, data->ioc_nid, data->ioc_count);
-                        if (err != PTL_OK)
-                                err = -EINVAL;
-                }
-
-                PtlNIFini(nih);
-                RETURN (err);
-        }
-
-        default:
-                RETURN(-EINVAL);
-        }
-        /* Not Reached */
+        PtlNIFini(nih);
+        return rc;
 }
 
 DECLARE_IOCTL_HANDLER(kportal_ioctl_handler, kportal_ioctl);
index 3bb6cf7..c43bc9f 100644 (file)
@@ -1,4 +1,2 @@
-MODULES := kptlrouter
-kptlrouter-objs := router.o proc.o
 
 @INCLUDE_RULES@
index 08db593..e00d06e 100644 (file)
@@ -3,15 +3,5 @@
 # This code is issued under the GNU General Public License.
 # See the file COPYING in this distribution
 
-if MODULES
-if !CRAY_PORTALS
-
-if LINUX
-modulenet_DATA = kptlrouter$(KMODEXT)
-endif
-
-endif
-endif
-
 MOSTLYCLEANFILES = *.o *.ko *.mod.c
 DIST_SOURCES = $(kptlrouter-objs:%.o=%.c) router.h
index 61b6880..d44ae07 100644 (file)
@@ -143,11 +143,11 @@ static int kpr_proc_routes_read(char *page, char **start, off_t off,
                 re = list_entry(prd->curr, kpr_route_entry_t, kpre_list);
                 ge = re->kpre_gateway;
 
-                line_len = sprintf(page + chunk_len,
-                        "%12s  "LPX64" : "LPX64" - "LPX64", %s\n",
-                        nal2name(ge->kpge_nalid), ge->kpge_nid,
-                        re->kpre_lo_nid, re->kpre_hi_nid,
-                        ge->kpge_alive ? "up" : "down");
+                line_len = sprintf(page + chunk_len, 
+                                   "net %12s: gateway %s %s\n",
+                                   libcfs_net2str(re->kpre_net),
+                                   libcfs_nid2str(ge->kpge_nid),
+                                   ge->kpge_alive ? "up" : "down");
                 chunk_len += line_len;
                 user_len += line_len;
 
index 9d74754..aabd9a0 100644 (file)
@@ -25,7 +25,6 @@
 
 LIST_HEAD(kpr_routes);
 LIST_HEAD(kpr_gateways);
-LIST_HEAD(kpr_nals);
 
 unsigned int       kpr_routes_generation;
 unsigned long long kpr_fwd_bytes;
@@ -39,99 +38,47 @@ atomic_t           kpr_queue_depth;
  * entries (thread context only)... */
 rwlock_t         kpr_rwlock = RW_LOCK_UNLOCKED;
 
-kpr_router_interface_t kpr_router_interface = {
-       kprri_register:         kpr_register_nal,
-       kprri_lookup:           kpr_lookup_target,
-       kprri_fwd_start:        kpr_forward_packet,
-       kprri_fwd_done:         kpr_complete_packet,
-        kprri_notify:           kpr_nal_notify,
-       kprri_shutdown:         kpr_shutdown_nal,
-       kprri_deregister:       kpr_deregister_nal,
-};
-
 int
-kpr_register_nal (kpr_nal_interface_t *nalif, void **argp)
+kpr_routing ()
 {
-       unsigned long      flags;
-       struct list_head  *e;
-       kpr_nal_entry_t   *ne;
-
-        CDEBUG (D_NET, "Registering NAL %x\n", nalif->kprni_nalid);
-
-       PORTAL_ALLOC (ne, sizeof (*ne));
-       if (ne == NULL)
-               return (-ENOMEM);
-
-       memset (ne, 0, sizeof (*ne));
-        memcpy ((void *)&ne->kpne_interface, (void *)nalif, sizeof (*nalif));
-
-       LASSERT (!in_interrupt());
-       write_lock_irqsave (&kpr_rwlock, flags);
-
-       for (e = kpr_nals.next; e != &kpr_nals; e = e->next)
-       {
-               kpr_nal_entry_t *ne2 = list_entry (e, kpr_nal_entry_t, kpne_list);
-
-               if (ne2->kpne_interface.kprni_nalid == ne->kpne_interface.kprni_nalid)
-               {
-                       write_unlock_irqrestore (&kpr_rwlock, flags);
-
-                       CERROR ("Attempt to register same NAL %x twice\n", ne->kpne_interface.kprni_nalid);
-
-                       PORTAL_FREE (ne, sizeof (*ne));
-                       return (-EEXIST);
-               }
-       }
-
-        list_add (&ne->kpne_list, &kpr_nals);
-
-       write_unlock_irqrestore (&kpr_rwlock, flags);
-
-       *argp = ne;
-       PORTAL_MODULE_USE;
-        return (0);
+        return 1;
 }
 
 void
 kpr_do_upcall (void *arg)
 {
         kpr_upcall_t *u = (kpr_upcall_t *)arg;
-        char          nalstr[10];
-        char          nidstr[36];
+        char          nidstr[PTL_NALFMT_SIZE];
         char          whenstr[36];
         char         *argv[] = {
                 NULL,
                 "ROUTER_NOTIFY",
-                nalstr,
                 nidstr,
                 u->kpru_alive ? "up" : "down",
                 whenstr,
                 NULL};
-        
-        snprintf (nalstr, sizeof(nalstr), "%d", u->kpru_nal_id);
-        snprintf (nidstr, sizeof(nidstr), LPX64, u->kpru_nid);
+
+        strcpy(nidstr, libcfs_nid2str(u->kpru_nid));
         snprintf (whenstr, sizeof(whenstr), "%ld", u->kpru_when);
 
         portals_run_upcall (argv);
 
-        kfree (u);
+        PORTAL_FREE(u, sizeof(*u));
 }
 
 void
-kpr_upcall (int gw_nalid, ptl_nid_t gw_nid, int alive, time_t when)
+kpr_upcall (ptl_nid_t gw_nid, int alive, time_t when)
 {
         /* May be in arbitrary context */
-        kpr_upcall_t  *u = kmalloc (sizeof (kpr_upcall_t), GFP_ATOMIC);
+        kpr_upcall_t  *u;
 
+        PORTAL_ALLOC_ATOMIC(u, sizeof(*u));
         if (u == NULL) {
-                CERROR ("Upcall out of memory: nal %x nid "LPX64" (%s) %s\n",
-                        gw_nalid, gw_nid,
-                        libcfs_nid2str(gw_nid),
-                        alive ? "up" : "down");
+                CERROR ("Upcall out of memory: nid %s %s\n",
+                        libcfs_nid2str(gw_nid), alive ? "up" : "down");
                 return;
         }
 
-        u->kpru_nal_id     = gw_nalid;
         u->kpru_nid        = gw_nid;
         u->kpru_alive      = alive;
         u->kpru_when       = when;
@@ -141,35 +88,39 @@ kpr_upcall (int gw_nalid, ptl_nid_t gw_nid, int alive, time_t when)
 }
 
 int
-kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid,
-               int alive, time_t when)
+kpr_notify (ptl_ni_t *ni, ptl_nid_t gateway_nid, int alive, time_t when)
 {
        unsigned long        flags;
         int                  found;
-        kpr_nal_entry_t     *ne = NULL;
         kpr_gateway_entry_t *ge = NULL;
         struct timeval       now;
        struct list_head    *e;
        struct list_head    *n;
 
-        CDEBUG (D_NET, "%s notifying [%x] "LPX64": %s\n", 
-                byNal ? "NAL" : "userspace", 
-                gateway_nalid, gateway_nid, alive ? "up" : "down");
-
+        CDEBUG (D_NET, "%s notifying %s: %s\n", 
+                (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
+                libcfs_nid2str(gateway_nid),
+                alive ? "up" : "down");
+        
+        if (ni != NULL &&
+            PTL_NIDNET(ni->ni_nid) != PTL_NIDNET(gateway_nid)) {
+                CWARN ("Ignoring notification of %s %s by %s (different net)\n",
+                        libcfs_nid2str(gateway_nid), alive ? "birth" : "death",
+                        libcfs_nid2str(ni->ni_nid));
+                return -EINVAL;
+        }
+        
         /* can't do predictions... */
         do_gettimeofday (&now);
         if (when > now.tv_sec) {
-                CWARN ("Ignoring prediction from %s of [%x] "LPX64" %s "
+                CWARN ("Ignoring prediction from %s of %s %s "
                        "%ld seconds in the future\n", 
-                       byNal ? "NAL" : "userspace", 
-                       gateway_nalid, gateway_nid, 
-                       alive ? "up" : "down",
+                       (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
+                       libcfs_nid2str(gateway_nid), alive ? "up" : "down", 
                        when - now.tv_sec);
-                return (EINVAL);
+                return -EINVAL;
         }
 
-        LASSERT (when <= now.tv_sec);
-
         /* Serialise with lookups (i.e. write lock) */
        write_lock_irqsave(&kpr_rwlock, flags);
 
@@ -177,9 +128,7 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid,
         list_for_each_safe (e, n, &kpr_gateways) {
 
                 ge = list_entry(e, kpr_gateway_entry_t, kpge_list);
-                if ((gateway_nalid != 0 &&
-                     ge->kpge_nalid != gateway_nalid) ||
-                    ge->kpge_nid != gateway_nid)
+                if (ge->kpge_nid != gateway_nid)
                         continue;
 
                 found = 1;
@@ -211,7 +160,8 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid,
         }
 
         ge->kpge_alive = alive;
-        CDEBUG(D_NET, "set "LPX64" [%p] %d\n", gateway_nid, ge, alive);
+        CDEBUG(D_NET, "set %s [%p] %d\n", 
+               libcfs_nid2str(gateway_nid), ge, alive);
 
         if (alive) {
                 /* Reset all gateway weights so the newly-enabled gateway
@@ -223,95 +173,24 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid,
                 }
         }
 
-        found = 0;
-        if (!byNal) {
-                /* userland notified me: notify NAL? */
-                ne = kpr_find_nal_entry_locked (ge->kpge_nalid);
-                if (ne != NULL) {
-                        if (!ne->kpne_shutdown &&
-                            ne->kpne_interface.kprni_notify != NULL) {
-                                /* take a ref on this NAL until notifying
-                                 * it has completed... */
-                                atomic_inc (&ne->kpne_refcount);
-                                found = 1;
-                        }
-                }
-        }
-
         write_unlock_irqrestore(&kpr_rwlock, flags);
 
-        if (found) {
-                ne->kpne_interface.kprni_notify (ne->kpne_interface.kprni_arg,
-                                                 gateway_nid, alive);
-                /* 'ne' can disappear now... */
-                atomic_dec (&ne->kpne_refcount);
-        }
-        
-        if (byNal) {
+        if (ni == NULL) {
+                /* userland notified me: notify NAL? */
+                ni = ptl_net2ni(PTL_NIDNET(gateway_nid));
+                if (ni != NULL) {
+                        ni->ni_nal->nal_notify(ni, gateway_nid, alive);
+                        ptl_ni_decref(ni);
+                }
+        } else {
                 /* It wasn't userland that notified me... */
-                CWARN ("Upcall: NAL %x NID "LPX64" (%s) is %s\n",
-                       gateway_nalid, gateway_nid,
+                CWARN ("Upcall: NID %s is %s\n",
                        libcfs_nid2str(gateway_nid),
                        alive ? "alive" : "dead");
-                kpr_upcall (gateway_nalid, gateway_nid, alive, when);
-        } else {
-                CDEBUG (D_NET, " NOT Doing upcall\n");
+                kpr_upcall (gateway_nid, alive, when);
         }
-        
-        return (0);
-}
-
-void
-kpr_nal_notify (void *arg, ptl_nid_t peer, int alive, time_t when)
-{
-        kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
-        
-        kpr_do_notify (1, ne->kpne_interface.kprni_nalid, peer, alive, when);
-}
-
-void
-kpr_shutdown_nal (void *arg)
-{
-       unsigned long    flags;
-       kpr_nal_entry_t *ne = (kpr_nal_entry_t *)arg;
-
-        CDEBUG (D_NET, "Shutting down NAL %x\n", ne->kpne_interface.kprni_nalid);
-
-       LASSERT (!ne->kpne_shutdown);
-       LASSERT (!in_interrupt());
-
-       write_lock_irqsave (&kpr_rwlock, flags);
-       ne->kpne_shutdown = 1;
-       write_unlock_irqrestore (&kpr_rwlock, flags);
-}
-
-void
-kpr_deregister_nal (void *arg)
-{
-       unsigned long     flags;
-       kpr_nal_entry_t  *ne = (kpr_nal_entry_t *)arg;
-
-        CDEBUG (D_NET, "Deregister NAL %x\n", ne->kpne_interface.kprni_nalid);
-
-       LASSERT (ne->kpne_shutdown);            /* caller must have issued shutdown already */
-       LASSERT (!in_interrupt());
-
-       write_lock_irqsave (&kpr_rwlock, flags);
-       list_del (&ne->kpne_list);
-       write_unlock_irqrestore (&kpr_rwlock, flags);
 
-        /* Wait until all outstanding messages/notifications have completed */
-       while (atomic_read (&ne->kpne_refcount) != 0)
-       {
-               CDEBUG (D_NET, "Waiting for refcount on NAL %x to reach zero (%d)\n",
-                       ne->kpne_interface.kprni_nalid, atomic_read (&ne->kpne_refcount));
-
-               set_current_state (TASK_UNINTERRUPTIBLE);
-               schedule_timeout (HZ);
-       }
-
-       PORTAL_FREE (ne, sizeof (*ne));
-        PORTAL_MODULE_UNUSE;
+        return (0);
 }
 
 int
@@ -351,167 +230,185 @@ kpr_update_weight (kpr_gateway_entry_t *ge, int nob)
         atomic_add (weight, &ge->kpge_weight);
 }
 
-int
-kpr_lookup_target (void *arg, ptl_nid_t target_nid, int nob,
-                   ptl_nid_t *gateway_nidp)
+ptl_nid_t
+kpr_lookup (ptl_ni_t **nip, ptl_nid_t target_nid, int nob)
 {
-       kpr_nal_entry_t     *ne = (kpr_nal_entry_t *)arg;
+        ptl_ni_t            *ni = *nip;
+        ptl_nid_t            gwnid;
        struct list_head    *e;
         kpr_route_entry_t   *re;
+        ptl_ni_t            *gwni = NULL;
+        ptl_ni_t            *tmpni = NULL;
         kpr_gateway_entry_t *ge = NULL;
        int                  rc = -ENOENT;
-
+        __u32                target_net = PTL_NIDNET(target_nid);
+        
         /* Caller wants to know if 'target_nid' can be reached via a gateway
          * ON HER OWN NETWORK */
 
-        CDEBUG (D_NET, "lookup "LPX64" from NAL %x\n", target_nid, 
-                ne->kpne_interface.kprni_nalid);
+        CDEBUG (D_NET, "lookup "LPX64" from %s\n", target_nid, 
+                (ni == NULL) ? "<>" : libcfs_nid2str(ni->ni_nid));
         LASSERT (!in_interrupt());
 
+        if (ni == NULL) {                       /* ni not determined yet */
+                gwni = ptl_net2ni(target_net);  /* is it a local network? */
+                if (gwni != NULL) {
+                        *nip = gwni;
+                        return ni->ni_nid;
+                }
+        }
+
        read_lock (&kpr_rwlock);
 
-       if (ne->kpne_shutdown) {        /* caller is shutting down */
+        if (ni != NULL && ni->ni_shutdown) {
+                /* pre-determined ni is shutting down */
                 read_unlock (&kpr_rwlock);
-               return (-ENOENT);
+               return PTL_NID_ANY;
         }
 
        /* Search routes for one that has a gateway to target_nid on the callers network */
-
         list_for_each (e, &kpr_routes) {
                re = list_entry (e, kpr_route_entry_t, kpre_list);
 
-               if (re->kpre_lo_nid > target_nid ||
-                    re->kpre_hi_nid < target_nid)
+                if (re->kpre_net != target_net) /* incorrect target net */
                        continue;
 
-               /* found table entry */
-
-               if (re->kpre_gateway->kpge_nalid != ne->kpne_interface.kprni_nalid ||
-                    !re->kpre_gateway->kpge_alive) {
-                        /* different NAL or gateway down */
-                        rc = -EHOSTUNREACH;
+                if (!re->kpre_gateway->kpge_alive) /* gateway down */
                         continue;
+                
+                if (ni != NULL) {
+                        /* local ni determined */
+                        if (PTL_NIDNET(ni->ni_nid) != /* gateway not on ni's net */
+                            PTL_NIDNET(re->kpre_gateway->kpge_nid))
+                                continue;
+                        tmpni = NULL;
+                } else {
+                        tmpni = ptl_net2ni(PTL_NIDNET(ge->kpge_nid));
+                        if (tmpni == NULL)      /* gateway not on a local net */
+                                continue;
                 }
                 
                 if (ge == NULL ||
-                    kpr_ge_isbetter (re->kpre_gateway, ge))
-                    ge = re->kpre_gateway;
+                    kpr_ge_isbetter (re->kpre_gateway, ge)) {
+                        if (gwni != NULL)
+                                ptl_ni_decref(gwni);
+                        ge = re->kpre_gateway;
+                        gwni = tmpni;
+                } else if (tmpni != NULL) {
+                        ptl_ni_decref(tmpni);
+                }
        }
 
-        if (ge != NULL) {
-                kpr_update_weight (ge, nob);
-                *gateway_nidp = ge->kpge_nid;
-                rc = 0;
+        if (ge == NULL) {
+                read_unlock (&kpr_rwlock);
+                LASSERT (gwni == NULL);
+                
+                return PTL_NID_ANY;
         }
         
+        kpr_update_weight (ge, nob);
+        gwnid = ge->kpge_nid;
        read_unlock (&kpr_rwlock);
-
-        /* NB can't deref 're' now; it might have been removed! */
-
-        CDEBUG (D_NET, "lookup "LPX64" from NAL %x: %d ("LPX64")\n",
-                target_nid, ne->kpne_interface.kprni_nalid, rc,
-                (rc == 0) ? *gateway_nidp : (ptl_nid_t)0);
-       return (rc);
-}
-
-kpr_nal_entry_t *
-kpr_find_nal_entry_locked (int nal_id)
-{
-        struct list_head    *e;
         
-        /* Called with kpr_rwlock held */
+        /* NB can't deref 're/ge' after lock released! */
+        CDEBUG (D_NET, "lookup %s from %s: %s\n",
+                libcfs_nid2str(target_nid),
+                (ni == NULL) ? "<>" : libcfs_nid2str(ni->ni_nid),
+                libcfs_nid2str(gwnid));
 
-        list_for_each (e, &kpr_nals) {
-                kpr_nal_entry_t *ne = list_entry (e, kpr_nal_entry_t, kpne_list);
+        LASSERT ((gwni == NULL) != (ni == NULL));
 
-                if (nal_id != ne->kpne_interface.kprni_nalid) /* no match */
-                        continue;
+        if (gwni == NULL)
+                ptl_ni_addref(ni);              /* extra ref so caller can drop blindly */
+        else
+                *nip = gwni;                    /* already got a ref */
 
-                return (ne);
-        }
-        
-        return (NULL);
+       return gwnid;
 }
 
 void
-kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd)
+kpr_fwd_start (ptl_ni_t *src_ni, kpr_fwd_desc_t *fwd)
 {
-       kpr_nal_entry_t     *src_ne = (kpr_nal_entry_t *)arg;
        ptl_nid_t            target_nid = fwd->kprfd_target_nid;
+        __u32                target_net = PTL_NIDNET(target_nid);
+        __u32                source_net = PTL_NIDNET(src_ni->ni_nid);
         int                  nob = fwd->kprfd_nob;
         kpr_gateway_entry_t *ge = NULL;
-        kpr_nal_entry_t     *dst_ne = NULL;
+        ptl_ni_t            *dst_ni = NULL;
+        ptl_ni_t            *tmp_ni;
        struct list_head    *e;
         kpr_route_entry_t   *re;
-        kpr_nal_entry_t     *tmp_ne;
         int                  rc;
 
-        CDEBUG (D_NET, "forward [%p] "LPX64" from NAL %x\n", fwd,
-                target_nid, src_ne->kpne_interface.kprni_nalid);
+        CDEBUG (D_NET, "forward [%p] %s from %s\n", fwd,
+                libcfs_nid2str(target_nid), libcfs_nid2str(src_ni->ni_nid));
 
         LASSERT (nob == ptl_kiov_nob (fwd->kprfd_niov, fwd->kprfd_kiov));
         LASSERT (!in_interrupt());
 
+       fwd->kprfd_src_ni = src_ni;             /* stash calling ni */
+
        read_lock (&kpr_rwlock);
 
-        kpr_fwd_packets++;                   /* (loose) stats accounting */
+        kpr_fwd_packets++;                      /* (loose) stats accounting */
         kpr_fwd_bytes += nob + sizeof(ptl_hdr_t);
 
-       if (src_ne->kpne_shutdown) {         /* caller is shutting down */
+       if (src_ni->ni_shutdown) {              /* caller is shutting down */
                 rc = -ESHUTDOWN;
                goto out;
         }
 
-       fwd->kprfd_router_arg = src_ne;      /* stash caller's nal entry */
-
        /* Search routes for one that has a gateway to target_nid NOT on the caller's network */
 
         list_for_each (e, &kpr_routes) {
                re = list_entry (e, kpr_route_entry_t, kpre_list);
 
-               if (re->kpre_lo_nid > target_nid || /* no match */
-                    re->kpre_hi_nid < target_nid)
+                if (re->kpre_net != target_net) /* no match */
                        continue;
 
-               if (re->kpre_gateway->kpge_nalid == src_ne->kpne_interface.kprni_nalid)
-                       continue;               /* don't route to same NAL */
+               if (PTL_NIDNET(re->kpre_gateway->kpge_nid) == source_net)
+                       continue;               /* don't route to same net */
 
                 if (!re->kpre_gateway->kpge_alive)
                         continue;               /* gateway is dead */
-                
-                tmp_ne = kpr_find_nal_entry_locked (re->kpre_gateway->kpge_nalid);
 
-                if (tmp_ne == NULL ||
-                    tmp_ne->kpne_shutdown) {
-                        /* NAL must be registered and not shutting down */
+                tmp_ni = ptl_net2ni(PTL_NIDNET(re->kpre_gateway->kpge_nid));
+                if (tmp_ni == NULL)
                         continue;
-                }
 
+                if (tmp_ni->ni_nal->nal_fwd == NULL) { 
+                        ptl_ni_decref(tmp_ni);  /* doesn't forward */
+                        continue;
+                }
+                
                 if (ge == NULL ||
                     kpr_ge_isbetter (re->kpre_gateway, ge)) {
+                        if (dst_ni != NULL)
+                                ptl_ni_decref(dst_ni);
+                                
+                        dst_ni = tmp_ni;
                         ge = re->kpre_gateway;
-                        dst_ne = tmp_ne;
                 }
         }
         
         if (ge != NULL) {
-                LASSERT (dst_ne != NULL);
+                LASSERT (dst_ni != NULL);
                 
                 kpr_update_weight (ge, nob);
 
                 fwd->kprfd_gateway_nid = ge->kpge_nid;
-                atomic_inc (&src_ne->kpne_refcount); /* source and dest nals are */
-                atomic_inc (&dst_ne->kpne_refcount); /* busy until fwd completes */
                 atomic_inc (&kpr_queue_depth);
 
                 read_unlock (&kpr_rwlock);
 
-                CDEBUG (D_NET, "forward [%p] "LPX64" from NAL %x: "
-                        "to "LPX64" on NAL %x\n", 
-                        fwd, target_nid, src_ne->kpne_interface.kprni_nalid,
-                        fwd->kprfd_gateway_nid, dst_ne->kpne_interface.kprni_nalid);
+                CDEBUG (D_NET, "forward [%p] %s: src ni %s dst ni %s gw %s\n",
+                        fwd, libcfs_nid2str(target_nid),
+                        libcfs_nid2str(src_ni->ni_nid),
+                        libcfs_nid2str(dst_ni->ni_nid),
+                        libcfs_nid2str(fwd->kprfd_gateway_nid));
 
-                dst_ne->kpne_interface.kprni_fwd (dst_ne->kpne_interface.kprni_arg, fwd);
+                dst_ni->ni_nal->nal_fwd(dst_ni, fwd);
+                ptl_ni_decref(dst_ni);
                 return;
        }
 
@@ -519,37 +416,30 @@ kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd)
  out:
         kpr_fwd_errors++;
 
-        CDEBUG (D_NET, "Failed to forward [%p] "LPX64" from NAL %x: %d\n"
-                fwd, target_nid, src_ne->kpne_interface.kprni_nalid, rc);
+        CDEBUG (D_NET, "Failed to forward [%p] %s from %s\n", fwd
+                libcfs_nid2str(target_nid), libcfs_nid2str(src_ni->ni_nid));
 
-       (fwd->kprfd_callback)(fwd->kprfd_callback_arg, rc);
+       (fwd->kprfd_callback)(src_ni, fwd->kprfd_callback_arg, rc);
 
         read_unlock (&kpr_rwlock);
 }
 
 void
-kpr_complete_packet (void *arg, kpr_fwd_desc_t *fwd, int error)
+kpr_fwd_done (ptl_ni_t *dst_ni, kpr_fwd_desc_t *fwd, int error)
 {
-       kpr_nal_entry_t *dst_ne = (kpr_nal_entry_t *)arg;
-       kpr_nal_entry_t *src_ne = (kpr_nal_entry_t *)fwd->kprfd_router_arg;
-
-        CDEBUG (D_NET, "complete(1) [%p] from NAL %x to NAL %x: %d\n", fwd,
-                src_ne->kpne_interface.kprni_nalid, dst_ne->kpne_interface.kprni_nalid, error);
+       ptl_ni_t *src_ni = fwd->kprfd_src_ni;
 
-       atomic_dec (&dst_ne->kpne_refcount);    /* CAVEAT EMPTOR dst_ne can disappear now!!! */
+        CDEBUG (D_NET, "complete(1) [%p] from %s to %s: %d\n", fwd,
+                libcfs_nid2str(src_ni->ni_nid),
+                libcfs_nid2str(dst_ni->ni_nid), error);
 
-       (fwd->kprfd_callback)(fwd->kprfd_callback_arg, error);
-
-        CDEBUG (D_NET, "complete(2) [%p] from NAL %x: %d\n", fwd,
-                src_ne->kpne_interface.kprni_nalid, error);
+       (fwd->kprfd_callback)(src_ni, fwd->kprfd_callback_arg, error);
 
         atomic_dec (&kpr_queue_depth);
-       atomic_dec (&src_ne->kpne_refcount);    /* CAVEAT EMPTOR src_ne can disappear now!!! */
 }
 
 int
-kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, 
-               ptl_nid_t lo_nid, ptl_nid_t hi_nid)
+kpr_add_route (__u32 net, ptl_nid_t gateway_nid)
 {
        unsigned long        flags;
        struct list_head    *e;
@@ -557,20 +447,16 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid,
         kpr_gateway_entry_t *ge;
         int                  dup = 0;
 
-        CDEBUG(D_NET, "Add route: %x "LPX64" : "LPX64" - "LPX64"\n",
-               gateway_nalid, gateway_nid, lo_nid, hi_nid);
+        CDEBUG(D_NET, "Add route: net %s : gw %s\n",
+               libcfs_net2str(net), libcfs_nid2str(gateway_nid));
 
-        if (gateway_nalid == PTL_NID_ANY ||
-            lo_nid == PTL_NID_ANY ||
-            hi_nid == PTL_NID_ANY ||
-            lo_nid > hi_nid)
+        if (gateway_nid == PTL_NID_ANY)
                 return (-EINVAL);
 
         PORTAL_ALLOC (ge, sizeof (*ge));
         if (ge == NULL)
                 return (-ENOMEM);
 
-        ge->kpge_nalid = gateway_nalid;
         ge->kpge_nid   = gateway_nid;
         ge->kpge_alive = 1;
         ge->kpge_timestamp = 0;
@@ -583,8 +469,7 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid,
                 return (-ENOMEM);
         }
 
-        re->kpre_lo_nid = lo_nid;
-        re->kpre_hi_nid = hi_nid;
+        re->kpre_net = net;
 
         LASSERT(!in_interrupt());
        write_lock_irqsave (&kpr_rwlock, flags);
@@ -593,8 +478,7 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid,
                 kpr_gateway_entry_t *ge2 = list_entry(e, kpr_gateway_entry_t,
                                                       kpge_list);
 
-                if (ge2->kpge_nalid == gateway_nalid &&
-                    ge2->kpge_nid == gateway_nid) {
+                if (ge2->kpge_nid == gateway_nid) {
                         PORTAL_FREE (ge, sizeof (*ge));
                         ge = ge2;
                         dup = 1;
@@ -626,32 +510,19 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid,
 }
 
 int
-kpr_sys_notify (int gateway_nalid, ptl_nid_t gateway_nid,
-                int alive, time_t when)
+kpr_del_route (__u32 net, ptl_nid_t gw_nid)
 {
-        return (kpr_do_notify (0, gateway_nalid, gateway_nid, alive, when));
-}
-
-int
-kpr_del_route (int gw_nalid, ptl_nid_t gw_nid,
-               ptl_nid_t lo, ptl_nid_t hi)
-{
-        int                specific = (lo != PTL_NID_ANY);
         unsigned long      flags;
         int                rc = -ENOENT;
         struct list_head  *e;
         struct list_head  *n;
 
-        CDEBUG(D_NET, "Del route [%x] "LPX64" : "LPX64" - "LPX64"\n",
-               gw_nalid, gw_nid, lo, hi);
-
+        CDEBUG(D_NET, "Del route: net %s : gw %s\n",
+               libcfs_net2str(net), libcfs_nid2str(gw_nid));
         LASSERT(!in_interrupt());
 
         /* NB Caller may specify either all routes via the given gateway
-         * (lo/hi == PTL_NID_ANY) or a specific route entry (lo/hi are
-         * actual NIDs) */
-        if (specific ? (hi == PTL_NID_ANY || hi < lo) : (hi != PTL_NID_ANY))
-                return (-EINVAL);
+         * or a specific route entry actual NIDs) */
 
         write_lock_irqsave(&kpr_rwlock, flags);
 
@@ -660,10 +531,12 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid,
                                                    kpre_list);
                 kpr_gateway_entry_t *ge = re->kpre_gateway;
 
-                if (ge->kpge_nalid != gw_nalid ||
-                    ge->kpge_nid != gw_nid ||
-                    (specific &&
-                     (lo != re->kpre_lo_nid || hi != re->kpre_hi_nid)))
+                if (!(net == PTL_NIDNET(PTL_NID_ANY) ||
+                      net == re->kpre_net))
+                        continue;
+
+                if (!(gw_nid == PTL_NID_ANY ||
+                      gw_nid == ge->kpge_nid))
                         continue;
 
                 rc = 0;
@@ -675,9 +548,6 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid,
 
                 list_del (&re->kpre_list);
                 PORTAL_FREE(re, sizeof (*re));
-
-                if (specific)
-                        break;
         }
 
         kpr_routes_generation++;
@@ -687,8 +557,7 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid,
 }
 
 int
-kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid,
-               ptl_nid_t *lo_nid, ptl_nid_t *hi_nid, __u32 *alive)
+kpr_get_route (int idx, __u32 *net, ptl_nid_t *gateway_nid, __u32 *alive)
 {
        struct list_head  *e;
 
@@ -701,11 +570,9 @@ kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid,
                 kpr_gateway_entry_t *ge = re->kpre_gateway;
                 
                 if (idx-- == 0) {
-                        *gateway_nalid = ge->kpge_nalid;
+                        *net = re->kpre_net;
                         *gateway_nid = ge->kpge_nid;
                         *alive = ge->kpge_alive;
-                        *lo_nid = re->kpre_lo_nid;
-                        *hi_nid = re->kpre_hi_nid;
 
                         read_unlock(&kpr_rwlock);
                         return (0);
@@ -716,67 +583,38 @@ kpr_get_route (int idx, __u32 *gateway_nalid, ptl_nid_t *gateway_nid,
         return (-ENOENT);
 }
 
-static int 
-kpr_nal_cmd(struct portals_cfg *pcfg, void * private)
+int 
+kpr_ctl(unsigned int cmd, void *arg)
 {
-        int err = -EINVAL;
-        ENTRY;
+        struct portal_ioctl_data *data = arg;
 
-        switch(pcfg->pcfg_command) {
+        switch(cmd) {
         default:
-                CDEBUG(D_IOCTL, "Inappropriate cmd: %d\n", pcfg->pcfg_command);
-                break;
+                return -EINVAL;
                 
-        case NAL_CMD_ADD_ROUTE:
-                CDEBUG(D_IOCTL, "Adding route: [%x] "LPU64" : "LPU64" - "LPU64"\n",
-                       pcfg->pcfg_nal, pcfg->pcfg_nid, 
-                       pcfg->pcfg_nid2, pcfg->pcfg_nid3);
-                err = kpr_add_route(pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
-                                    pcfg->pcfg_nid2, pcfg->pcfg_nid3);
-                break;
+        case IOC_PORTAL_ADD_ROUTE:
+                return kpr_add_route(data->ioc_net, data->ioc_nid);
 
-        case NAL_CMD_DEL_ROUTE:
-                CDEBUG (D_IOCTL, "Removing routes via [%x] "LPU64" : "LPU64" - "LPU64"\n",
-                        pcfg->pcfg_gw_nal, pcfg->pcfg_nid, 
-                        pcfg->pcfg_nid2, pcfg->pcfg_nid3);
-                err = kpr_del_route (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
-                                     pcfg->pcfg_nid2, pcfg->pcfg_nid3);
-                break;
+        case IOC_PORTAL_DEL_ROUTE:
+                return kpr_del_route (data->ioc_net, data->ioc_nid);
 
-        case NAL_CMD_NOTIFY_ROUTER: {
-                CDEBUG (D_IOCTL, "Notifying peer [%x] "LPU64" %s @ %ld\n",
-                        pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
-                        pcfg->pcfg_flags ? "Enabling" : "Disabling",
-                        (time_t)pcfg->pcfg_nid3);
-                
-                err = kpr_sys_notify (pcfg->pcfg_gw_nal, pcfg->pcfg_nid,
-                                      pcfg->pcfg_flags, (time_t)pcfg->pcfg_nid3);
-                break;
-        }
-                
-        case NAL_CMD_GET_ROUTE:
-                CDEBUG (D_IOCTL, "Getting route [%d]\n", pcfg->pcfg_count);
-                err = kpr_get_route(pcfg->pcfg_count, &pcfg->pcfg_gw_nal,
-                                    &pcfg->pcfg_nid, 
-                                    &pcfg->pcfg_nid2, &pcfg->pcfg_nid3,
-                                    &pcfg->pcfg_flags);
-                break;
+        case IOC_PORTAL_GET_ROUTE:
+                return kpr_get_route(data->ioc_count, &data->ioc_net,
+                                     &data->ioc_nid, &data->ioc_flags);
+
+        case IOC_PORTAL_NOTIFY_ROUTER:
+                return kpr_notify(NULL, data->ioc_nid, data->ioc_flags, 
+                                  (time_t)data->ioc_u64[0]);
         }
-        RETURN(err);
 }
 
 
-static void /*__exit*/
+void
 kpr_finalise (void)
 {
-        LASSERT (list_empty (&kpr_nals));
-
-        libcfs_nal_cmd_unregister(ROUTER);
-
-        PORTAL_SYMBOL_UNREGISTER(kpr_router_interface);
-
+#ifdef __KERNEL__
         kpr_proc_fini();
-
+#endif
         while (!list_empty (&kpr_routes)) {
                 kpr_route_entry_t *re = list_entry(kpr_routes.next,
                                                    kpr_route_entry_t,
@@ -786,11 +624,20 @@ kpr_finalise (void)
                 PORTAL_FREE(re, sizeof (*re));
         }
 
+        while (!list_empty (&kpr_gateways)) {
+                kpr_gateway_entry_t *ge = list_entry(kpr_gateways.next,
+                                                     kpr_gateway_entry_t,
+                                                     kpge_list);
+
+                list_del(&ge->kpge_list);
+                PORTAL_FREE(ge, sizeof (*ge));
+        }
+
         CDEBUG(D_MALLOC, "kpr_finalise: kmem back to %d\n",
                atomic_read(&portal_kmemory));
 }
 
-static int __init
+void
 kpr_initialise (void)
 {
         int     rc;
@@ -799,23 +646,14 @@ kpr_initialise (void)
                atomic_read(&portal_kmemory));
 
         kpr_routes_generation = 0;
-        kpr_proc_init();
 
-        rc = libcfs_nal_cmd_register(ROUTER, kpr_nal_cmd, NULL);
-        if (rc != 0) {
-                CERROR("Can't register nal cmd handler\n");
-                return (rc);
-        }
-        
-        PORTAL_SYMBOL_REGISTER(kpr_router_interface);
-        return (0);
+#ifdef __KERNEL__
+        kpr_proc_init();
+#endif
 }
 
-MODULE_AUTHOR("Eric Barton");
-MODULE_DESCRIPTION("Kernel Portals Router v0.01");
-MODULE_LICENSE("GPL");
-
-module_init (kpr_initialise);
-module_exit (kpr_finalise);
-
-EXPORT_SYMBOL (kpr_router_interface);
+EXPORT_SYMBOL(kpr_routing);
+EXPORT_SYMBOL(kpr_lookup);
+EXPORT_SYMBOL(kpr_fwd_start);
+EXPORT_SYMBOL(kpr_fwd_done);
+EXPORT_SYMBOL(kpr_notify);
index 44f307a..5e5fa78 100644 (file)
 
 typedef struct
 {
-       struct list_head        kpne_list;
-       kpr_nal_interface_t     kpne_interface;
-       atomic_t                kpne_refcount;
-       int                     kpne_shutdown;
-} kpr_nal_entry_t;
-
-typedef struct
-{
         struct list_head        kpge_list;
         atomic_t                kpge_weight;
         time_t                  kpge_timestamp;
         int                     kpge_alive;
-        int                     kpge_nalid;
         int                     kpge_refcount;
         ptl_nid_t               kpge_nid;
 } kpr_gateway_entry_t;
@@ -63,30 +54,17 @@ typedef struct
 {
        struct list_head        kpre_list;
         kpr_gateway_entry_t    *kpre_gateway;
-       ptl_nid_t               kpre_lo_nid;
-        ptl_nid_t               kpre_hi_nid;
+        __u32                   kpre_net;
 } kpr_route_entry_t;
 
 typedef struct
 {
         work_struct_t           kpru_tq;
-        int                     kpru_nal_id;
         ptl_nid_t               kpru_nid;
         int                     kpru_alive;
         time_t                  kpru_when;
 } kpr_upcall_t;
 
-extern int kpr_register_nal (kpr_nal_interface_t *nalif, void **argp);
-extern int kpr_lookup_target (void *arg, ptl_nid_t target_nid, int nob, 
-                              ptl_nid_t *gateway_nidp);
-extern kpr_nal_entry_t *kpr_find_nal_entry_locked (int nal_id);
-extern void kpr_forward_packet (void *arg, kpr_fwd_desc_t *fwd);
-extern void kpr_complete_packet (void *arg, kpr_fwd_desc_t *fwd, int error);
-extern void kpr_nal_notify (void *arg, ptl_nid_t peer,
-                            int alive, time_t when);
-extern void kpr_shutdown_nal (void *arg);
-extern void kpr_deregister_nal (void *arg);
-
 extern void kpr_proc_init (void);
 extern void kpr_proc_fini (void);
 
index ef937af..3e7eec5 100644 (file)
@@ -53,7 +53,10 @@ struct pingsrv_data {
  
 struct pingcli_data {
         
-        struct portal_ioctl_data *args;
+       int                     count;
+       int                     size;
+       ptl_nid_t               nid;
+       int                     timeout;
         ptl_handle_me_t        me;
         ptl_handle_eq_t                eq;
         char                          *inbuf;    
index f33a997..398e069 100644 (file)
@@ -44,7 +44,6 @@ static int count = 0;
 static void
 pingcli_shutdown(ptl_handle_ni_t nih, int err)
 {
-        struct portal_ioctl_data *args = client->args;
         int rc;
 
         /* Yes, we are intentionally allowing us to fall through each
@@ -72,11 +71,11 @@ pingcli_shutdown(ptl_handle_ni_t nih, int err)
                 case 4:
                         /* Free our buffers */
                         if (client->outbuf != NULL)
-                                PORTAL_FREE (client->outbuf, STDSIZE + args->ioc_size);
+                                PORTAL_FREE (client->outbuf, STDSIZE + client->size);
 
                         if (client->inbuf != NULL)
                                 PORTAL_FREE (client->inbuf,
-                                             (args->ioc_size + STDSIZE) * args->ioc_count);
+                                             (client->size + STDSIZE) * client->count);
 
                         if (client != NULL)
                                 PORTAL_FREE (client,
@@ -105,7 +104,7 @@ static void pingcli_callback(ptl_event_t *ev)
 }
 
 
-static struct pingcli_data *
+static void
 pingcli_start(struct portal_ioctl_data *args)
 {
         ptl_handle_ni_t nih = PTL_INVALID_HANDLE;
@@ -114,29 +113,33 @@ pingcli_start(struct portal_ioctl_data *args)
         struct timeval tv1, tv2;
         
         client->tsk = cfs_current();
-        client->args = args;
-        CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s),  \
+        client->nid = args->ioc_nid;
+        client->count = args->ioc_count;
+        client->size = args->ioc_u32[0];
+        client->timeout = args->ioc_u32[1];
+        
+       CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s),  \
                         size %u, count: %u, timeout: %u\n",
-                        args->ioc_nid,
-                        libcfs_nid2str(args->ioc_nid),
-                        args->ioc_size, args->ioc_count, args->ioc_timeout);
+                        client->nid,
+                        libcfs_nid2str(client->nid),
+                        client->size, client->count, client->timeout);
 
 
-        PORTAL_ALLOC (client->outbuf, STDSIZE + args->ioc_size) ;
+        PORTAL_ALLOC (client->outbuf, STDSIZE + client->size) ;
         if (client->outbuf == NULL)
         {
                 CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         PORTAL_ALLOC (client->inbuf,
-                        (args->ioc_size + STDSIZE) * args->ioc_count);
+                        (client->size + STDSIZE) * client->count);
         if (client->inbuf == NULL)
         {
                 CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         rc = PtlNIInit(PTL_IFACE_DEFAULT, 0, NULL, NULL, &nih);
@@ -144,7 +147,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlNIInit: error %d\n", rc);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         /* Based on the initialization aquire our unique portal ID. */
@@ -152,7 +155,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlGetId error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
         /* Setup the local match entries */
@@ -160,7 +163,7 @@ pingcli_start(struct portal_ioctl_data *args)
         client->id_local.pid = PTL_PID_ANY;
 
         /* Setup the remote match entries */
-        client->id_remote.nid = args->ioc_nid;
+        client->id_remote.nid = client->nid;
         client->id_remote.pid = 0;
 
         if ((rc = PtlMEAttach (nih, PTL_PING_CLIENT,
@@ -169,7 +172,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlMEAttach error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
         /* Allocate the event queue for this network interface */
@@ -177,31 +180,30 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlEQAlloc error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
-        count = args->ioc_count;
+        count = client->count;
 
         client->md_in_head.start     = client->inbuf;
-        client->md_in_head.length    = (args->ioc_size + STDSIZE)
-                                                * count;
+        client->md_in_head.length    = (client->size + STDSIZE) * count;
         client->md_in_head.threshold = PTL_MD_THRESH_INF;
         client->md_in_head.options   = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT;
         client->md_in_head.user_ptr  = NULL;
         client->md_in_head.eq_handle = client->eq;
-        memset (client->inbuf, 0, (args->ioc_size + STDSIZE) * count);
+        memset (client->inbuf, 0, (client->size + STDSIZE) * count);
 
         /* Attach the incoming buffer */
         if ((rc = PtlMDAttach (client->me, client->md_in_head,
                               PTL_UNLINK, &client->md_in_head_h))) {
                 CERROR ("PtlMDAttach error %d\n", rc);
                 pingcli_shutdown (nih, 1);
-                return (NULL);
+                return;
         }
         /* Setup the outgoing ping header */
         client->md_out_head.start     = client->outbuf;
-        client->md_out_head.length    = STDSIZE + args->ioc_size;
-        client->md_out_head.threshold = args->ioc_count;
+        client->md_out_head.length    = STDSIZE + client->size;
+        client->md_out_head.threshold = client->count;
         client->md_out_head.options   = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT;
         client->md_out_head.user_ptr  = NULL;
         client->md_out_head.eq_handle = PTL_EQ_NONE;
@@ -215,9 +217,9 @@ pingcli_start(struct portal_ioctl_data *args)
                            PTL_UNLINK, &client->md_out_head_h))) {
                 CERROR ("PtlMDBind error %d\n", rc);
                 pingcli_shutdown (nih, 1);
-                return NULL;
+                return;
         }
-        while ((args->ioc_count - count)) {
+        while ((client->count - count)) {
                 unsigned __count;
                 __count = __cpu_to_le32(count);
 
@@ -233,12 +235,12 @@ pingcli_start(struct portal_ioctl_data *args)
                           client->id_remote, PTL_PING_SERVER, 0, 0, 0, 0))) {
                          PDEBUG ("PtlPut (header)", rc);
                          pingcli_shutdown (nih, 1);
-                         return NULL;
+                         return;
                 }
                 CWARN ("Lustre: sent msg no %d.\n", count);
 
                 set_current_state (TASK_INTERRUPTIBLE);
-                rc = schedule_timeout (cfs_time_seconds(args->ioc_timeout));
+                rc = schedule_timeout (cfs_time_seconds(client->timeout));
                 if (rc == 0) {
                         CERROR ("timeout .....\n");
                 } else {
@@ -252,8 +254,6 @@ pingcli_start(struct portal_ioctl_data *args)
 
         pingcli_shutdown (nih, 2);
 
-        /* Success! */
-        return NULL;
 } /* pingcli_setup() */
 
 
index 251a6c7..43b6b65 100644 (file)
@@ -98,7 +98,7 @@ static void pingcli_callback(ptl_event_t *ev)
 }
 
 
-static struct pingcli_data *
+static void
 pingcli_start(struct portal_ioctl_data *args)
 {
         ptl_handle_ni_t nih = PTL_INVALID_HANDLE;
@@ -106,13 +106,16 @@ pingcli_start(struct portal_ioctl_data *args)
         int rc;
 
         client->tsk = current;
-        client->args = args;
-
+        client->nid = args->ioc_nid;
+        client->count = args->ioc_count;
+        client->size = args->ioc_u32[0];
+        client->timeout = args->ioc_u32[1];
+        
         CDEBUG (D_OTHER, "pingcli_setup args: nid "LPX64" (%s),  "
                 "size %u, count: %u, timeout: %u\n",
-                args->ioc_nid,
-                libcfs_nid2str(args->ioc_nid),
-                args->ioc_size, args->ioc_count, args->ioc_timeout);
+                client->nid,
+                libcfs_nid2str(client->nid),
+                client->size, client->count, client->timeout);
 
 
         PORTAL_ALLOC (client->outbuf, STDSIZE) ;
@@ -120,7 +123,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         PORTAL_ALLOC (client->inbuf,  STDSIZE);
@@ -129,7 +132,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("Unable to allocate out_buf ("LPSZ" bytes)\n", STDSIZE);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         /* Aquire and initialize the proper nal for portals. */
@@ -138,7 +141,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlNIInit: error %d\n", rc);
                 pingcli_shutdown (nih, 4);
-                return (NULL);
+                return;
         }
 
         /* Based on the initialization aquire our unique portal ID. */
@@ -146,7 +149,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlGetId error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
         /* Setup the local match entries */
@@ -154,7 +157,7 @@ pingcli_start(struct portal_ioctl_data *args)
         client->id_local.pid = PTL_PID_ANY;
 
         /* Setup the remote match entries */
-        client->id_remote.nid = args->ioc_nid;
+        client->id_remote.nid = client->nid;
         client->id_remote.pid = 0;
 
         if ((rc = PtlMEAttach (nih, PTL_PING_CLIENT,
@@ -163,7 +166,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlMEAttach error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
         /* Allocate the event queue for this network interface */
@@ -171,7 +174,7 @@ pingcli_start(struct portal_ioctl_data *args)
         {
                 CERROR ("PtlEQAlloc error %d\n", rc);
                 pingcli_shutdown (nih, 2);
-                return (NULL);
+                return;
         }
 
 
@@ -188,7 +191,7 @@ pingcli_start(struct portal_ioctl_data *args)
                               PTL_UNLINK, &client->md_in_head_h))) {
                 CERROR ("PtlMDAttach error %d\n", rc);
                 pingcli_shutdown (nih, 1);
-                return (NULL);
+                return;
         }
 
         /* Setup the outgoing ping header */
@@ -206,31 +209,29 @@ pingcli_start(struct portal_ioctl_data *args)
                            PTL_UNLINK, &client->md_out_head_h))) {
                 CERROR ("PtlMDBind error %d\n", rc);
                 pingcli_shutdown (nih, 1);
-                return (NULL);
+                return;
         }
         /* Put the ping packet */
         if((rc = PtlPut (client->md_out_head_h, PTL_NOACK_REQ,
                          client->id_remote, PTL_PING_SERVER, 0, 0, 0, 0))) {
                 PDEBUG ("PtlPut (header)", rc);
                 pingcli_shutdown (nih, 1);
-                return NULL;
+                return;
         }
 
         count = 0;
         set_current_state (TASK_INTERRUPTIBLE);
-        rc = schedule_timeout (20 * args->ioc_timeout);
+        rc = schedule_timeout (20 * client->timeout);
         if (rc == 0) {
                 CERROR ("Time out on the server\n");
                 pingcli_shutdown (nih, 2);
-                return NULL;
+                return;
         } else {
                 CWARN("Received respose from the server \n");
         }
 
         pingcli_shutdown (nih, 2);
 
-        /* Success! */
-        return NULL;
 } /* pingcli_setup() */
 
 
index e805ff8..813e134 100644 (file)
@@ -60,8 +60,8 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni,
                       ptl_msg_t *cookie,
                       ptl_hdr_t *hdr,
                       int type,
-                      ptl_nid_t nid,
-                      ptl_pid_t pid,
+                      ptl_process_id_t target,
+                      int routing,
                       unsigned int niov,
                       struct iovec *iov,
                       size_t offset,
@@ -77,9 +77,14 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni,
     int   ntiov;
     int i;
 
+    if (routing) {
+            CERROR("Can't route\n");
+            return PTL_FAIL;
+    }
+    
     if (!(c=force_tcp_connection((manager)b->lower,
-                                 PNAL_IP(nid,b),
-                                 PNAL_PORT(nid,pid),
+                                 PNAL_IP(target.nid,b),
+                                 PNAL_PORT(target.nid,target.pid),
                                  b->local)))
         return(PTL_FAIL);
 
index e805ff8..813e134 100644 (file)
@@ -60,8 +60,8 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni,
                       ptl_msg_t *cookie,
                       ptl_hdr_t *hdr,
                       int type,
-                      ptl_nid_t nid,
-                      ptl_pid_t pid,
+                      ptl_process_id_t target,
+                      int routing,
                       unsigned int niov,
                       struct iovec *iov,
                       size_t offset,
@@ -77,9 +77,14 @@ ptl_err_t tcpnal_send(ptl_ni_t *ni,
     int   ntiov;
     int i;
 
+    if (routing) {
+            CERROR("Can't route\n");
+            return PTL_FAIL;
+    }
+    
     if (!(c=force_tcp_connection((manager)b->lower,
-                                 PNAL_IP(nid,b),
-                                 PNAL_PORT(nid,pid),
+                                 PNAL_IP(target.nid,b),
+                                 PNAL_PORT(target.nid,target.pid),
                                  b->local)))
         return(PTL_FAIL);
 
index b8dbf2c..39c10ec 100644 (file)
@@ -19,7 +19,7 @@ sbin_PROGRAMS = debugctl
 
 lib_LIBRARIES = libptlctl.a
 
-libptlctl_a_SOURCES = portals.c debug.c l_ioctl.c parser.c parser.h
+libptlctl_a_SOURCES = portals.c nidstrings.c debug.c l_ioctl.c parser.c parser.h
 
 if UTILS
 if !CRAY_PORTALS
@@ -46,3 +46,6 @@ routerstat_SOURCES = routerstat.c
 debugctl_SOURCES = debugctl.c
 debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
 debugctl_DEPENDENCIES = libptlctl.a
+
+nidstrings.c: @top_srcdir@/portals/libcfs/nidstrings.c
+       ln -sf $< $@
diff --git a/lnet/utils/acceptor.c b/lnet/utils/acceptor.c
deleted file mode 100644 (file)
index e5bb46b..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- */
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <errno.h>
-#ifdef HAVE_LIBWRAP
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <tcpd.h>
-#endif
-
-#include <libcfs/portals_utils.h>
-#include <portals/api-support.h>
-#include <portals/lib-types.h>
-#include <portals/socknal.h>
-
-/* should get this from autoconf somehow */
-#ifndef PIDFILE_DIR
-#define PIDFILE_DIR "/var/run"
-#endif 
-
-#define PROGNAME "acceptor"
-
-#ifdef HAVE_LIBWRAP
-/* needed because libwrap declares these as externs */
-int     allow_severity = LOG_INFO;
-int     deny_severity = LOG_WARNING;
-#endif
-
-void create_pidfile(char *name, int port)
-{
-        char pidfile[1024];
-        FILE *fp;
-
-        snprintf(pidfile, sizeof(pidfile), "%s/%s-%d.pid", 
-                 PIDFILE_DIR, name, port);
-        
-        if ((fp = fopen(pidfile, "w"))) {
-                fprintf(fp, "%d\n", getpid());
-                fclose(fp);
-        } else {
-                syslog(LOG_ERR, "%s: %s\n", pidfile, 
-                       strerror(errno));
-        }
-}
-
-int pidfile_exists(char *name, int port)
-{
-        char pidfile[1024];
-
-        snprintf(pidfile, sizeof(pidfile), "%s/%s-%d.pid", 
-                 PIDFILE_DIR, name, port);
-        
-        if (!access(pidfile, F_OK)) {
-                fprintf(stderr, "%s: exists, acceptor already running.\n", 
-                        pidfile);
-                return (1);
-        } 
-        return (0);
-}
-
-void
-show_connection (int fd, __u32 net_ip)
-{
-        struct hostent *h = gethostbyaddr ((char *)&net_ip, sizeof net_ip, AF_INET);
-        __u32 host_ip = ntohl (net_ip);
-        int  len;
-        char host[1024];
-        
-        if (h == NULL)
-                snprintf (host, sizeof(host), "%d.%d.%d.%d", (host_ip >> 24) & 0xff,
-                                    (host_ip >> 16) & 0xff, (host_ip >> 8) & 0xff, host_ip & 0xff);
-        else
-                snprintf (host, sizeof(host), "%s", h->h_name);
-                
-        syslog (LOG_INFO, "Accepted host: %s\n", host);
-}
-
-void
-usage (char *myname)
-{
-        fprintf (stderr, 
-                 "Usage: %s [-N nal_id] [-p] [-l] port\n\n"
-                 " -l\tKeep stdin/stdout open\n"
-                 " -p\tAllow connections from non-privileged ports\n",
-                 myname);
-        exit (1);
-}
-
-int main(int argc, char **argv)
-{
-        int o, fd, rc, port, pfd;
-        struct sockaddr_in srvaddr;
-        int c;
-        int noclose = 0;
-        int nal = SOCKNAL;
-        int rport;
-        int require_privports = 1;
-        
-        while ((c = getopt (argc, argv, "N:lp")) != -1) {
-                switch (c) {
-                case 'N':
-                        if (sscanf(optarg, "%d", &nal) != 1 ||
-                            nal < 0 || nal > NAL_MAX_NR)
-                                usage(argv[0]);
-                        break;
-                case 'l':
-                        noclose = 1;
-                        break;
-                case 'p':
-                        require_privports = 0;
-                        break;
-                default:
-                        usage (argv[0]);
-                        break;
-                }
-        }
-
-        if (optind >= argc)
-                usage (argv[0]);
-
-        port = atol(argv[optind++]);
-
-        if (pidfile_exists(PROGNAME, port))
-                exit(1);
-
-        memset(&srvaddr, 0, sizeof(srvaddr));
-        srvaddr.sin_family = AF_INET;
-        srvaddr.sin_port = htons(port);
-        srvaddr.sin_addr.s_addr = INADDR_ANY;
-
-        fd = socket(PF_INET, SOCK_STREAM, 0);
-        if (fd < 0) {
-                perror("opening socket");
-                exit(1);
-        }
-
-        o = 1;
-        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof(o))) {
-                perror("Cannot set REUSEADDR socket opt");
-                exit(1);
-        }
-
-        rc = bind(fd, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
-        if ( rc == -1 ) {
-                perror("bind: ");
-                exit(1);
-        }
-
-        if (listen(fd, 127)) {
-                perror("listen: ");
-                exit(1);
-        }
-        fprintf(stderr, "listening on port %d\n", port);
-
-        pfd = open("/dev/portals", O_RDWR);
-        if ( pfd < 0 ) {
-                perror("opening portals device");
-                exit(1);
-        }
-
-        rc = daemon(0, noclose);
-        if (rc < 0) {
-                perror("daemon(): ");
-                exit(1);
-        }
-
-        openlog(PROGNAME, LOG_PID, LOG_DAEMON);
-        syslog(LOG_INFO, "started, listening on port %d\n", port);
-        create_pidfile(PROGNAME, port);
-
-        while (1) {
-                struct sockaddr_in clntaddr;
-                int len = sizeof(clntaddr);
-                int cfd;
-                struct portal_ioctl_data data;
-                struct portals_cfg pcfg;
-#ifdef HAVE_LIBWRAP
-                struct request_info request;
-#endif
-                char addrstr[INET_ADDRSTRLEN];
-               
-                cfd = accept(fd, (struct sockaddr *)&clntaddr, &len);
-                if ( cfd < 0 ) {
-                        perror("accept");
-                        exit(0);
-                        continue;
-                }
-
-#ifdef HAVE_LIBWRAP
-                /* libwrap access control */
-                request_init(&request, RQ_DAEMON, "lustre", RQ_FILE, cfd, 0);
-                sock_host(&request);
-                if (!hosts_access(&request)) {
-                        inet_ntop(AF_INET, &clntaddr.sin_addr,
-                                  addrstr, INET_ADDRSTRLEN);
-                        syslog(LOG_WARNING, "Unauthorized access from %s:%hd\n",
-                               addrstr, ntohs(clntaddr.sin_port));
-                        close (cfd);
-                        continue;
-                }
-#endif
-
-                if (require_privports && ntohs(clntaddr.sin_port) >= IPPORT_RESERVED) {
-                        inet_ntop(AF_INET, &clntaddr.sin_addr,
-                                  addrstr, INET_ADDRSTRLEN);
-                        syslog(LOG_ERR, "Closing non-privileged connection from %s:%d\n",
-                               addrstr, ntohs(clntaddr.sin_port));
-                        rc = close(cfd);
-                        if (rc)
-                                perror ("close un-privileged client failed");
-                        continue;
-                }
-
-                show_connection (cfd, clntaddr.sin_addr.s_addr);
-
-                PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD);
-                pcfg.pcfg_nal = nal;
-                pcfg.pcfg_fd = cfd;
-                pcfg.pcfg_misc = SOCKNAL_CONN_NONE; /* == incoming connection */
-                
-                PORTAL_IOC_INIT(data);
-                data.ioc_pbuf1 = (char*)&pcfg;
-                data.ioc_plen1 = sizeof(pcfg);
-                
-                if (ioctl(pfd, IOC_PORTAL_NAL_CMD, &data) < 0) {
-                        perror("ioctl failed");
-                } else {
-                        printf("client registered\n");
-                }
-                rc = close(cfd);
-                if (rc)
-                        perror ("close failed");
-        }
-
-        closelog();
-        exit(0);
-
-}
index f7e5250..6b9cfe6 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <gm.h>
 
-#define GMNAL_IOC_GET_GNID 1
 /*
  *      portals always uses unit 0
  *      Can this be configurable?
index 54c716b..df8efd9 100644 (file)
 #include <libcfs/portals_utils.h>
 #include <portals/api-support.h>
 #include <portals/ptlctl.h>
-#include <portals/lib-types.h>
 #include <portals/socknal.h>
 #include "parser.h"
 
 unsigned int portal_debug;
 unsigned int portal_printk;
 
-static unsigned int g_nal = 0;
-
-typedef struct
-{
-        char *name;
-        int   num;
-} name2num_t;
-
-static name2num_t nalnames[] = {
-        {"any",         0},
-#if !CRAY_PORTALS
-        {"tcp",                SOCKNAL},
-        {"elan",       QSWNAL},
-        {"gm",         GMNAL},
-        {"openib",      OPENIBNAL},
-        {"iib",         IIBNAL},
-        {"vib",         VIBNAL},
-        {"lo",          LONAL},
-        {"ra",          RANAL},
-#else
-        {"cray_kern_nal", CRAY_KERN_NAL},
-        {"cray_user_nal", CRAY_USER_NAL},
-        {"cray_qk_nal",   CRAY_QK_NAL},
-#endif
-        {NULL,         -1}
-};
-
-static cfg_record_cb_t g_record_cb;
+static int   g_net_set;
+static __u32 g_net;
 
 /* Convert a string boolean to an int; "enable" -> 1 */
-int ptl_parse_bool (int *b, char *str) {
+int 
+ptl_parse_bool (int *b, char *str) 
+{
         if (!strcasecmp (str, "no") ||
             !strcasecmp (str, "n") ||
             !strcasecmp (str, "off") ||
@@ -116,116 +91,18 @@ int ptl_parse_bool (int *b, char *str) {
         return (-1);
 }
 
-/* Convert human readable size string to and int; "1k" -> 1000 */
-int ptl_parse_size (int *sizep, char *str) {
-        int size;
-        char mod[32];
-
-        switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) {
-        default:
-                return (-1);
-
-        case 1:
-                *sizep = size;
-                return (0);
-
-        case 2:
-                switch (*mod) {
-                case 'g':
-                case 'G':
-                        *sizep = size << 30;
-                        return (0);
-
-                case 'm':
-                case 'M':
-                        *sizep = size << 20;
-                        return (0);
-
-                case 'k':
-                case 'K':
-                        *sizep = size << 10;
-                        return (0);
-
-                default:
-                        *sizep = size;
-                        return (0);
-                }
-        }
-}
-
-int 
-ptl_set_cfg_record_cb(cfg_record_cb_t cb)
-{
-        g_record_cb = cb;
-        return 0;
-}
-
-int 
-pcfg_ioctl(struct portals_cfg *pcfg) 
-{
-        int rc;
-
-        if (pcfg->pcfg_nal ==0)
-                pcfg->pcfg_nal    = g_nal;
-
-        if (g_record_cb) {
-                rc = g_record_cb(PORTALS_CFG_TYPE, sizeof(*pcfg), pcfg);
-        } else {
-                struct portal_ioctl_data data;
-                PORTAL_IOC_INIT (data);
-                data.ioc_pbuf1   = (char*)pcfg;
-                data.ioc_plen1   = sizeof(*pcfg);
-                /* XXX liblustre hack XXX */
-                data.ioc_nal_cmd = pcfg->pcfg_command;
-                data.ioc_nid = pcfg->pcfg_nid;
-
-                rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data);
-
-                if (rc == 0 && pcfg->pcfg_version != PORTALS_CFG_VERSION)
-                        return -EINVAL;
-        }
-
-        return (rc);
-}
-
-
-
-static name2num_t *
-name2num_lookup_name (name2num_t *table, char *str)
-{
-        while (table->name != NULL)
-                if (!strcmp (str, table->name))
-                        return (table);
-                else
-                        table++;
-        return (NULL);
-}
-
-static name2num_t *
-name2num_lookup_num (name2num_t *table, int num)
-{
-        while (table->name != NULL)
-                if (num == table->num)
-                        return (table);
-                else
-                        table++;
-        return (NULL);
-}
-
 int
-ptl_name2nal (char *str)
-{
-        name2num_t *e = name2num_lookup_name (nalnames, str);
-
-        return ((e == NULL) ? -1 : e->num);
-}
-
-static char *
-nal2name (int nal)
+ptl_parse_port (int *port, char *str)
 {
-        name2num_t *e = name2num_lookup_num (nalnames, nal);
+        char      *end;
+        
+        *port = strtol (str, &end, 0);
 
-        return ((e == NULL) ? "???" : e->name);
+        if (*end == 0 &&                        /* parsed whole string */
+            *port > 0 && *port < 65536)         /* minimal sanity check */
+                return (0);
+        
+        return (-1);
 }
 
 #ifdef HAVE_GETHOSTBYNAME
@@ -252,49 +129,6 @@ ptl_gethostbyname(char * hname) {
 #endif
 
 int
-ptl_parse_port (int *port, char *str)
-{
-        char      *end;
-        
-        *port = strtol (str, &end, 0);
-
-        if (*end == 0 &&                        /* parsed whole string */
-            *port > 0 && *port < 65536)         /* minimal sanity check */
-                return (0);
-        
-        return (-1);
-}
-
-int
-ptl_parse_time (time_t *t, char *str) 
-{
-        char          *end;
-        int            n;
-        struct tm      tm;
-        
-        *t = strtol (str, &end, 0);
-        if (*end == 0) /* parsed whole string */
-                return (0);
-        
-        memset (&tm, 0, sizeof (tm));
-        n = sscanf (str, "%d-%d-%d-%d:%d:%d",
-                    &tm.tm_year, &tm.tm_mon, &tm.tm_mday, 
-                    &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
-        if (n != 6)
-                return (-1);
-        
-        tm.tm_mon--;                    /* convert to 0 == Jan */
-        tm.tm_year -= 1900;             /* y2k quirk */
-        tm.tm_isdst = -1;               /* dunno if it's daylight savings... */
-        
-        *t = mktime (&tm);
-        if (*t == (time_t)-1)
-                return (-1);
-                        
-        return (0);
-}
-
-int
 ptl_parse_ipquad (__u32 *ipaddrp, char *str)
 {
         int             a;
@@ -366,225 +200,193 @@ ptl_ipaddr_2_str (__u32 ipaddr, char *str, int lookup)
 }
 
 int
-ptl_parse_nid (ptl_nid_t *nidp, char *str)
+ptl_parse_time (time_t *t, char *str) 
 {
-        __u32               ipaddr;
-        char               *end;
-        unsigned long long  ullval;
+        char          *end;
+        int            n;
+        struct tm      tm;
         
-        if (ptl_parse_ipaddr (&ipaddr, str) == 0) {
-#if !CRAY_PORTALS
-                *nidp = (ptl_nid_t)ipaddr;
-#else
-                *nidp = (((ptl_nid_t)ipaddr & PNAL_HOSTID_MASK) << PNAL_VNODE_SHIFT);
-#endif
-                return (0);
-        }
-
-        ullval = strtoull(str, &end, 0);
-        if (end != str && *end == 0) {
-                /* parsed whole non-empty string */
-                *nidp = (ptl_nid_t)ullval;
+        *t = strtol (str, &end, 0);
+        if (*end == 0) /* parsed whole string */
                 return (0);
-        }
-
-        return (-1);
+        
+        memset (&tm, 0, sizeof (tm));
+        n = sscanf (str, "%d-%d-%d-%d:%d:%d",
+                    &tm.tm_year, &tm.tm_mon, &tm.tm_mday, 
+                    &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
+        if (n != 6)
+                return (-1);
+        
+        tm.tm_mon--;                    /* convert to 0 == Jan */
+        tm.tm_year -= 1900;             /* y2k quirk */
+        tm.tm_isdst = -1;               /* dunno if it's daylight savings... */
+        
+        *t = mktime (&tm);
+        if (*t == (time_t)-1)
+                return (-1);
+                        
+        return (0);
 }
 
-int
-ptl_parse_anynid (ptl_nid_t *nidp, char *str)
+#if CRAY_PORTALS
+void cray_not_compatible_msg(char *cmd) 
 {
-        if (!strcmp (str, "_all_")) {
-                *nidp = PTL_NID_ANY;
-                return 0;
-        }
-
-        return ptl_parse_nid(nidp, str);
+        /* Don't complain verbosely if we've not been passed a command
+         * name to complain about! */
+        if (cmd != NULL) 
+                fprintf(stderr, 
+                        "Command %s not compatible with CRAY portals\n",
+                        cmd);
 }
 
-__u64 ptl_nid2u64(ptl_nid_t nid)
+int g_net_is_set (char *cmd)
 {
-        switch (sizeof (nid)) {
-        case 8:
-                return (nid);
-        case 4:
-                return ((__u32)nid);
-        default:
-                fprintf(stderr, "Unexpected sizeof(ptl_nid_t) == %u\n", sizeof(nid));
-                abort();
-                /* notreached */
-                return (-1);
-        }
+        cray_not_compatible_msg(cmd);
+        return 0;
 }
 
-char *
-ptl_nid2str (char *buffer, ptl_nid_t nid)
+int g_net_is_compatible (char *cmd, ...)
 {
-        __u64           nid64 = ptl_nid2u64(nid);
-#ifdef HAVE_GETHOSTBYNAME
-        struct hostent *he = 0;
-
-        /* Don't try to resolve NIDs that are e.g. Elan host IDs.  Assume
-         * TCP addresses in the 0.x.x.x subnet are not in use.  This can
-         * happen on routers and slows things down a _lot_.  Bug 3442. */
-        if (nid & 0xff000000) {
-                __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */
-
-                he = gethostbyaddr((const char *)&addr, sizeof(addr), AF_INET);
-        }
-
-        if (he != NULL)
-                sprintf(buffer, "%#x:%s", (int)(nid64 >> 32), he->h_name);
-        else
-#endif /* HAVE_GETHOSTBYNAME */
-                sprintf(buffer, LPX64, nid64);
-
-        return (buffer);
+        cray_not_compatible_msg(cmd);
+        return 0;
 }
-
-int g_nal_is_set (
+#else
+int g_net_is_set (char *cmd
 {
-        if (g_nal == 0) {
-                fprintf (stderr, "Error: you must run the 'network' command first.\n");
-                return (0);
-        }
-
-        return (1);
+        if (g_net_set)
+                return 1;
+        
+        if (cmd != NULL)
+                fprintf(stderr, 
+                        "You must run the 'network' command before '%s'.\n",
+                        cmd);
+        return 0;
 }
 
-int g_nal_is_compatible (char *cmd, ...)
+int g_net_is_compatible (char *cmd, ...)
 {
         va_list       ap;
         int           nal;
 
-        if (!g_nal_is_set ())
-                return (0);
+        if (!g_net_is_set(cmd))
+                return 0;
 
-        va_start (ap, cmd);
+        va_start(ap, cmd);
 
         do {
                 nal = va_arg (ap, int);
-        } while (nal != 0 && nal != g_nal);
+                if (nal == PTL_NETNAL(g_net)) {
+                        va_end (ap);
+                        return 1;
+                }
+        } while (nal != 0);
         
         va_end (ap);
         
-        if (g_nal == nal)
-                return (1);
-
-        if (cmd != NULL) {
-                /* Don't complain verbosely if we've not been passed a command
-                 * name to complain about! */
-                fprintf (stderr, "Command %s not compatible with nal %s\n",
-                         cmd, nal2name (g_nal));
-        }
-        return (0);
+        if (cmd != NULL)
+                fprintf (stderr, 
+                         "Command %s not compatible with %s NAL\n",
+                         cmd, 
+                         libcfs_nal2str(PTL_NETNAL(g_net)));
+        return 0;
 }
+#endif
 
-int
-sock_write (int cfd, void *buffer, int nob)
+int ptl_initialize(int argc, char **argv) 
 {
-        while (nob > 0)
-        {
-                int rc = write (cfd, buffer, nob);
+        register_ioc_dev(PORTALS_DEV_ID, PORTALS_DEV_PATH);
+        return 0;
+}
 
-                if (rc < 0)
-                {
-                        if (errno == EINTR)
-                                continue;
-                        
-                        return (rc);
-                }
 
-                if (rc == 0)
-                {
-                        fprintf (stderr, "Unexpected zero sock_write\n");
-                        abort();
+int jt_ptl_network(int argc, char **argv)
+{
+#if CRAY_PORTALS
+        cray_not_compatible_msg(argv[0]);
+        return -1;
+#else
+        struct portal_ioctl_data data;
+        __u32                    net = PTL_NIDNET(PTL_NID_ANY);
+        int                      set = argc >= 2;
+        int                      count;
+        int                      rc;
+        
+        if (set) {
+                net = libcfs_str2net(argv[1]);
+                if (net == PTL_NIDNET(PTL_NID_ANY)) {
+                        fprintf(stderr, "Can't parse net %s\n", argv[1]);
+                        return -1;
                 }
-
-                nob -= rc;
-                buffer = (char *)buffer + nob;
         }
-        
-        return (0);
-}
 
-int
-sock_read (int cfd, void *buffer, int nob)
-{
-        while (nob > 0)
-        {
-                int rc = read (cfd, buffer, nob);
-                
-                if (rc < 0)
-                {
-                        if (errno == EINTR)
+        for (count = 0;; count++) {
+                PORTAL_IOC_INIT (data);
+                data.ioc_count = count;
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NI, &data);
+
+                if (rc >= 0) {
+                        if (!set) {
+                                printf("%s\n", libcfs_nid2str(data.ioc_nid));
                                 continue;
+                        }
                         
-                        return (rc);
-                }
-                
-                if (rc == 0)                    /* EOF */
-                {
-                        errno = ECONNABORTED;
-                        return (-1);
+                        if (net == PTL_NIDNET(data.ioc_nid)) {
+                                g_net_set = 1;
+                                return 0;
+                        }
+                        continue;
                 }
-                
-                nob -= rc;
-                buffer = (char *)buffer + nob;
-        }
-        
-        return (0);
-}
-
-int ptl_initialize(int argc, char **argv) 
-{
-        register_ioc_dev(PORTALS_DEV_ID, PORTALS_DEV_PATH);
-        return 0;
-}
 
+                if (errno == ENOENT)
+                        break;
 
-int jt_ptl_network(int argc, char **argv)
-{
-        name2num_t *entry;
-        int         nal;
+                fprintf(stderr,"IOC_PORTAL_GET_NI error %d: %s\n",
+                        errno, strerror(errno));
+                return -1;
+        }
         
-        if (argc == 2 &&
-            (nal = ptl_name2nal (argv[1])) >= 0) {
-                g_nal = nal;
-                return (0);
+        if (!set) {
+                if (count == 0) 
+                        printf("<no networks>\n");
+                return 0;
         }
-                
-        fprintf(stderr, "usage: %s \n", argv[0]);
-        for (entry = nalnames; entry->name != NULL; entry++)
-                fprintf (stderr, "%s%s", entry == nalnames ? "<" : "|", entry->name);
-        fprintf(stderr, ">\n");
-        return (-1);
+
+        if (count == 0) {
+                fprintf(stderr,"No local networks\n");
+                return -1;
+        }
+        
+        fprintf(stderr,"%s not a local network (%s on its own to list)\n",
+                argv[1]);
+        return -1;
+#endif
 }
 
 int
 jt_ptl_print_interfaces (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         char                     buffer[3][64];
         int                      index;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, 0))
+        if (!g_net_is_compatible (argv[0], SOCKNAL, 0))
                 return -1;
 
         for (index = 0;;index++) {
-                PCFG_INIT (pcfg, NAL_CMD_GET_INTERFACE);
-                pcfg.pcfg_count = index;
-
-                rc = pcfg_ioctl (&pcfg);
+                PORTAL_IOC_INIT(data);
+                data.ioc_net   = g_net;
+                data.ioc_count = index;
+                
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_INTERFACE, &data);
                 if (rc != 0)
                         break;
 
                 printf ("%s: (%s/%s) npeer %d nroute %d\n",
-                        ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[2], 1),
-                        ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[0], 0),
-                        ptl_ipaddr_2_str(pcfg.pcfg_misc, buffer[1], 0),
-                        pcfg.pcfg_fd, pcfg.pcfg_count);
+                        ptl_ipaddr_2_str(data.ioc_u32[0], buffer[2], 1),
+                        ptl_ipaddr_2_str(data.ioc_u32[0], buffer[0], 0),
+                        ptl_ipaddr_2_str(data.ioc_u32[1], buffer[1], 0),
+                        data.ioc_u32[2], data.ioc_u32[3]);
         }
 
         if (index == 0) {
@@ -603,7 +405,7 @@ jt_ptl_print_interfaces (int argc, char **argv)
 int
 jt_ptl_add_interface (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         __u32                    ipaddr;
         int                      rc;
         __u32                    netmask = 0xffffff00;
@@ -616,7 +418,7 @@ jt_ptl_add_interface (int argc, char **argv)
                 return 0;
         }
 
-        if (!g_nal_is_compatible(argv[0], SOCKNAL, 0))
+        if (!g_net_is_compatible(argv[0], SOCKNAL, 0))
                 return -1;
 
         if (ptl_parse_ipaddr(&ipaddr, argv[1]) != 0) {
@@ -636,11 +438,12 @@ jt_ptl_add_interface (int argc, char **argv)
                 }
         }
 
-        PCFG_INIT(pcfg, NAL_CMD_ADD_INTERFACE);
-        pcfg.pcfg_id     = ipaddr;
-        pcfg.pcfg_misc   = netmask;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net    = g_net;
+        data.ioc_u32[0] = ipaddr;
+        data.ioc_u32[1] = netmask;
 
-        rc = pcfg_ioctl (&pcfg);
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_INTERFACE, &data);
         if (rc != 0) {
                 fprintf (stderr, "failed to add interface: %s\n",
                          strerror (errno));
@@ -653,7 +456,7 @@ jt_ptl_add_interface (int argc, char **argv)
 int
 jt_ptl_del_interface (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         int                      rc;
         __u32                    ipaddr = 0;
 
@@ -662,7 +465,7 @@ jt_ptl_del_interface (int argc, char **argv)
                 return 0;
         }
 
-        if (!g_nal_is_compatible(argv[0], SOCKNAL, 0))
+        if (!g_net_is_compatible(argv[0], SOCKNAL, 0))
                 return -1;
 
         if (argc == 2 &&
@@ -671,10 +474,11 @@ jt_ptl_del_interface (int argc, char **argv)
                 return -1;
         }
         
-        PCFG_INIT(pcfg, NAL_CMD_DEL_INTERFACE);
-        pcfg.pcfg_id = ipaddr;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net    = g_net;
+        data.ioc_u32[0] = ipaddr;
 
-        rc = pcfg_ioctl (&pcfg);
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_INTERFACE, &data);
         if (rc != 0) {
                 fprintf (stderr, "failed to delete interface: %s\n",
                          strerror (errno));
@@ -687,37 +491,40 @@ jt_ptl_del_interface (int argc, char **argv)
 int
 jt_ptl_print_peers (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         char                     buffer[2][64];
         int                      index;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL, 
+        if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL, 
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return -1;
 
         for (index = 0;;index++) {
-                PCFG_INIT (pcfg, NAL_CMD_GET_PEER);
-                pcfg.pcfg_count   = index;
-
-                rc = pcfg_ioctl (&pcfg);
+                PORTAL_IOC_INIT(data);
+                data.ioc_net     = g_net;
+                data.ioc_count   = index;
+                
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_PEER, &data);
                 if (rc != 0)
                         break;
 
-                if (g_nal_is_compatible(NULL, SOCKNAL, 0))
+                if (g_net_is_compatible(NULL, SOCKNAL, 0))
                         printf (LPX64"[%d]%s@%s:%d #%d\n",
-                                pcfg.pcfg_nid, pcfg.pcfg_wait,
-                                ptl_ipaddr_2_str (pcfg.pcfg_size, buffer[0], 1),
-                                ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
-                                pcfg.pcfg_misc, pcfg.pcfg_count);
-                else if (g_nal_is_compatible(NULL, RANAL, OPENIBNAL, VIBNAL, 0))
+                                data.ioc_nid, 
+                                data.ioc_count, /* persistence */
+                                ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* my ip */
+                                ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+                                data.ioc_u32[1], /* peer port */
+                                data.ioc_u32[3]); /* conn_count */
+                else if (g_net_is_compatible(NULL, RANAL, OPENIBNAL, VIBNAL, 0))
                         printf (LPX64"[%d]@%s:%d\n",
-                                pcfg.pcfg_nid, pcfg.pcfg_wait,
-                                ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1),
-                                pcfg.pcfg_misc);
+                                data.ioc_nid, data.ioc_count,
+                                ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* peer ip */
+                                data.ioc_u32[1]); /* peer port */
                 else
                         printf (LPX64"[%d]\n",
-                                pcfg.pcfg_nid, pcfg.pcfg_wait);
+                                data.ioc_nid, data.ioc_count);
         }
 
         if (index == 0) {
@@ -735,23 +542,23 @@ jt_ptl_print_peers (int argc, char **argv)
 int 
 jt_ptl_add_peer (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         ptl_nid_t                nid;
         __u32                    ip = 0;
         int                      port = 0;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL, 
+        if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL, 
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return -1;
 
-        if (g_nal_is_compatible(NULL, SOCKNAL, OPENIBNAL, RANAL, 0)) {
+        if (g_net_is_compatible(NULL, SOCKNAL, OPENIBNAL, RANAL, 0)) {
                 if (argc != 4) {
                         fprintf (stderr, "usage(tcp,openib,ra): %s nid ipaddr port\n", 
                                  argv[0]);
                         return 0;
                 }
-        } else if (g_nal_is_compatible(NULL, VIBNAL, 0)) {
+        } else if (g_net_is_compatible(NULL, VIBNAL, 0)) {
                 if (argc != 3) {
                         fprintf (stderr, "usage(vib): %s nid ipaddr\n", 
                                  argv[0]);
@@ -762,30 +569,31 @@ jt_ptl_add_peer (int argc, char **argv)
                 return 0;
         }
 
-        if (ptl_parse_nid (&nid, argv[1]) != 0 ||
-                nid == PTL_NID_ANY) {
+        nid = libcfs_str2nid(argv[1]);
+        if (nid == PTL_NID_ANY) {
                 fprintf (stderr, "Can't parse NID: %s\n", argv[1]);
                 return -1;
         }
 
-        if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, VIBNAL, RANAL, 0) &&
+        if (g_net_is_compatible (NULL, SOCKNAL, OPENIBNAL, VIBNAL, RANAL, 0) &&
             ptl_parse_ipaddr (&ip, argv[2]) != 0) {
                 fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]);
                 return -1;
         }
 
-        if (g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, RANAL, 0) &&
+        if (g_net_is_compatible (NULL, SOCKNAL, OPENIBNAL, RANAL, 0) &&
             ptl_parse_port (&port, argv[3]) != 0) {
                 fprintf (stderr, "Can't parse port: %s\n", argv[3]);
                 return -1;
         }
 
-        PCFG_INIT(pcfg, NAL_CMD_ADD_PEER);
-        pcfg.pcfg_nid     = nid;
-        pcfg.pcfg_id      = ip;
-        pcfg.pcfg_misc    = port;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net    = g_net;
+        data.ioc_nid    = nid;
+        data.ioc_u32[0] = ip;
+        data.ioc_u32[1] = port;
 
-        rc = pcfg_ioctl (&pcfg);
+        rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_ADD_PEER, &data);
         if (rc != 0) {
                 fprintf (stderr, "failed to add peer: %s\n",
                          strerror (errno));
@@ -798,60 +606,47 @@ jt_ptl_add_peer (int argc, char **argv)
 int 
 jt_ptl_del_peer (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         ptl_nid_t                nid = PTL_NID_ANY;
         __u32                    ip = 0;
-        int                      single_share = 0;
-        int                      argidx;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL, 
+        if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL, 
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return -1;
 
-        if (g_nal_is_compatible(NULL, SOCKNAL, 0)) {
-                if (argc > 4) {
-                        fprintf (stderr, "usage: %s [nid] [ipaddr] [single_share]\n",
+        if (g_net_is_compatible(NULL, SOCKNAL, 0)) {
+                if (argc > 3) {
+                        fprintf (stderr, "usage: %s [nid] [ipaddr]\n",
                                  argv[0]);
                         return 0;
                 }
-        } else if (argc > 3) {
-                fprintf (stderr, "usage: %s [nid] [single_share]\n", argv[0]);
+        } else if (argc > 2) {
+                fprintf (stderr, "usage: %s [nid]\n", argv[0]);
                 return 0;
         }
                 
         if (argc > 1 &&
-            ptl_parse_anynid (&nid, argv[1]) != 0) {
+            !libcfs_str2anynid(&nid, argv[1])) {
                 fprintf (stderr, "Can't parse nid: %s\n", argv[1]);
                 return -1;
         }
 
-        argidx = 2;
-        if (g_nal_is_compatible(NULL, SOCKNAL, 0)) {
-                if (argc > argidx &&
-                    ptl_parse_ipaddr (&ip, argv[argidx]) != 0) {
+        if (g_net_is_compatible(NULL, SOCKNAL, 0)) {
+                if (argc > 2 &&
+                    ptl_parse_ipaddr (&ip, argv[2]) != 0) {
                         fprintf (stderr, "Can't parse ip addr: %s\n",
-                                 argv[argidx]);
+                                 argv[2]);
                         return -1;
                 }
-                argidx++;
         }
         
-        if (argc > argidx) {
-                if (!strcmp (argv[argidx], "single_share")) {
-                        single_share = 1;
-                } else {
-                        fprintf (stderr, "Unrecognised arg %s'\n", argv[3]);
-                        return -1;
-                }
-        }
-
-        PCFG_INIT(pcfg, NAL_CMD_DEL_PEER);
-        pcfg.pcfg_nid = nid;
-        pcfg.pcfg_id = ip;
-        pcfg.pcfg_flags = single_share;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net    = g_net;
+        data.ioc_nid    = nid;
+        data.ioc_u32[0] = ip;
 
-        rc = pcfg_ioctl (&pcfg);
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_PEER, &data);
         if (rc != 0) {
                 fprintf (stderr, "failed to remove peer: %s\n",
                          strerror (errno));
@@ -864,44 +659,45 @@ jt_ptl_del_peer (int argc, char **argv)
 int 
 jt_ptl_print_connections (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         char                     buffer[2][64];
         int                      index;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, RANAL, 
+        if (!g_net_is_compatible (argv[0], SOCKNAL, RANAL, 
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return -1;
 
         for (index = 0; ; index++) {
-                PCFG_INIT (pcfg,  NAL_CMD_GET_CONN);
-                pcfg.pcfg_count   = index;
+                PORTAL_IOC_INIT(data);
+                data.ioc_net     = g_net;
+                data.ioc_count   = index;
                 
-                rc = pcfg_ioctl (&pcfg);
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_CONN, &data);
                 if (rc != 0)
                         break;
 
-                if (g_nal_is_compatible (NULL, SOCKNAL, 0))
+                if (g_net_is_compatible (NULL, SOCKNAL, 0))
                         printf ("[%d]%s:"LPX64"@%s:%d:%s %d/%d %s\n",
-                                pcfg.pcfg_gw_nal,       /* scheduler */
-                                ptl_ipaddr_2_str (pcfg.pcfg_fd, buffer[0], 1), /* local IP addr */
-                                pcfg.pcfg_nid, 
-                                ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1), /* remote IP addr */
-                                pcfg.pcfg_misc,         /* remote port */
-                                (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" :
-                                (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" :
-                                (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" :
-                                (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?",
-                                pcfg.pcfg_count,        /* tx buffer size */
-                                pcfg.pcfg_size,         /* rx buffer size */
-                                pcfg.pcfg_wait ? "nagle" : "nonagle");
-                else if (g_nal_is_compatible (NULL, RANAL, 0))
-                        printf ("[%d]"LPX64"\n",
-                                pcfg.pcfg_id,       /* device id */
-                                pcfg.pcfg_nid);
+                                data.ioc_u32[4], /* scheduler */
+                                ptl_ipaddr_2_str (data.ioc_u32[2], buffer[0], 1), /* local IP addr */
+                                data.ioc_nid, 
+                                ptl_ipaddr_2_str (data.ioc_u32[0], buffer[1], 1), /* remote IP addr */
+                                data.ioc_u32[1],         /* remote port */
+                                (data.ioc_u32[3] == SOCKNAL_CONN_ANY) ? "A" :
+                                (data.ioc_u32[3] == SOCKNAL_CONN_CONTROL) ? "C" :
+                                (data.ioc_u32[3] == SOCKNAL_CONN_BULK_IN) ? "I" :
+                                (data.ioc_u32[3] == SOCKNAL_CONN_BULK_OUT) ? "O" : "?",
+                                data.ioc_count, /* tx buffer size */
+                                data.ioc_u32[5], /* rx buffer size */
+                                data.ioc_flags ? "nagle" : "nonagle");
+                else if (g_net_is_compatible (NULL, RANAL, 0))
+                        printf ("[%d]"LPX64"@%s:%d\n",
+                                data.ioc_u32[0], /* device id */
+                                data.ioc_nid);
                 else
                         printf (LPX64"\n",
-                                pcfg.pcfg_nid);
+                                data.ioc_nid);
         }
 
         if (index == 0) {
@@ -918,7 +714,7 @@ jt_ptl_print_connections (int argc, char **argv)
 
 int jt_ptl_disconnect(int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         ptl_nid_t                nid = PTL_NID_ANY;
         __u32                    ipaddr = 0;
         int                      rc;
@@ -928,29 +724,30 @@ int jt_ptl_disconnect(int argc, char **argv)
                 return 0;
         }
 
-        if (!g_nal_is_compatible (NULL, SOCKNAL, RANAL, 
+        if (!g_net_is_compatible (NULL, SOCKNAL, RANAL, 
                                   OPENIBNAL, IIBNAL, VIBNAL, 0))
                 return 0;
 
         if (argc >= 2 &&
-            ptl_parse_anynid (&nid, argv[1]) != 0) {
+            !libcfs_str2anynid(&nid, argv[1])) {
                 fprintf (stderr, "Can't parse nid %s\n", argv[1]);
                 return -1;
         }
 
-        if (g_nal_is_compatible (NULL, SOCKNAL, 0) &&
+        if (g_net_is_compatible (NULL, SOCKNAL, 0) &&
             argc >= 3 &&
             ptl_parse_ipaddr (&ipaddr, argv[2]) != 0) {
                 fprintf (stderr, "Can't parse ip addr %s\n", argv[2]);
                 return -1;
         }
 
-        PCFG_INIT(pcfg, NAL_CMD_CLOSE_CONNECTION);
-        pcfg.pcfg_nid     = nid;
-        pcfg.pcfg_id      = ipaddr;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net     = g_net;
+        data.ioc_nid     = nid;
+        data.ioc_u32[0]  = ipaddr;
         
-        rc = pcfg_ioctl(&pcfg);
-        if (rc) {
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_CLOSE_CONNECTION, &data);
+        if (rc != 0) {
                 fprintf(stderr, "failed to remove connection: %s\n",
                         strerror(errno));
                 return -1;
@@ -961,36 +758,30 @@ int jt_ptl_disconnect(int argc, char **argv)
 
 int jt_ptl_push_connection (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         int                      rc;
         ptl_nid_t                nid = PTL_NID_ANY;
-        __u32                    ipaddr = 0;
 
-        if (argc > 3) {
-                fprintf(stderr, "usage: %s [nid] [ip]\n", argv[0]);
+        if (argc > 2) {
+                fprintf(stderr, "usage: %s [nid]\n", argv[0]);
                 return 0;
         }
 
-        if (!g_nal_is_compatible (argv[0], SOCKNAL, 0))
+        if (!g_net_is_compatible (argv[0], SOCKNAL, 0))
                 return -1;
         
         if (argc > 1 &&
-            ptl_parse_anynid (&nid, argv[1]) != 0) {
+            !libcfs_str2anynid(&nid, argv[1])) {
                 fprintf(stderr, "Can't parse nid: %s\n", argv[1]);
                 return -1;
         }
                         
-        if (argc > 2 &&
-            ptl_parse_ipaddr (&ipaddr, argv[2]) != 0) {
-                fprintf(stderr, "Can't parse ipaddr: %s\n", argv[2]);
-        }
-
-        PCFG_INIT(pcfg, NAL_CMD_PUSH_CONNECTION);
-        pcfg.pcfg_nid     = nid;
-        pcfg.pcfg_id      = ipaddr;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net     = g_net;
+        data.ioc_nid     = nid;
         
-        rc = pcfg_ioctl(&pcfg);
-        if (rc) {
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_PUSH_CONNECTION, &data);
+        if (rc != 0) {
                 fprintf(stderr, "failed to push connection: %s\n",
                         strerror(errno));
                 return -1;
@@ -1002,33 +793,32 @@ int jt_ptl_push_connection (int argc, char **argv)
 int 
 jt_ptl_print_active_txs (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         int                      index;
         int                      rc;
 
-        if (!g_nal_is_compatible (argv[0], QSWNAL, 0))
+        if (!g_net_is_compatible (argv[0], QSWNAL, 0))
                 return -1;
 
         for (index = 0;;index++) {
-                PCFG_INIT(pcfg, NAL_CMD_GET_TXDESC);
-                pcfg.pcfg_count   = index;
-        
-                rc = pcfg_ioctl(&pcfg);
+                PORTAL_IOC_INIT(data);
+                data.ioc_net   = g_net;
+                data.ioc_count = index;
+
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_TXDESC, &data);
                 if (rc != 0)
                         break;
 
-                printf ("%5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n",
-                        pcfg.pcfg_count == PTL_MSG_ACK ? "ACK" :
-                        pcfg.pcfg_count == PTL_MSG_PUT ? "PUT" :
-                        pcfg.pcfg_count == PTL_MSG_GET ? "GET" :
-                        pcfg.pcfg_count == PTL_MSG_REPLY ? "REPLY" : "<weird message>",
-                        pcfg.pcfg_size,
-                        pcfg.pcfg_nid,
-                        pcfg.pcfg_nid2,
-                        pcfg.pcfg_misc,
-                        (pcfg.pcfg_flags & 1) ? "delayed" : "immediate",
-                        (pcfg.pcfg_flags & 2) ? "nblk"    : "normal",
-                        pcfg.pcfg_flags >> 2);
+                printf ("type %u payload %6d to %s via %s by pid %6d: "
+                        "%s, %s, state %d\n",
+                        data.ioc_u32[0],
+                        data.ioc_count,
+                        data.ioc_nid,
+                        data.ioc_u64[0],
+                        data.ioc_u32[1],
+                        (data.ioc_flags & 1) ? "delayed" : "immediate",
+                        (data.ioc_flags & 2) ? "nblk"    : "normal",
+                        data.ioc_flags >> 2);
         }
 
         if (index == 0) {
@@ -1057,11 +847,8 @@ int jt_ptl_ping(int argc, char **argv)
                 return 0;
         }
 
-        if (!g_nal_is_set())
-                return -1;
-
-        if (ptl_parse_nid (&nid, argv[1]) != 0)
-        {
+        nid = libcfs_str2nid(argv[1]);
+        if (nid == PTL_NID_ANY) {
                 fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
                 return (-1);
         }
@@ -1085,10 +872,9 @@ int jt_ptl_ping(int argc, char **argv)
         
         PORTAL_IOC_INIT (data);
         data.ioc_count   = count;
-        data.ioc_size    = size;
         data.ioc_nid     = nid;
-        data.ioc_nal     = g_nal;
-        data.ioc_timeout = timeout;
+        data.ioc_u32[0]  = size;
+        data.ioc_u32[1]  = timeout;
         
         rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_PING, &data);
         if (rc) {
@@ -1099,74 +885,40 @@ int jt_ptl_ping(int argc, char **argv)
         return 0;
 }
 
-int jt_ptl_shownid(int argc, char **argv)
-{
-        struct portal_ioctl_data data;
-        int                      rc;
-        
-        if (argc > 1) {
-                fprintf(stderr, "usage: %s\n", argv[0]);
-                return 0;
-        }
-        
-        if (!g_nal_is_set())
-                return -1;
-
-        PORTAL_IOC_INIT (data);
-        data.ioc_nal = g_nal;
-        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NID, &data);
-        if (rc < 0)
-                fprintf(stderr, "getting my NID failed: %s\n",
-                        strerror (errno));
-        else
-                printf(LPX64"\n", data.ioc_nid);
-        return 0;
-}
-
 int jt_ptl_mynid(int argc, char **argv)
 {
+#if CRAY_PORTALS
+        fprintf(stderr, "command %s not supported\n", argv[0]);
+        return -1;
+#else
+        struct portal_ioctl_data data;
+        ptl_nid_t                nid;
         int rc;
-        char hostname[1024];
-        char *nidstr;
-        struct portals_cfg pcfg;
-        ptl_nid_t mynid;
 
-        if (argc > 2) {
-                fprintf(stderr, "usage: %s [NID]\n", argv[0]);
-                fprintf(stderr, "NID defaults to the primary IP address of the machine.\n");
+        if (argc != 2) {
+                fprintf(stderr, "usage: %s NID\n", argv[0]);
                 return 0;
         }
 
-        if (!g_nal_is_set())
-                return -1;
-
-        if (argc >= 2)
-                nidstr = argv[1];
-        else if (gethostname(hostname, sizeof(hostname)) != 0) {
-                fprintf(stderr, "gethostname failed: %s\n",
-                        strerror(errno));
+        nid = libcfs_str2nid(argv[1]);
+        if (nid == PTL_NID_ANY) {
+                fprintf(stderr, "Can't parse NID '%s'\n", argv[1]);
                 return -1;
         }
-        else
-                nidstr = hostname;
 
-        rc = ptl_parse_nid (&mynid, nidstr);
-        if (rc != 0) {
-                fprintf (stderr, "Can't convert '%s' into a NID\n", nidstr);
-                return -1;
-        }
-        
-        PCFG_INIT(pcfg, NAL_CMD_REGISTER_MYNID);
-        pcfg.pcfg_nid = mynid;
+        PORTAL_IOC_INIT(data);
+        data.ioc_net = PTL_NIDNET(nid);
+        data.ioc_nid = nid;
 
-        rc = pcfg_ioctl(&pcfg);
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_REGISTER_MYNID, &data);
         if (rc < 0)
                 fprintf(stderr, "setting my NID failed: %s\n",
                        strerror(errno));
         else
-                printf("registered my nid "LPX64" (%s)\n", 
-                       ptl_nid2u64(mynid), hostname);
+                printf("registered my nid %s\n", libcfs_nid2str(nid));
+
         return 0;
+#endif
 }
 
 int
@@ -1179,30 +931,24 @@ jt_ptl_fail_nid (int argc, char **argv)
 
         if (argc < 2 || argc > 3)
         {
-                fprintf (stderr, "usage: %s nid|\"_all_\" [count (0 == mend)]\n", argv[0]);
+                fprintf (stderr, "usage: %s nid|\"*\" [count (0 == mend)]\n", argv[0]);
                 return (0);
         }
         
-        if (!g_nal_is_set())
-                return (-1);
-
-        if (!strcmp (argv[1], "_all_"))
-                nid = PTL_NID_ANY;
-        else if (ptl_parse_anynid (&nid, argv[1]) != 0)
+        if (!libcfs_str2anynid(&nid, argv[1]))
         {
                 fprintf (stderr, "Can't parse nid \"%s\"\n", argv[1]);
                 return (-1);
         }
 
-        if (argc < 3)
+        if (argc < 3) {
                 threshold = PTL_MD_THRESH_INF;
-        else if (sscanf (argv[2], "%i", &threshold) != 1) {
+        else if (sscanf (argv[2], "%i", &threshold) != 1) {
                 fprintf (stderr, "Can't parse count \"%s\"\n", argv[2]);
                 return (-1);
         }
         
         PORTAL_IOC_INIT (data);
-        data.ioc_nal = g_nal;
         data.ioc_nid = nid;
         data.ioc_count = threshold;
         
@@ -1219,52 +965,32 @@ jt_ptl_fail_nid (int argc, char **argv)
 int
 jt_ptl_add_route (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
-        ptl_nid_t                nid1;
-        ptl_nid_t                nid2;
+        struct portal_ioctl_data data;
         ptl_nid_t                gateway_nid;
         int                      rc;
         
-        if (argc < 3)
+        if (argc != 2)
         {
-                fprintf (stderr, "usage: %s gateway target [target]\n", argv[0]);
+                fprintf (stderr, "usage: %s gateway\n", argv[0]);
                 return (0);
         }
 
-        if (!g_nal_is_set())
+        if (!g_net_is_set(argv[0]))
                 return (-1);
 
-        if (ptl_parse_nid (&gateway_nid, argv[1]) != 0)
-        {
+        gateway_nid = libcfs_str2nid(argv[1]);
+        if (gateway_nid == PTL_NID_ANY) {
                 fprintf (stderr, "Can't parse gateway NID \"%s\"\n", argv[1]);
                 return (-1);
         }
 
-        if (ptl_parse_nid (&nid1, argv[2]) != 0)
-        {
-                fprintf (stderr, "Can't parse first target NID \"%s\"\n", argv[2]);
-                return (-1);
-        }
-
-        if (argc < 4)
-                nid2 = nid1;
-        else if (ptl_parse_nid (&nid2, argv[3]) != 0)
-        {
-                fprintf (stderr, "Can't parse second target NID \"%s\"\n", argv[4]);
-                return (-1);
-        }
-
-        PCFG_INIT(pcfg, NAL_CMD_ADD_ROUTE);
-        pcfg.pcfg_nid = gateway_nid;
-        pcfg.pcfg_nal = ROUTER;
-        pcfg.pcfg_gw_nal = g_nal;
-        pcfg.pcfg_nid2 = MIN (nid1, nid2);
-        pcfg.pcfg_nid3 = MAX (nid1, nid2);
+        PORTAL_IOC_INIT(data);
+        data.ioc_net = g_net;
+        data.ioc_nid = gateway_nid;
 
-        rc = pcfg_ioctl(&pcfg);
-        if (rc != 0) 
-        {
-                fprintf (stderr, "NAL_CMD_ADD_ROUTE failed: %s\n", strerror (errno));
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_ADD_ROUTE, &data);
+        if (rc != 0) {
+                fprintf (stderr, "IOC_PORTAL_ADD_ROUTE failed: %s\n", strerror (errno));
                 return (-1);
         }
         
@@ -1274,62 +1000,29 @@ jt_ptl_add_route (int argc, char **argv)
 int
 jt_ptl_del_route (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         ptl_nid_t                nid;
-        ptl_nid_t                nid1 = PTL_NID_ANY;
-        ptl_nid_t                nid2 = PTL_NID_ANY;
         int                      rc;
         
-        if (argc < 2)
-        {
-                fprintf (stderr, "usage: %s targetNID\n", argv[0]);
+        if (argc != 2) {
+                fprintf (stderr, "usage: %s gatewayNID\n", argv[0]);
                 return (0);
         }
 
-        if (!g_nal_is_set())
-                return (-1);
-
-        if (ptl_parse_nid (&nid, argv[1]) != 0)
-        {
-                fprintf (stderr, "Can't parse gateway NID \"%s\"\n", argv[1]);
-                return (-1);
-        }
-
-        if (argc >= 3 &&
-            ptl_parse_nid (&nid1, argv[2]) != 0)
-        {
-                fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[2]);
-                return (-1);
+        if (!libcfs_str2anynid(&nid, argv[1])) {
+                fprintf (stderr, "Can't parse gateway NID "
+                         "\"%s\"\n", argv[1]);
+                return -1;
         }
 
-        if (argc < 4) {
-                nid2 = nid1;
-        } else {
-                if (ptl_parse_nid (&nid2, argv[3]) != 0) {
-                        fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[3]);
-                        return (-1);
-                }
+        PORTAL_IOC_INIT(data);
+        data.ioc_net = g_net;
+        data.ioc_nid = nid;
 
-                if (nid1 > nid2) {
-                        ptl_nid_t tmp = nid1;
-                        
-                        nid1 = nid2;
-                        nid2 = tmp;
-                }
-        }
-        
-        PCFG_INIT(pcfg, NAL_CMD_DEL_ROUTE);
-        pcfg.pcfg_nal = ROUTER;
-        pcfg.pcfg_gw_nal = g_nal;
-        pcfg.pcfg_nid = nid;
-        pcfg.pcfg_nid2 = nid1;
-        pcfg.pcfg_nid3 = nid2;
-
-        rc = pcfg_ioctl(&pcfg);
-        if (rc != 0) 
-        {
-                fprintf (stderr, "NAL_CMD_DEL_ROUTE ("LPX64") failed: %s\n", 
-                         ptl_nid2u64(nid), strerror (errno));
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_DEL_ROUTE, &data);
+        if (rc != 0) {
+                fprintf (stderr, "IOC_PORTAL_DEL_ROUTE (%s) failed: %s\n", 
+                         libcfs_nid2str(nid), strerror (errno));
                 return (-1);
         }
         
@@ -1339,7 +1032,7 @@ jt_ptl_del_route (int argc, char **argv)
 int
 jt_ptl_notify_router (int argc, char **argv)
 {
-        struct portals_cfg       pcfg;
+        struct portal_ioctl_data data;
         int                      enable;
         ptl_nid_t                nid;
         int                      rc;
@@ -1353,8 +1046,8 @@ jt_ptl_notify_router (int argc, char **argv)
                 return (0);
         }
 
-        if (ptl_parse_nid (&nid, argv[1]) != 0)
-        {
+        nid = libcfs_str2nid(argv[1]);
+        if (nid == PTL_NID_ANY) {
                 fprintf (stderr, "Can't parse target NID \"%s\"\n", argv[1]);
                 return (-1);
         }
@@ -1379,19 +1072,16 @@ jt_ptl_notify_router (int argc, char **argv)
                 return (-1);
         }
 
-        PCFG_INIT(pcfg, NAL_CMD_NOTIFY_ROUTER);
-        pcfg.pcfg_nal = ROUTER;
-        pcfg.pcfg_gw_nal = g_nal;
-        pcfg.pcfg_nid = nid;
-        pcfg.pcfg_flags = enable;
+        PORTAL_IOC_INIT(data);
+        data.ioc_nid = nid;
+        data.ioc_flags = enable;
         /* Yeuch; 'cept I need a __u64 on 64 bit machines... */
-        pcfg.pcfg_nid3 = (__u64)when;
+        data.ioc_u64[0] = (__u64)when;
         
-        rc = pcfg_ioctl(&pcfg);
-        if (rc != 0) 
-        {
-                fprintf (stderr, "NAL_CMD_NOTIFY_ROUTER ("LPX64") failed: %s\n",
-                         ptl_nid2u64(nid), strerror (errno));
+        rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NOTIFY_ROUTER, &data);
+        if (rc != 0) {
+                fprintf (stderr, "IOC_PORTAL_NOTIFY_ROUTER (%s) failed: %s\n",
+                         libcfs_nid2str(nid), strerror (errno));
                 return (-1);
         }
         
@@ -1401,44 +1091,35 @@ jt_ptl_notify_router (int argc, char **argv)
 int
 jt_ptl_print_routes (int argc, char **argv)
 {
-        char                      buffer[3][128];
-        struct portals_cfg        pcfg;
+        struct portal_ioctl_data  data;
         int                       rc;
         int                       index;
-        int                      gateway_nal;
-        ptl_nid_t                gateway_nid;
-        ptl_nid_t                nid1;
-        ptl_nid_t                nid2;
+        __u32                    net;
+        ptl_nid_t                nid;
         int                       alive;
 
         for (index = 0;;index++)
         {
-                PCFG_INIT(pcfg, NAL_CMD_GET_ROUTE);
-                pcfg.pcfg_nal = ROUTER;
-                pcfg.pcfg_count = index;
+                PORTAL_IOC_INIT(data);
+                data.ioc_count = index;
                 
-                rc = pcfg_ioctl(&pcfg);
+                rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_ROUTE, &data);
                 if (rc != 0)
                         break;
 
-                gateway_nal = pcfg.pcfg_gw_nal;
-                gateway_nid = pcfg.pcfg_nid;
-                nid1 = pcfg.pcfg_nid2;
-                nid2 = pcfg.pcfg_nid3;
-                alive = pcfg.pcfg_flags;
-
-                printf ("%8s %18s : %s - %s, %s\n", 
-                        nal2name (gateway_nal), 
-                        ptl_nid2str (buffer[0], gateway_nid),
-                        ptl_nid2str (buffer[1], nid1),
-                        ptl_nid2str (buffer[2], nid2),
+                net   = data.ioc_net;
+                nid   = data.ioc_nid;
+                alive = data.ioc_flags;
+
+                printf ("net %18s gw %32s %s\n", 
+                        libcfs_net2str(net), libcfs_nid2str(nid),
                         alive ? "up" : "down");
         }
 
-        if (index == 0 && errno != ENOENT) {
+        if (errno != ENOENT)
                 fprintf(stderr, "Error getting routes: %s: check dmesg.\n",
                         strerror(errno));
-        }
+
         return (0);
 }
 
@@ -1449,8 +1130,7 @@ lwt_control(int enable, int clear)
         int                      rc;
 
         PORTAL_IOC_INIT(data);
-        data.ioc_flags = enable;
-        data.ioc_misc = clear;
+        data.ioc_flags = (enable ? 1 : 0) | (clear ? 2 : 0);
 
         rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_LWT_CONTROL, &data);
         if (rc == 0)
@@ -1480,26 +1160,25 @@ lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize,
         }
 
         /* crappy overloads */
-        if (data.ioc_nid2 != sizeof(lwt_event_t) ||
-            data.ioc_nid3 != offsetof(lwt_event_t, lwte_where)) {
+        if (data.ioc_u32[2] != sizeof(lwt_event_t) ||
+            data.ioc_u32[3] != offsetof(lwt_event_t, lwte_where)) {
                 fprintf(stderr,"kernel/user LWT event mismatch %d(%d),%d(%d)\n",
-                        (int)data.ioc_nid2, sizeof(lwt_event_t),
-                        (int)data.ioc_nid3,
+                        (int)data.ioc_u32[2], sizeof(lwt_event_t),
+                        (int)data.ioc_u32[3],
                         (int)offsetof(lwt_event_t, lwte_where));
                 return (-1);
         }
 
-        LASSERT (data.ioc_count != 0);
-        LASSERT (data.ioc_misc != 0);
-
         if (now != NULL)
-                *now = data.ioc_nid;
+                *now = data.ioc_u64[0];
 
+        LASSERT (data.ioc_u32[0] != 0);
         if (ncpu != NULL)
-                *ncpu = data.ioc_count;
+                *ncpu = data.ioc_u32[0];
 
+        LASSERT (data.ioc_u32[1] != 0);
         if (totalsize != NULL)
-                *totalsize = data.ioc_misc;
+                *totalsize = data.ioc_u32[1];
 
         return (0);
 }
index 4287c55..5dcf01d 100644 (file)
@@ -41,7 +41,6 @@ command_t list[] = {
         {"push", jt_ptl_push_connection, 0, "flush connection to a remote nid (args: [nid]"},
         {"active_tx", jt_ptl_print_active_txs, 0, "print active transmits (no args)"},
         {"ping", jt_ptl_ping, 0, "do a ping test (args: nid [count] [size] [timeout])"},
-        {"shownid", jt_ptl_shownid, 0, "print the local NID"},
         {"mynid", jt_ptl_mynid, 0, "inform the socknal of the local NID (args: [hostname])"},
         {"add_route", jt_ptl_add_route, 0, 
          "add an entry to the routing table (args: gatewayNID targetNID [targetNID])"},
index acdd4db..f97a268 100644 (file)
@@ -5,6 +5,13 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <portals/api-support.h>
+
+/* This ghastly hack to allows me to include lib-types.h It doesn't affect any
+ * assertions generated here (but fails-safe if it ever does) */
+typedef struct {
+        int     counter;
+} atomic_t;
+
 #include <portals/lib-types.h>
 
 #include <string.h>
@@ -25,14 +32,14 @@ do {                                            \
 
 #define STRINGIFY(a) #a
 
-#define CHECK_DEFINE(a)                                         \
-do {                                                            \
-        printf ("        CLASSERT ("#a" == "STRINGIFY(a)");\n"); \
+#define CHECK_DEFINE(a)                                                 \
+do {                                                                    \
+        printf ("        CLASSERT ("#a" == "STRINGIFY(a)");\n");        \
 } while (0)
 
 #define CHECK_VALUE(a)                                  \
 do {                                                    \
-        printf ("        CLASSERT ("#a" == %d);\n", a);  \
+        printf ("        CLASSERT ("#a" == %d);\n", a); \
 } while (0)
 
 #define CHECK_MEMBER_OFFSET(s,m)                \