diff options
author | rshoaib <none@none> | 2007-01-24 21:12:55 -0800 |
---|---|---|
committer | rshoaib <none@none> | 2007-01-24 21:12:55 -0800 |
commit | 5ce5f3670f7934e376808da0d1309924ecf8f9e5 (patch) | |
tree | 8ef622ff45373f427ad166b78a1d8899427dc130 /usr/src | |
parent | 91cfa10a8e55050a5103c4b2e83b0bf8d783a7cb (diff) | |
download | illumos-gate-5ce5f3670f7934e376808da0d1309924ecf8f9e5.tar.gz |
6514760 RDS Address resolution has issue when multiple interfaces are present
6516581 The rdsib driver fails to attach when installing from CDs
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/pkgdefs/SUNWrds/postinstall | 23 | ||||
-rw-r--r-- | usr/src/uts/common/io/ib/clients/rds/rdsib_arp.c | 75 | ||||
-rw-r--r-- | usr/src/uts/common/io/ib/clients/rds/rdsib_arp_link.c | 975 | ||||
-rw-r--r-- | usr/src/uts/common/sys/ib/clients/rds/rdsib_arp.h | 9 | ||||
-rw-r--r-- | usr/src/uts/intel/rdsib/Makefile | 4 | ||||
-rwxr-xr-x | usr/src/uts/sparc/rdsib/Makefile | 4 |
6 files changed, 151 insertions, 939 deletions
diff --git a/usr/src/pkgdefs/SUNWrds/postinstall b/usr/src/pkgdefs/SUNWrds/postinstall index aea740d7a4..26814b9fbc 100644 --- a/usr/src/pkgdefs/SUNWrds/postinstall +++ b/usr/src/pkgdefs/SUNWrds/postinstall @@ -20,7 +20,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # #ident "%Z%%M% %I% %E% SMI" @@ -28,10 +28,23 @@ PATH="/usr/bin:/usr/sbin:/sbin:${PATH}" export PATH RDS_SOCK_ENTRY=" 30 1 0 /dev/rds" +DRVPERM='* 0644 root sys' +IB_DEV_DIR="/devices/ib" -if [ "${BASEDIR:=/}" != "/" ] +ADD_DRV="add_drv -b $BASEDIR" +if [ "${BASEDIR:=/}" = "/" ] then - BASEDIR_OPT="-b $BASEDIR" + ADD_DRV="add_drv" + + # Is there IB Hardware? + if [ ! -d $IB_DEV_DIR ] + then + # + # On a running system with NO IB hardware, modify the + # system files only. + # + ADD_DRV_OPT="-n" + fi fi not_installed() { @@ -42,9 +55,9 @@ not_installed() { EXIT=0 -not_installed rds || add_drv ${BASEDIR_OPT} -m '* 0644 root sys' rds || EXIT=1 +not_installed rds || $ADD_DRV -m "${DRVPERM}" rds || EXIT=1 -not_installed rdsib || add_drv ${BASEDIR_OPT} -m '* 0644 root sys' \ +not_installed rdsib || $ADD_DRV ${ADD_DRV_OPT} -m "${DRVPERM}" \ rdsib || EXIT=1 # Check rds entry exists in sock2path diff --git a/usr/src/uts/common/io/ib/clients/rds/rdsib_arp.c b/usr/src/uts/common/io/ib/clients/rds/rdsib_arp.c index d417b81430..3ca16ce227 100644 --- a/usr/src/uts/common/io/ib/clients/rds/rdsib_arp.c +++ b/usr/src/uts/common/io/ib/clients/rds/rdsib_arp.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -50,16 +50,8 @@ extern int rds_pr_lookup(rds_streams_t *rdss, rds_ipx_addr_t *dst_addr, rds_ipx_addr_t *src_addr, uint8_t localroute, uint32_t bound_dev_if, rds_pr_comp_func_t func); extern void rds_pr_arp_ack(mblk_t *mp); -extern void rds_pr_ip6_ack(mblk_t *mp); -extern void rds_pr_proto(queue_t *, mblk_t *); -extern void rds_pr_ip_ack(mblk_t *mp); -extern int rds_rts_announce(rds_streams_t *rdss); extern void rds_prwqn_delete(rds_prwqn_t *wqnp); -#if 0 -extern dev_info_t *rdsdip; -#endif - extern ddi_taskq_t *rds_taskq; /* @@ -105,18 +97,10 @@ rds_lrsrv(queue_t *q) RDS_DPRINTF4("rds_lrsrv", "Enter: 0x%p 0x%p", q, rdss); - if (WR(q) == rdss->ipqueue) { - while (mp = getq(q)) { - rds_pr_ip_ack(mp); - } - } else if (WR(q) == rdss->arpqueue) { + if (WR(q) == rdss->arpqueue) { while (mp = getq(q)) { rds_pr_arp_ack(mp); } - } else if (WR(q) == rdss->ip6queue) { - while (mp = getq(q)) { - rds_pr_ip6_ack(mp); - } } else { freemsg(mp); } @@ -184,10 +168,6 @@ rds_lrput(queue_t *q, mblk_t *mp) (void) putq(q, mp); qenable(q); break; - case M_PROTO: - case M_PCPROTO: - rds_pr_proto(q, mp); - break; default: RDS_DPRINTF1(LABEL, "lrput: got unknown msg <0x%x>\n", mp->b_datap->db_type); @@ -249,9 +229,6 @@ int rds_link_driver(rds_streams_t *rdss, char *path, queue_t **q, vnode_t **dev_vp) { struct stdata *dev_stp; -#if 0 - cdevsw_impl_t *dp; -#endif vnode_t *vp; int error; queue_t *rq; @@ -277,14 +254,8 @@ rds_link_driver(rds_streams_t *rdss, char *path, queue_t **q, vnode_t **dev_vp) rq = RD(dev_stp->sd_wrq); RD(rq)->q_ptr = WR(rq)->q_ptr = rdss; -#if 0 - dp = &devimpl[rdss->major]; - setq(rq, &rds_lrinit, &rds_lwinit, dp->d_dmp, dp->d_qflag, - dp->d_sqtype, B_TRUE); -#else setq(rq, &rds_lrinit, &rds_lwinit, NULL, QMTSAFE, SQ_CI|SQ_CO, B_FALSE); -#endif RDS_DPRINTF4("rds_link_driver", "Return: %s", path); @@ -335,10 +306,6 @@ rds_unlink_drivers(rds_streams_t *rdss) { RDS_DPRINTF4("rds_unlink_drivers", "Enter"); - if (rdss->ipqueue) { - (void) rds_unlink_driver(&rdss->ipqueue, &rdss->ip_vp); - } - if (rdss->arpqueue) { (void) rds_unlink_driver(&rdss->arpqueue, &rdss->arp_vp); } @@ -358,36 +325,17 @@ rds_link_drivers(rds_streams_t *rdss) RDS_DPRINTF4("rds_link_drivers", "Enter"); - if ((rc = rds_link_driver(rdss, "/dev/ip", &rdss->ipqueue, - &rdss->ip_vp)) != 0) { - RDS_DPRINTF1(LABEL, "rds_link_drivers: ip failed\n"); - return (rc); - } - if ((rc = rds_link_driver(rdss, "/dev/arp", &rdss->arpqueue, &rdss->arp_vp)) != 0) { - (void) rds_unlink_driver(&rdss->ipqueue, - &rdss->ip_vp); RDS_DPRINTF1(LABEL, "rds_link_drivers: rds failed\n"); return (rc); } - /* - * let IP know this is a routing socket - */ - if ((rc = rds_rts_announce(rdss))) { - RDS_DPRINTF1(LABEL, "link_drivers: rts_announce failed\n"); - (void) rds_unlink_drivers(rdss); - return (rc); - } - RDS_DPRINTF4("rds_link_drivers", "Return"); return (0); } -#define AF_RDS 30 - typedef struct rds_get_ibaddr_args_s { int ret; ipaddr_t srcip; @@ -413,9 +361,6 @@ rds_get_ibaddr_impl(void *arg) mutex_init(&rdss->lock, NULL, MUTEX_DRIVER, NULL); cv_init(&rdss->cv, NULL, CV_DRIVER, NULL); -#if 0 - rdss->major = ddi_driver_major(rdsdip); -#endif ret = rds_link_drivers(rdss); if (ret != 0) { @@ -427,17 +372,19 @@ rds_get_ibaddr_impl(void *arg) return; } - destaddr.family = AF_INET; + destaddr.family = AF_INET_OFFLOAD; destaddr.un.ip4addr = htonl(argsp->destip); - srcaddr.family = AF_INET; + srcaddr.family = AF_INET_OFFLOAD; srcaddr.un.ip4addr = htonl(argsp->srcip); - (void) rds_pr_lookup(rdss, &destaddr, &srcaddr, 0, NULL, + ret = rds_pr_lookup(rdss, &destaddr, &srcaddr, 0, NULL, rds_get_ibaddr_complete); - mutex_enter(&rdss->lock); - cv_wait(&rdss->cv, &rdss->lock); - mutex_exit(&rdss->lock); + if (ret == 0) { + mutex_enter(&rdss->lock); + cv_wait(&rdss->cv, &rdss->lock); + mutex_exit(&rdss->lock); + } (void) rds_unlink_drivers(rdss); @@ -445,9 +392,9 @@ rds_get_ibaddr_impl(void *arg) if (argsp->ret == 0) { argsp->sgid = rdss->wqnp->sgid; argsp->dgid = rdss->wqnp->dgid; + rds_prwqn_delete(rdss->wqnp); } - rds_prwqn_delete(rdss->wqnp); mutex_destroy(&rdss->lock); cv_destroy(&rdss->cv); kmem_free(rdss, sizeof (rds_streams_t)); diff --git a/usr/src/uts/common/io/ib/clients/rds/rdsib_arp_link.c b/usr/src/uts/common/io/ib/clients/rds/rdsib_arp_link.c index 0fb17f073b..e883d2b347 100644 --- a/usr/src/uts/common/io/ib/clients/rds/rdsib_arp_link.c +++ b/usr/src/uts/common/io/ib/clients/rds/rdsib_arp_link.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -57,6 +57,7 @@ #include <sys/ib/clients/ibd/ibd.h> #include <sys/ib/clients/rds/rdsib_arp.h> #include <sys/ib/clients/rds/rdsib_debug.h> +#include <inet/ip_ftable.h> extern int rds_pr_cache; @@ -96,249 +97,12 @@ static area_t rds_area_template = { }; static void rds_arp_timeout(void *arg); +#ifdef DEBUG void print_ib_mac(char *str, uint8_t *mac); void print_ib_gid(char *str, uint8_t *mac); +#endif extern int rds_get_hca_info(rds_prwqn_t *wqnp); void rds_pr_callback(rds_prwqn_t *wqnp, int status); -extern int v4tol2addr(in_addr_t ipv4, uchar_t *l2addr); - -/* - * send a IP_IOC_RTS_REQUEST to IP driver. this way we receive route - * responses. - * the message should be M_IOCTL -->> IP_IOC_RTS_REQUEST-->> NULL - */ -int -rds_rts_announce(rds_streams_t *rdss) -{ - mblk_t *mp = NULL; - mblk_t *mp1 = NULL; - ipllc_t *ipllc; - struct iocblk *ioc; - - RDS_DPRINTF4("rds_rts_announce", "Enter"); - - mp = allocb(sizeof (ipllc_t), BPRI_HI); - if (mp == NULL) - return (ENOMEM); - mp1 = allocb(sizeof (struct iocblk), BPRI_HI); - if (mp1 == NULL) { - freeb(mp); - return (ENOMEM); - } - - /* LINTED */ - ipllc = (ipllc_t *)mp->b_rptr; - ipllc->ipllc_cmd = IP_IOC_RTS_REQUEST; - ipllc->ipllc_name_offset = 0; - ipllc->ipllc_name_length = 0; - mp->b_wptr += sizeof (ipllc_t); - - /* LINTED */ - ioc = (struct iocblk *)mp1->b_rptr; - ioc->ioc_cmd = IP_IOCTL; - ioc->ioc_error = 0; - ioc->ioc_cr = NULL; - ioc->ioc_count = msgdsize(mp); - mp1->b_wptr += sizeof (struct iocblk); - mp1->b_datap->db_type = M_IOCTL; - mp1->b_cont = mp; - - if (rdss->ipqueue) { - if (canputnext(rdss->ipqueue)) { - putnext(rdss->ipqueue, mp1); - } else { - (void) putq(rdss->ipqueue, mp1); - qenable(rdss->ipqueue); - } - RDS_DPRINTF4("rds_rts_announce", "Return"); - return (0); - } else { - RDS_DPRINTF1(LABEL, "arp: ip driver not linked yet\n"); - RDS_DPRINTF4("rds_rts_announce", "Return: EBUSY"); - return (EBUSY); - } -} - -/* - * get routing info from ip driver - * the message is M_IOCTL -->> IP_IOC_RTS_REQUEST -->> struct (rt_msghdr_t) - */ -int -rds_get_route(rds_streams_t *rdss, rds_ipx_addr_t *dst_addr, rds_prwqn_t *wqnp) -{ - mblk_t *mp = NULL; - mblk_t *mp1 = NULL; - mblk_t *bp = NULL; - ipllc_t *ipllc; - struct iocblk *ioc; - rt_msghdr_t *rtm; - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - - RDS_DPRINTF4("rds_get_route", "Enter"); - - mp = allocb(sizeof (ipllc_t), BPRI_HI); - if (mp == NULL) { - return (NULL); - } - mp1 = allocb(sizeof (struct iocblk), BPRI_HI); - if (mp1 == NULL) { - freeb(mp); - return (NULL); - } - bp = allocb(RDS_RTM_LEN, BPRI_HI); - if (bp == NULL) { - freeb(mp); - freeb(mp1); - return (NULL); - } - bzero(bp->b_rptr, RDS_RTM_LEN); - /* LINTED */ - ipllc = (ipllc_t *)mp->b_rptr; - ipllc->ipllc_cmd = IP_IOC_RTS_REQUEST; - ipllc->ipllc_name_offset = 0; - ipllc->ipllc_name_length = 0; - mp->b_wptr += sizeof (ipllc_t); - mp->b_cont = bp; - - /* LINTED */ - ioc = (struct iocblk *)mp1->b_rptr; - ioc->ioc_cmd = IP_IOCTL; - ioc->ioc_error = 0; - ioc->ioc_cr = NULL; - ioc->ioc_count = msgdsize(mp); - mp1->b_wptr += sizeof (struct iocblk); - mp1->b_datap->db_type = M_IOCTL; - mp1->b_cont = mp; - - /* LINTED */ - rtm = (rt_msghdr_t *)bp->b_rptr; - rtm->rtm_msglen = RDS_RTM_LEN; - rtm->rtm_version = RTM_VERSION; - rtm->rtm_type = RTM_GET; - rtm->rtm_flags = (RTF_UP | RTF_GATEWAY | RTF_HOST | RTF_STATIC); - rtm->rtm_addrs = (RTA_DST | RTA_IFP | RTA_SRC); - - /* - * set wqnp in pid and seq fields - * will be used to retrieve wqnp when the reply comes back - */ - rtm->rtm_pid = (pid_t)((uint64_t)(uintptr_t)wqnp & 0xffffffff); - rtm->rtm_seq = ((uint64_t)(uintptr_t)wqnp >> 32); - - if (RDS_IS_V4_ADDR(dst_addr)) { - sin = (struct sockaddr_in *)&rtm[1]; - /* - * Nitin: Change AF_RDS to AF_INET since rtsock does not - * Know anything about AF_RDS - * sin->sin_family = dst_addr->family; - */ - sin->sin_family = AF_INET; - sin->sin_port = 0; - sin->sin_addr.s_addr = RDS_IPV4_ADDR(dst_addr); - sin++; - sin->sin_family = AF_LINK; - } else { - sin6 = (struct sockaddr_in6 *)&rtm[1]; - sin6->sin6_family = dst_addr->family; - sin6->sin6_port = 0; - sin6->sin6_addr = RDS_IPV6_ADDR(dst_addr); - sin6++; - sin6->sin6_family = AF_LINK; - } - - bp->b_wptr += RDS_RTM_LEN; - - wqnp->flags |= RDS_PR_RT_PENDING; - if (rdss->ipqueue) { - if (canputnext(rdss->ipqueue)) { - putnext(rdss->ipqueue, mp1); - } else { - (void) putq(rdss->ipqueue, mp1); - qenable(rdss->ipqueue); - } - RDS_DPRINTF4("rds_get_route", "Return"); - return (0); - } else { - RDS_DPRINTF1(LABEL, "arp: ip driver not linked yet\n"); - RDS_DPRINTF4("rds_get_route", "Return: EBUSY"); - return (EBUSY); - } -} - -/* - * issue SIOCLIFGETND ioctl to ipv6 driver. this would - * query the ipv6 driver cache for ipv6 to mac address mapping. - */ -int -rds_query_ip6(rds_prwqn_t *wqnp) -{ - mblk_t *mp = NULL; - mblk_t *mp1 = NULL; - mblk_t *mp2 = NULL; - struct iocblk *iocb; - struct sockaddr_in6 *sin6; - struct lifreq *lifr; - rds_streams_t *rdss = (rds_streams_t *)wqnp->arg; - - RDS_DPRINTF4("rds_query_ip6", "Enter: rdss: 0x%p, wqnp: 0x%p", rdss, - wqnp); - - if ((mp = allocb(sizeof (struct iocblk) + sizeof (void *), - BPRI_HI)) == NULL) { - RDS_DPRINTF1(LABEL, "ip6_query: allocb failed\n"); - return (ENOMEM); - } - mp->b_wptr += sizeof (struct iocblk); - /* LINTED */ - iocb = (struct iocblk *)mp->b_rptr; - iocb->ioc_cmd = SIOCLIFGETND; - DB_TYPE(mp) = M_IOCTL; - iocb->ioc_count = msgdsize(mp); - iocb->ioc_error = 0; - iocb->ioc_cr = NULL; - - if ((mp1 = allocb(sizeof (void *), BPRI_HI)) == NULL) { - freeb(mp); - RDS_DPRINTF1(LABEL, "ip6_query: allocb1 failed\n"); - return (ENOMEM); - } - - /* LINTED */ - *(uintptr_t *)mp->b_wptr = (uintptr_t)wqnp; /* store wqnp */ - - if ((mp2 = allocb(sizeof (struct lifreq) + 8, BPRI_HI)) == NULL) { - RDS_DPRINTF1(LABEL, "ip6_query: allocb2 failed\n"); - freeb(mp); - freeb(mp1); - return (ENOMEM); - } - - bzero(mp2->b_rptr, sizeof (struct lifreq)); - /* LINTED */ - lifr = (struct lifreq *)mp2->b_rptr; - sin6 = (struct sockaddr_in6 *)&lifr->lifr_addr; - sin6->sin6_family = AF_INET6; - bcopy(&wqnp->dst_addr.un.ip6addr, - &sin6->sin6_addr, sizeof (in6_addr_t)); - (void) sprintf(lifr->lifr_name, "%s", wqnp->ifname); - - mp2->b_wptr += sizeof (struct lifreq); - mp->b_cont = mp1; - mp1->b_cont = mp2; - iocb->ioc_count = msgdsize(mp); - if (rdss->ip6queue) { - (void) putq(rdss->ip6queue, mp); - qenable(rdss->ip6queue); - RDS_DPRINTF4("rds_query_ip6", "Return: 0x%p", wqnp); - return (0); - } else { - RDS_DPRINTF1(LABEL, "arp: ipv6 driver not linked yet\n"); - freemsg(mp); - RDS_DPRINTF4("rds_query_ip6", "Return: EBUSY"); - return (EBUSY); - } -} /* * issue a AR_ENTRY_QUERY to arp driver and schedule a timeout. @@ -358,11 +122,7 @@ rds_query_arp(rds_prwqn_t *wqnp) RDS_DPRINTF4("rds_query_arp", "Enter: rdss: 0x%p wqnp: 0x%p", rdss, wqnp); - if (RDS_IS_V4_ADDR(&wqnp->src_addr)) { - name_offset = rds_areq_template.areq_name_offset; - } else { - name_offset = sizeof (areq_t) + (2 * sizeof (in6_addr_t)); - } + name_offset = rds_areq_template.areq_name_offset; /* * allocate mblk for AR_ENTRY_QUERY @@ -398,25 +158,10 @@ rds_query_arp(rds_prwqn_t *wqnp) areqp->areq_proto = wqnp->ifproto; bcopy(&wqnp->ifproto, areqp->areq_sap, 2); - if (RDS_IS_V4_ADDR(&wqnp->dst_addr)) { - cp = (char *)areqp + areqp->areq_target_addr_offset; - bcopy(&wqnp->dst_addr.un.ip4addr, cp, IP_ADDR_LEN); - cp = (char *)areqp + areqp->areq_sender_addr_offset; - bcopy(&wqnp->src_addr.un.ip4addr, cp, IP_ADDR_LEN); - } else { - /* - * adjust the offsets for ipv6 - */ - areqp->areq_name_offset = sizeof (areq_t) + - (2 * sizeof (in6_addr_t)); - cp = (char *)areqp + areqp->areq_target_addr_offset; - bcopy(&wqnp->dst_addr.un.ip6addr, cp, sizeof (in6_addr_t)); - - areqp->areq_sender_addr_offset = sizeof (areq_t) + - (sizeof (in6_addr_t)); - cp = (char *)areqp + areqp->areq_sender_addr_offset; - bcopy(&wqnp->src_addr.un.ip6addr, cp, sizeof (in6_addr_t)); - } + cp = (char *)areqp + areqp->areq_target_addr_offset; + bcopy(&wqnp->dst_addr.un.ip4addr, cp, IP_ADDR_LEN); + cp = (char *)areqp + areqp->areq_sender_addr_offset; + bcopy(&wqnp->src_addr.un.ip4addr, cp, IP_ADDR_LEN); mp->b_cont = mp1; @@ -428,19 +173,15 @@ rds_query_arp(rds_prwqn_t *wqnp) wqnp->flags |= RDS_PR_ARP_PENDING; wqnp->timeout_id = timeout(rds_arp_timeout, wqnp, drv_usectohz(RDS_ARP_TIMEOUT * 1000)); - if (rdss->arpqueue) { - if (canputnext(rdss->arpqueue)) { - putnext(rdss->arpqueue, mp); - } else { - (void) putq(rdss->arpqueue, mp); - qenable(rdss->arpqueue); - } - RDS_DPRINTF4("rds_query_arp", "Return: 0x%p", wqnp); - return (0); + if (canputnext(rdss->arpqueue)) { + putnext(rdss->arpqueue, mp); } else { - RDS_DPRINTF4("rds_query_arp", "Return: EBUSY"); - return (EBUSY); + (void) putq(rdss->arpqueue, mp); + qenable(rdss->arpqueue); } + + RDS_DPRINTF4("rds_query_arp", "Return: 0x%p", wqnp); + return (0); } /* @@ -511,22 +252,14 @@ rds_squery_arp(rds_prwqn_t *wqnp) DB_TYPE(mp1) = M_IOCTL; - if (rdss->arpqueue) { - if (canputnext(rdss->arpqueue)) { - putnext(rdss->arpqueue, mp1); - } else { - (void) putq(rdss->arpqueue, mp1); - qenable(rdss->arpqueue); - } - RDS_DPRINTF4("rds_squery_arp", "Return: 0x%p", wqnp); - return (0); + if (canputnext(rdss->arpqueue)) { + putnext(rdss->arpqueue, mp1); } else { - RDS_DPRINTF1(LABEL, "arp: arp driver not linked yet\n"); - RDS_DPRINTF4("rds_squery_arp", "Return: EBUSY"); - return (EBUSY); + (void) putq(rdss->arpqueue, mp1); + qenable(rdss->arpqueue); } - - + RDS_DPRINTF4("rds_squery_arp", "Return: 0x%p", wqnp); + return (0); } /* @@ -579,21 +312,14 @@ rds_arp_add(rds_prwqn_t *wqnp) DB_TYPE(mp) = M_PROTO; - if (rdss->arpqueue) { - if (canputnext(rdss->arpqueue)) { - putnext(rdss->arpqueue, mp); - } else { - (void) putq(rdss->arpqueue, mp); - qenable(rdss->arpqueue); - } - RDS_DPRINTF4("rds_arp_add", "Return: 0x%p", wqnp); - return (0); + if (canputnext(rdss->arpqueue)) { + putnext(rdss->arpqueue, mp); } else { - RDS_DPRINTF1(LABEL, "arp: arp driver not linked yet\n"); - RDS_DPRINTF4("rds_arp_add", "Return: EBUSY"); - return (EBUSY); + (void) putq(rdss->arpqueue, mp); + qenable(rdss->arpqueue); } - + RDS_DPRINTF4("rds_arp_add", "Return: 0x%p", wqnp); + return (0); } @@ -618,47 +344,6 @@ rds_arp_timeout(void *arg) } /* - * timeout routine for ipv6 after sending a dummp icmp packet. - */ -static void -rds_ip6_timeout(void *arg) -{ - rds_prwqn_t *wqnp = (rds_prwqn_t *)arg; - rds_streams_t *rdss = (rds_streams_t *)wqnp->arg; - int rc; - - RDS_DPRINTF4("rds_ip6_timeout", "Enter: rdss: 0x%p wqnp: 0x%p", - rdss, wqnp); - - /* - * make sure this is a valid request. the request could have been - * cancelled - */ - mutex_enter(&rdss->lock); - - wqnp->retries++; - if (wqnp->retries == RDS_MAX_IP6_RETRIES) { - rc = EHOSTUNREACH; - goto user_callback; - } - - /* - * check if ND succeded - */ - if ((rc = rds_query_ip6(wqnp)) != 0) { - goto user_callback; - } - mutex_exit(&rdss->lock); - return; - -user_callback: - mutex_exit(&rdss->lock); - rds_pr_callback(wqnp, rc); - - RDS_DPRINTF4("rds_ip6_timeout", "Return: 0x%p", wqnp); -} - -/* * delete a wait queue node from the list. * assumes mutex is acquired */ @@ -703,9 +388,7 @@ rds_create_prwqn(rds_streams_t *rdss, rds_ipx_addr_t *dst_addr, wqnp->arg = rdss; wqnp->localroute = localroute; wqnp->bound_dev_if = bound_dev_if; - - wqnp->ifproto = (dst_addr->family == AF_INET) ? - ETHERTYPE_IP : ETHERTYPE_IPV6; + wqnp->ifproto = ETHERTYPE_IP; rdss->wqnp = wqnp; @@ -728,44 +411,110 @@ rds_pr_callback(rds_prwqn_t *wqnp, int status) RDS_DPRINTF4("rds_pr_callback", "Return: 0x%p", wqnp); } -#define AF_RDS 30 +static int +rds_check_interface(rds_prwqn_t *wqnp, int length) +{ + /* + * if the i/f is not ib or lo device, fail the request + */ + if (bcmp(wqnp->ifname, "ibd", 3) == 0) { + if (length != IPOIB_ADDRL) { + return (EINVAL); + } + } else if (bcmp(wqnp->ifname, "lo", 2)) { + return (ETIMEDOUT); + } + + return (0); +} + int rds_pr_lookup(rds_streams_t *rdss, rds_ipx_addr_t *dst_addr, rds_ipx_addr_t *src_addr, uint8_t localroute, uint32_t bound_dev_if, rds_pr_comp_func_t func) { - int rc; rds_prwqn_t *wqnp; + ire_t *ire; + ire_t *src_ire; + ipif_t *ipif; + ill_t *ill; + int length; + ip_stack_t *ipst; + + RDS_DPRINTF4("rds_pr_lookup", "Enter: src 0x%x dest 0x%x", src_addr, dst_addr); - /* - * make sure address in not multicast - */ - if (dst_addr->family == AF_RDS || dst_addr->family == AF_INET) { - if (IN_MULTICAST(dst_addr->un.ip4addr)) { - return (EINVAL); - } - } else if (dst_addr->family == AF_INET6) { - if (IN6_IS_ADDR_MULTICAST(&dst_addr->un.ip6addr)) { - return (EINVAL); - } - } else { - return (EAFNOSUPPORT); + if (dst_addr->family != AF_INET_OFFLOAD) { + rdss->status = EAFNOSUPPORT; + return (1); } - if ((wqnp = rds_create_prwqn(rdss, dst_addr, src_addr, localroute, bound_dev_if, func)) == NULL) { - return (ENOMEM); + rdss->status = ENOMEM; + return (1); } + ipst = netstack_find_by_zoneid(GLOBAL_ZONEID)->netstack_ip; /* - * get the routing info + * Get the ire for the local address */ - if (rc = rds_get_route(rdss, dst_addr, wqnp)) { - return (rc); + + src_ire = ire_ctable_lookup(RDS_IPV4_ADDR(src_addr), NULL, + IRE_LOCAL, NULL, ALL_ZONES, NULL, MATCH_IRE_TYPE, ipst); + + + if (src_ire == NULL) { + netstack_rele(ipst->ips_netstack); + rds_prwqn_delete(wqnp); + rdss->status = EFAULT; + return (1); + } + + + /* + * get an ire for the destination adress with the matching source + * address + */ + ire = ire_ftable_lookup(RDS_IPV4_ADDR(dst_addr), 0, 0, 0, + src_ire->ire_ipif, 0, src_ire->ire_zoneid, 0, NULL, MATCH_IRE_SRC, + ipst); + + netstack_rele(ipst->ips_netstack); + + if (ire == NULL) { + IRE_REFRELE(src_ire); + rds_prwqn_delete(wqnp); + rdss->status = EFAULT; + return (1); + } + + wqnp->src_addr.un.ip4addr = ire->ire_src_addr; + wqnp->src_addr.family = AF_INET_OFFLOAD; + + ipif = src_ire->ire_ipif; + ill = ipif->ipif_ill; + length = ill->ill_name_length; + bcopy(ill->ill_name, &wqnp->ifname, ill->ill_name_length); + wqnp->ifname[length] = '\0'; + bcopy(ill->ill_phys_addr, &wqnp->src_mac, + ill->ill_phys_addr_length); + + IRE_REFRELE(ire); + IRE_REFRELE(src_ire); + + rdss->status = rds_check_interface(wqnp, ill->ill_phys_addr_length); + if (rdss->status) { + rds_prwqn_delete(wqnp); + return (1); + } + + rdss->status = rds_squery_arp(wqnp); + if (rdss->status) { + rds_prwqn_delete(wqnp); + return (1); } RDS_DPRINTF4("rds_pr_lookup", "Return: 0x%p", wqnp); @@ -975,498 +724,7 @@ rds_pr_arp_ack(mblk_t *mp) RDS_DPRINTF4("rds_pr_arp_ack", "Return: 0x%p", mp); } -int -rds_copy_sockaddr(struct sockaddr *sa, rds_ipx_addr_t *addr) -{ - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - - RDS_DPRINTF4("rds_copy_sockaddr", "Enter"); - - addr->family = sa->sa_family; - switch (sa->sa_family) { - case AF_INET: - /* LINTED */ - sin = (struct sockaddr_in *)sa; - addr->un.ip4addr = sin->sin_addr.s_addr; - RDS_DPRINTF4("rds_copy_sockaddr", "Return: AF_INET"); - return (sizeof (struct sockaddr_in)); - case AF_INET6: - /* LINTED */ - sin6 = (struct sockaddr_in6 *)sa; - bcopy(&sin6->sin6_addr.s6_addr, - &addr->un.ip6addr, sizeof (in6_addr_t)); - RDS_DPRINTF4("rds_copy_sockaddr", "Return: AF_INET6"); - return (sizeof (struct sockaddr_in6)); - default: - RDS_DPRINTF4("rds_copy_sockaddr", "Return: Default"); - return (0); - } -} - -/* - * do sanity checks on the link-level sockaddr - * the i/f has has to be an ib or lo device - */ -int -rds_copy_sockdl(struct sockaddr_dl *sdl, rds_prwqn_t *wqnp) -{ - RDS_DPRINTF4("rds_copy_sockdl", "Enter: 0x%p", wqnp); - - if (!sdl->sdl_nlen) { - RDS_DPRINTF1(LABEL, "copy_sockdl: invalid name len %d\n", - sdl->sdl_nlen); - return (EINVAL); - } - bcopy(sdl->sdl_data, wqnp->ifname, sdl->sdl_nlen); - wqnp->ifname[sdl->sdl_nlen] = '\0'; - - /* - * if the i/f is not ib or lo device, fail the request - */ - if (bcmp(wqnp->ifname, "ibd", 3) == 0) { - if (sdl->sdl_alen != IPOIB_ADDRL) { - RDS_DPRINTF1(LABEL, "Error: i/f is not ibd: <%s>\n", - wqnp->ifname); - return (EINVAL); - } - - bcopy(&sdl->sdl_data[sdl->sdl_nlen], - &wqnp->src_mac, IPOIB_ADDRL); - } else if (bcmp(wqnp->ifname, "lo", 2)) { - RDS_DPRINTF2(LABEL, "Invalid Interface: %s", wqnp->ifname); - return (EINVAL); - } - - RDS_DPRINTF4("rds_copy_sockdl", "Return: 0x%p", wqnp); - - return (0); -} - -int -rds_extract_route_fields(rt_msghdr_t *rtm, rds_prwqn_t *wqnp) -{ - int rtm_addrs; - struct sockaddr_dl *sdl; - uchar_t *cp; - int i; - struct sockaddr *sa; - int addr_bits; - rds_ipx_addr_t addr; - int rc; - - RDS_DPRINTF4("rds_extract_route_fields", "Enter: 0x%p", wqnp); - - /* - * go thru' the packed data at the end of rtm - */ - cp = (uchar_t *)&rtm[1]; - rtm_addrs = rtm->rtm_addrs; - for (i = 0; i < RTA_NUMBITS; i++) { - addr_bits = (rtm_addrs & (1 << i)); - if (addr_bits == 0) { - continue; - } - /* LINTED */ - sa = (struct sockaddr *)cp; - switch (addr_bits) { - case RTA_DST: - cp += rds_copy_sockaddr(sa, &addr); - break; - case RTA_GATEWAY: - cp += rds_copy_sockaddr(sa, &wqnp->gateway); - break; - case RTA_NETMASK: - cp += rds_copy_sockaddr(sa, &wqnp->netmask); - break; - case RTA_IFP: - /* LINTED */ - sdl = (struct sockaddr_dl *)cp; - - if ((rc = rds_copy_sockdl(sdl, wqnp)) != 0) { - goto error; - } - cp += sizeof (struct sockaddr_dl); - break; - case RTA_IFA: - case RTA_SRC: - cp += rds_copy_sockaddr(sa, &wqnp->src_addr); - break; - case RTA_AUTHOR: - cp += rds_copy_sockaddr(sa, &addr); - break; - case RTA_BRD: - cp += rds_copy_sockaddr(sa, &addr); - break; - default: - RDS_DPRINTF1(LABEL, "got %d in rts msg\n", - (rtm_addrs & (1 << i))); - break; - - } - } - - RDS_DPRINTF4("rds_extract_route_fields", "Return: 0x%p", wqnp); - - return (0); - -error: - return (rc); -} - -/* - * called from lrput. - * process a IP_IOCTL reply from ip - */ -void -rds_pr_ip_ack(mblk_t *mp) -{ - rt_msghdr_t *rtm; - rds_prwqn_t *wqnp; - rds_streams_t *rdss; - uintptr_t l; - int rc; - int len; - - RDS_DPRINTF4("rds_pr_ip_ack", "Enter: 0x%p", mp); - - /* - * RTS info is present in a single mblk. if more than one mblk - * is present, then this should be the original RTM_GET request - */ - if (mp->b_cont) { - freemsg(mp); - return; - } - - /* - * sanity checks on the mblk - */ - /* LINTED */ - rtm = (rt_msghdr_t *)mp->b_rptr; - /* LINTED */ - if ((MBLKL(mp) < sizeof (rt_msghdr_t)) || - (rtm->rtm_version != RTM_VERSION) || - /* LINTED */ - (rtm->rtm_type != RTM_GET) || (MBLKL(mp) != rtm->rtm_msglen)) { - freemsg(mp); - return; - } - - l = ((uint64_t)rtm->rtm_seq << 32) | (uint32_t)rtm->rtm_pid; - wqnp = (rds_prwqn_t *)l; - rdss = (rds_streams_t *)wqnp->arg; - - mutex_enter(&rdss->lock); - - /* - * check for rts error - */ - if (rtm->rtm_errno) { - rc = rtm->rtm_errno; - RDS_DPRINTF1(LABEL, "ip_ioctl_ack: got rtm errono:%d\n", rc); - goto user_callback; - } - - /* - * extract all the route fields - */ - if (rc = rds_extract_route_fields(rtm, wqnp)) { - freemsg(mp); - goto user_callback; - } - freemsg(mp); - - if (bcmp(wqnp->ifname, "lo", 2) != 0) { - /* - * issue AR_ENTRY_QUERY to get the arp address of dest - */ - wqnp->flags &= ~RDS_PR_RT_PENDING; - - RDS_DPRINTF3(LABEL, "ip_ack: outgoing if: %s dst: %d usr: %d", - wqnp->ifname, wqnp->dst_addr.family, - wqnp->usrc_addr.family); - - /* - * if localroute is set, then make sure the rts - * returned gateway address is the same as the - * supplied source address - */ - if (wqnp->localroute) { - len = (wqnp->dst_addr.family == AF_INET) ? - IP_ADDR_LEN : sizeof (in6_addr_t); - - if (bcmp(&wqnp->gateway.un, &wqnp->src_addr.un, len)) { - rc = ENETUNREACH; - RDS_DPRINTF1(LABEL, - "ip_ack: local route error:%d\n", rc); - goto user_callback; - } - } - - /* - * if the user supplied a address, then verify rts returned - * the same address - */ - if (wqnp->usrc_addr.family) { - len = (wqnp->usrc_addr.family == AF_INET) ? - IP_ADDR_LEN : sizeof (in6_addr_t); - - if (bcmp(&wqnp->usrc_addr.un, - &wqnp->src_addr.un, len)) { - rc = ENETUNREACH; - RDS_DPRINTF1(LABEL, - "ip_ack: src addr mismatch:%d\n", rc); - goto user_callback; - } - } - - /* - * at this stage, we have the source address and the IB - * interface, now get the destination mac address from - * arp or ipv6 drivers - */ - if (wqnp->dst_addr.family == AF_INET) { - if ((rc = rds_squery_arp(wqnp)) != 0) { - RDS_DPRINTF1(LABEL, - "ip_ack: arp_req error:%d\n", rc); - goto user_callback; - } - } else { - if ((rc = rds_query_ip6(wqnp)) != 0) { - RDS_DPRINTF1(LABEL, - "ip_ack: ip6_query error:%d\n", rc); - goto user_callback; - } - } - } - mutex_exit(&rdss->lock); - - RDS_DPRINTF4("rds_pr_ip_ack", "Return: 0x%p", wqnp); - - return; - -user_callback: - mutex_exit(&rdss->lock); - /* - * indicate to user - */ - rds_pr_callback(wqnp, rc); -} - -/* - * send down a T_unitdata_req, which would trigger - * neighbour discovery process - */ -void -rds_ip6_send_pkt(rds_prwqn_t *wqnp) -{ - mblk_t *mp; - mblk_t *mp1; - struct T_unitdata_req *tur; - struct sockaddr_in6 *sin6; - rds_streams_t *rdss = (rds_streams_t *)wqnp->arg; - uint8_t *rptr; - int rc; - - RDS_DPRINTF4("rds_ip6_send_pkt", "Enter: rdss: 0x%p wqnp: 0x%p", rdss, - wqnp); - - if ((mp = allocb(sizeof (struct T_unitdata_req) + - sizeof (struct sockaddr_in6), BPRI_HI)) == NULL) { - rc = ENOMEM; - goto user_callback; - } - if ((mp1 = allocb(100, BPRI_HI)) == NULL) { - rc = ENOMEM; - freemsg(mp); - goto user_callback; - } - /* LINTED */ - tur = (struct T_unitdata_req *)mp->b_rptr; - tur->PRIM_type = T_UNITDATA_REQ; - tur->DEST_length = sizeof (struct sockaddr_in6); - tur->DEST_offset = sizeof (struct T_unitdata_req); - tur->OPT_length = 0; - tur->OPT_offset = 0; - - rptr = mp->b_rptr; - /* LINTED */ - sin6 = (struct sockaddr_in6 *)&rptr[tur->DEST_offset]; - sin6->sin6_family = AF_INET6; - bcopy(&wqnp->dst_addr.un.ip6addr, - &sin6->sin6_addr, sizeof (in6_addr_t)); - sin6->sin6_port = 9; - sin6->sin6_flowinfo = 0; - sin6->sin6_scope_id = 0; - sin6->__sin6_src_id = 0; - mp->b_wptr += sizeof (struct T_unitdata_req) + - sizeof (struct sockaddr_in6); - - mp1->b_wptr += 100; - mp1->b_rptr += 90; - mp->b_cont = mp1; - DB_TYPE(mp) = M_PROTO; - - wqnp->timeout_id = timeout(rds_ip6_timeout, wqnp, - drv_usectohz(RDS_IP6_TIMEOUT)); - if (rdss->ip6queue) { - if (canputnext(rdss->ip6queue)) { - putnext(rdss->ip6queue, mp); - } else { - (void) putq(rdss->ip6queue, mp); - qenable(rdss->ip6queue); - } - return; - } else { - RDS_DPRINTF1(LABEL, "arp: ipv6 driver not linked yet\n"); - (void) untimeout(wqnp->timeout_id); - freemsg(mp); - rc = EBUSY; - } -user_callback: - /* - * indicate to user - */ - rds_pr_callback(wqnp, rc); - - RDS_DPRINTF4("rds_ip6_send_pkt", "Return: 0x%p", wqnp); -} - -/* - * called from lrput. - * process SIOCLIFGETND reply from ip6 - */ -void -rds_pr_ip6_ack(mblk_t *mp) -{ - rds_prwqn_t *wqnp; - mblk_t *bp; - struct iocblk *iocb; - struct lifreq *lifreq; - rds_streams_t *rdss; - - RDS_DPRINTF4("rds_pr_ip6_ack", "Enter"); - - if (DB_TYPE(mp) != M_IOCACK) { - RDS_DPRINTF1(LABEL, "ip6_ioctl: got %d type\n", DB_TYPE(mp)); - freemsg(mp); - } - /* LINTED */ - iocb = (struct iocblk *)mp->b_rptr; - if (iocb->ioc_cmd != SIOCLIFGETND) { - RDS_DPRINTF1(LABEL, "ip6_ioctl: got %d cmd\n", iocb->ioc_cmd); - freemsg(mp); - } - - /* LINTED */ - wqnp = *(rds_prwqn_t **)mp->b_wptr; /* retrieve wqnp */ - rdss = (rds_streams_t *)wqnp->arg; - - RDS_DPRINTF4("rds_pr_ip6_ack", "rdss: 0x%p wqnp: 0x%p", rdss, wqnp); - - mutex_enter(&rdss->lock); - - /* - * if there is an error, then trigger a ND by sending a - * dummy udp apcket - */ - /* LINTED */ - iocb = (struct iocblk *)mp->b_rptr; - if (iocb->ioc_error) { - goto send_packet; - } - - /* - * on successfull completion of SIOCLIFGETND, the second mblock - * has the lifreq struct - */ - bp = mp->b_cont; - if (bp == NULL) { - goto user_callback; - } - - /* - * if hdw_len is zero, then trigger a ND by sending - * a dummy packet - */ - /* LINTED */ - if (MBLKL(bp) < sizeof (struct lifreq)) { - goto user_callback; - } - /* LINTED */ - lifreq = (struct lifreq *)bp->b_rptr; - if (lifreq->lifr_nd.lnr_hdw_len == 0) { - goto send_packet; - } - - /* - * the request was successfull. complete the lookup - */ - bcopy(lifreq->lifr_nd.lnr_hdw_addr, - &wqnp->dst_mac, sizeof (ipoib_mac_t)); - - bcopy(&wqnp->src_mac.ipoib_gidpref, &wqnp->sgid, sizeof (ib_gid_t)); - bcopy(&wqnp->dst_mac.ipoib_gidpref, &wqnp->dgid, sizeof (ib_gid_t)); - freemsg(mp); - - H2N_GID(wqnp->sgid); - H2N_GID(wqnp->dgid); - - mutex_exit(&rdss->lock); - - rds_pr_callback(wqnp, 0); - - return; - -send_packet: - - freemsg(mp); - mutex_exit(&rdss->lock); - rds_ip6_send_pkt(wqnp); - - RDS_DPRINTF4("rds_pr_ip6_ack", "Return: 0x%p", wqnp); - - return; - -user_callback: - freemsg(mp); - mutex_exit(&rdss->lock); - - rds_pr_callback(wqnp, ENXIO); -} - -/* - * process PROTO message. - * we should get T_BIND_ACK for icmp T_BIND_REQ on ipv6 stream. if T_BIND_REQ - * had failed, then diable ipv6 stream - */ -void -rds_pr_proto(queue_t *q, mblk_t *mp) -{ - struct T_error_ack *tea; - rds_streams_t *rdss = (rds_streams_t *)q->q_ptr; - - RDS_DPRINTF4("rds_pr_proto", "Enter: q: 0x%p rdss: 0x%p", q, rdss); - - if (WR(q) != rdss->ip6queue) { - freemsg(mp); - return; - } - /* LINTED */ - tea = (struct T_error_ack *)mp->b_rptr; - if (tea->PRIM_type == T_ERROR_ACK) { - if (tea->ERROR_prim == T_BIND_REQ) { - rdss->ip6queue = NULL; - RDS_DPRINTF1(LABEL, - "arp: icmp bind failed. ipv6 stream down\n"); - } - } - freemsg(mp); - - RDS_DPRINTF4("rds_pr_proto", "Return: 0x%p", q); -} - +#ifdef DEBUG void print_ib_mac(char *str, uint8_t *mac) { @@ -1504,3 +762,4 @@ print_ib_gid(char *str, uint8_t *mac) mac[10] & 0xff, mac[11] & 0xff, mac[12] & 0xff, mac[13] & 0xff, mac[14] & 0xff, mac[15] & 0xff); } +#endif diff --git a/usr/src/uts/common/sys/ib/clients/rds/rdsib_arp.h b/usr/src/uts/common/sys/ib/clients/rds/rdsib_arp.h index d7ed375d51..b102697d35 100644 --- a/usr/src/uts/common/sys/ib/clients/rds/rdsib_arp.h +++ b/usr/src/uts/common/sys/ib/clients/rds/rdsib_arp.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -117,8 +117,6 @@ typedef struct rds_prwqn { rds_ipx_addr_t dst_addr; /* user supplied dest address */ rds_ipx_addr_t src_addr; /* rts's view of source address */ - rds_ipx_addr_t gateway; /* rts returned gateway address */ - rds_ipx_addr_t netmask; /* rts returned netmask */ char ifname[RDS_MAX_IFNAME_LEN]; int ibd_instance; uint16_t ifproto; @@ -136,13 +134,8 @@ typedef struct rds_prwqn { typedef struct rds_streams_s { kmutex_t lock; kcondvar_t cv; - major_t major; - queue_t *ipqueue; - vnode_t *ip_vp; queue_t *arpqueue; vnode_t *arp_vp; - queue_t *ip6queue; - vnode_t *ip6_vp; int status; rds_prwqn_t *wqnp; } rds_streams_t; diff --git a/usr/src/uts/intel/rdsib/Makefile b/usr/src/uts/intel/rdsib/Makefile index c83fbb9e0e..6041335f01 100644 --- a/usr/src/uts/intel/rdsib/Makefile +++ b/usr/src/uts/intel/rdsib/Makefile @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # #ident "%Z%%M% %I% %E% SMI" @@ -38,7 +38,7 @@ MODULE = rdsib OBJECTS = $(RDSIB_OBJS:%=$(OBJS_DIR)/%) LINTS = $(RDSIB_OBJS:%.o=$(LINTS_DIR)/%.ln) ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE) -LDFLAGS += -dy -Ndrv/rds -Nmisc/ibtl -Nmisc/ibcm +LDFLAGS += -dy -Ndrv/rds -Nmisc/ibtl -Nmisc/ibcm -Ndrv/ip CONF_SRCDIR = $(UTSBASE)/common/io/ib/clients/rds # # Include common rules. diff --git a/usr/src/uts/sparc/rdsib/Makefile b/usr/src/uts/sparc/rdsib/Makefile index 8015c95aa7..ee14ea9c1d 100755 --- a/usr/src/uts/sparc/rdsib/Makefile +++ b/usr/src/uts/sparc/rdsib/Makefile @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # #ident "%Z%%M% %I% %E% SMI" @@ -61,7 +61,7 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE) # CFLAGS += $(CCVERBOSE) -LDFLAGS += -dy -Ndrv/rds -Nmisc/ibtl -Nmisc/ibcm +LDFLAGS += -dy -Ndrv/rds -Nmisc/ibtl -Nmisc/ibcm -Ndrv/ip # # Default build targets. |