components/net-snmp/patches/006.16742.patch
changeset 252 ee0fb1eabcbf
equal deleted inserted replaced
251:f527656d334f 252:ee0fb1eabcbf
       
     1 Index: net-snmp/agent/mibgroup/kernel_sunos5.c
       
     2 ===================================================================
       
     3 --- net-snmp/agent/mibgroup/kernel_sunos5.c	(revision 16741)
       
     4 +++ net-snmp/agent/mibgroup/kernel_sunos5.c	(revision 16742)
       
     5 @@ -173,12 +173,14 @@
       
     6              int mtu);
       
     7  static int get_if_stats(mib2_ifEntry_t *ifp);
       
     8  
       
     9 +#if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)
       
    10  static int _dlpi_open(const char *devname);
       
    11  static int _dlpi_get_phys_address(int fd, char *paddr, int maxlen,
       
    12                                    int *paddrlen);
       
    13  static int _dlpi_get_iftype(int fd, unsigned int *iftype);
       
    14  static int _dlpi_attach(int fd, int ppa);
       
    15  static int _dlpi_parse_devname(char *devname, int *ppap);
       
    16 +#endif
       
    17  
       
    18  
       
    19  
       
    20 @@ -1044,8 +1046,300 @@
       
    21   * Get info for interfaces group. Mimics getmib interface as much as possible
       
    22   * to be substituted later if SunSoft decides to extend its mib2 interface.
       
    23   */
       
    24 +
       
    25  #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)
       
    26 +
       
    27 +/*
       
    28 + * If IFTABLE_REWRITES is enabled, then we will also rely on DLPI to obtain
       
    29 + * information from the NIC.
       
    30 + */
       
    31 +
       
    32 +/*
       
    33 + * Open a DLPI device.
       
    34 + *
       
    35 + * On success the file descriptor is returned.
       
    36 + * On error -1 is returned.
       
    37 + */
       
    38  static int
       
    39 +_dlpi_open(const char *devname)
       
    40 +{
       
    41 +    char *devstr;
       
    42 +    int fd = -1;
       
    43 +    int ppa = -1;
       
    44 +
       
    45 +    DEBUGMSGTL(("kernel_sunos5", "_dlpi_open called\n"));
       
    46 +
       
    47 +    if (devname == NULL)
       
    48 +        return (-1);
       
    49 +
       
    50 +    if ((devstr = malloc(5 + strlen(devname) + 1)) == NULL)
       
    51 +        return (-1);
       
    52 +    (void) sprintf(devstr, "/dev/%s", devname);
       
    53 +    DEBUGMSGTL(("kernel_sunos5:dlpi", "devstr(%s)\n", devstr));
       
    54 +    /*
       
    55 +     * First try opening the device using style 1, if the device does not
       
    56 +     * exist we try style 2. Modules will not be pushed, so something like
       
    57 +     * ip tunnels will not work. 
       
    58 +     */
       
    59 +   
       
    60 +    DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open(%s)\n", devstr));
       
    61 +    if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) < 0) {
       
    62 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open failed\n"));
       
    63 +        if (_dlpi_parse_devname(devstr, &ppa) == 0) {
       
    64 +            DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 parse: %s, %d\n", 
       
    65 +                       devstr, ppa));
       
    66 +            /* try style 2 */
       
    67 +            DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open(%s)\n", devstr));
       
    68 +
       
    69 +            if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) != -1) {
       
    70 +                if (_dlpi_attach(fd, ppa) == 0) {
       
    71 +                    DEBUGMSGTL(("kernel_sunos5:dlpi", "attached\n"));
       
    72 +                } else {
       
    73 +                    DEBUGMSGTL(("kernel_sunos5:dlpi", "attached failed\n"));
       
    74 +                    close(fd);
       
    75 +                    fd = -1;
       
    76 +                }
       
    77 +            } else {
       
    78 +                DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open failed\n"));
       
    79 +            }
       
    80 +        } 
       
    81 +    } else {
       
    82 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open succeeded\n"));
       
    83 +    }
       
    84 +
       
    85 +    /* clean up */
       
    86 +    free(devstr);
       
    87 +
       
    88 +    return (fd);
       
    89 +}
       
    90 +
       
    91 +/*
       
    92 + * Obtain the physical address of the interface using DLPI
       
    93 + */
       
    94 +static int
       
    95 +_dlpi_get_phys_address(int fd, char *addr, int maxlen, int *addrlen)
       
    96 +{
       
    97 +    dl_phys_addr_req_t  paddr_req;
       
    98 +    union DL_primitives *dlp;
       
    99 +    struct strbuf       ctlbuf;
       
   100 +    char                buf[MAX(DL_PHYS_ADDR_ACK_SIZE+64, DL_ERROR_ACK_SIZE)];
       
   101 +    int                 flag = 0;
       
   102 +
       
   103 +    DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_phys_address\n"));
       
   104 +
       
   105 +    paddr_req.dl_primitive = DL_PHYS_ADDR_REQ;
       
   106 +    paddr_req.dl_addr_type = DL_CURR_PHYS_ADDR;
       
   107 +    ctlbuf.buf = (char *)&paddr_req;
       
   108 +    ctlbuf.len = DL_PHYS_ADDR_REQ_SIZE;
       
   109 +    if (putmsg(fd, &ctlbuf, NULL, 0) < 0)
       
   110 +        return (-1);
       
   111 +    
       
   112 +    ctlbuf.maxlen = sizeof(buf);
       
   113 +    ctlbuf.len = 0;
       
   114 +    ctlbuf.buf = buf;
       
   115 +    if (getmsg(fd, &ctlbuf, NULL, &flag) < 0)
       
   116 +        return (-1);
       
   117 +
       
   118 +    if (ctlbuf.len < sizeof(uint32_t))
       
   119 +        return (-1);
       
   120 +    dlp = (union DL_primitives *)buf;
       
   121 +    switch (dlp->dl_primitive) {
       
   122 +    case DL_PHYS_ADDR_ACK: {
       
   123 +        dl_phys_addr_ack_t *phyp = (dl_phys_addr_ack_t *)buf;
       
   124 +
       
   125 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "got ACK\n"));
       
   126 +        if (ctlbuf.len < DL_PHYS_ADDR_ACK_SIZE || phyp->dl_addr_length > maxlen)
       
   127 +            return (-1); 
       
   128 +        (void) memcpy(addr, buf+phyp->dl_addr_offset, phyp->dl_addr_length);
       
   129 +        *addrlen = phyp->dl_addr_length;
       
   130 +        return (0);
       
   131 +    }
       
   132 +    case DL_ERROR_ACK: {
       
   133 +        dl_error_ack_t *errp = (dl_error_ack_t *)buf;
       
   134 +
       
   135 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "got ERROR ACK\n"));
       
   136 +        if (ctlbuf.len < DL_ERROR_ACK_SIZE)
       
   137 +            return (-1);
       
   138 +        return (errp->dl_errno);
       
   139 +    }
       
   140 +    default:
       
   141 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "got type: %x\n", dlp->dl_primitive));
       
   142 +        return (-1);
       
   143 +    }
       
   144 +}
       
   145 +
       
   146 +/*
       
   147 + * Query the interface about it's type.
       
   148 + */
       
   149 +static int
       
   150 +_dlpi_get_iftype(int fd, unsigned int *iftype)
       
   151 +{
       
   152 +    dl_info_req_t info_req;
       
   153 +    union DL_primitives *dlp;
       
   154 +    struct strbuf       ctlbuf;
       
   155 +    char                buf[MAX(DL_INFO_ACK_SIZE, DL_ERROR_ACK_SIZE)];
       
   156 +    int                 flag = 0;
       
   157 +
       
   158 +    DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_iftype\n"));
       
   159 +
       
   160 +    info_req.dl_primitive = DL_INFO_REQ;
       
   161 +    ctlbuf.buf = (char *)&info_req;
       
   162 +    ctlbuf.len = DL_INFO_REQ_SIZE;
       
   163 +    if (putmsg(fd, &ctlbuf, NULL, 0) < 0) {
       
   164 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "putmsg failed: %d\nn", errno));
       
   165 +        return (-1);
       
   166 +    }
       
   167 +    
       
   168 +    ctlbuf.maxlen = sizeof(buf);
       
   169 +    ctlbuf.len = 0;
       
   170 +    ctlbuf.buf = buf;
       
   171 +    if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) {
       
   172 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "getmsg failed: %d\n", errno));
       
   173 +        return (-1);
       
   174 +    }
       
   175 +
       
   176 +    if (ctlbuf.len < sizeof(uint32_t))
       
   177 +        return (-1);
       
   178 +    dlp = (union DL_primitives *)buf;
       
   179 +    switch (dlp->dl_primitive) {
       
   180 +    case DL_INFO_ACK: {
       
   181 +        dl_info_ack_t *info = (dl_info_ack_t *)buf;
       
   182 +
       
   183 +        if (ctlbuf.len < DL_INFO_ACK_SIZE)
       
   184 +            return (-1); 
       
   185 +
       
   186 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "dl_mac_type: %x\n",
       
   187 +	           info->dl_mac_type));
       
   188 +	switch (info->dl_mac_type) {
       
   189 +	case DL_CSMACD:
       
   190 +	case DL_ETHER:
       
   191 +	case DL_ETH_CSMA:
       
   192 +		*iftype = 6;
       
   193 +		break;
       
   194 +	case DL_TPB:	/* Token Passing Bus */
       
   195 +		*iftype = 8;
       
   196 +		break;
       
   197 +	case DL_TPR:	/* Token Passing Ring */
       
   198 +		*iftype = 9;
       
   199 +		break;
       
   200 +	case DL_HDLC:
       
   201 +		*iftype = 118;
       
   202 +		break;
       
   203 +	case DL_FDDI:
       
   204 +		*iftype = 15;
       
   205 +		break;
       
   206 +	case DL_FC:	/* Fibre channel */
       
   207 +		*iftype = 56;
       
   208 +		break;
       
   209 +	case DL_ATM:
       
   210 +		*iftype = 37;
       
   211 +		break;
       
   212 +	case DL_X25:
       
   213 +	case DL_ISDN:
       
   214 +		*iftype = 63;
       
   215 +		break;
       
   216 +	case DL_HIPPI:
       
   217 +		*iftype = 47;
       
   218 +		break;
       
   219 +#ifdef DL_IB
       
   220 +	case DL_IB:
       
   221 +		*iftype = 199;
       
   222 +		break;
       
   223 +#endif
       
   224 +	case DL_FRAME:	/* Frame Relay */
       
   225 +		*iftype = 32;
       
   226 +		break;
       
   227 +	case DL_LOOP:
       
   228 +		*iftype = 24;
       
   229 +		break;
       
   230 +#ifdef DL_WIFI
       
   231 +	case DL_WIFI:
       
   232 +		*iftype = 71;
       
   233 +		break;
       
   234 +#endif
       
   235 +#ifdef DL_IPV4	/* then IPv6 is also defined */
       
   236 +	case DL_IPV4:	/* IPv4 Tunnel */
       
   237 +	case DL_IPV6:	/* IPv6 Tunnel */
       
   238 +		*iftype = 131;
       
   239 +		break;
       
   240 +#endif
       
   241 +	default:
       
   242 +		*iftype = 1;	/* Other */
       
   243 +		break;
       
   244 +	}
       
   245 +	
       
   246 +        return (0);
       
   247 +    }
       
   248 +    case DL_ERROR_ACK: {
       
   249 +        dl_error_ack_t *errp = (dl_error_ack_t *)buf;
       
   250 +
       
   251 +        DEBUGMSGTL(("kernel_sunos5:dlpi",
       
   252 +                    "got DL_ERROR_ACK: dlpi %d, error %d\n", errp->dl_errno,
       
   253 +                    errp->dl_unix_errno));
       
   254 +
       
   255 +        if (ctlbuf.len < DL_ERROR_ACK_SIZE)
       
   256 +            return (-1);
       
   257 +        return (errp->dl_errno);
       
   258 +    }
       
   259 +    default:
       
   260 +        DEBUGMSGTL(("kernel_sunos5:dlpi", "got type %x\n", dlp->dl_primitive));
       
   261 +        return (-1);
       
   262 +    }
       
   263 +}
       
   264 +
       
   265 +static int
       
   266 +_dlpi_attach(int fd, int ppa)
       
   267 +{
       
   268 +    dl_attach_req_t     attach_req;
       
   269 +    struct strbuf       ctlbuf;
       
   270 +    union DL_primitives *dlp;
       
   271 +    char                buf[MAX(DL_OK_ACK_SIZE, DL_ERROR_ACK_SIZE)];
       
   272 +    int                 flag = 0;
       
   273 +   
       
   274 +    attach_req.dl_primitive = DL_ATTACH_REQ;
       
   275 +    attach_req.dl_ppa = ppa;
       
   276 +    ctlbuf.buf = (char *)&attach_req;
       
   277 +    ctlbuf.len = DL_ATTACH_REQ_SIZE;
       
   278 +    if (putmsg(fd, &ctlbuf, NULL, 0) != 0)
       
   279 +        return (-1);
       
   280 +
       
   281 +    ctlbuf.buf = buf;
       
   282 +    ctlbuf.len = 0;
       
   283 +    ctlbuf.maxlen = sizeof(buf);
       
   284 +    if (getmsg(fd, &ctlbuf, NULL, &flag) != 0)
       
   285 +        return (-1);
       
   286 +
       
   287 +    if (ctlbuf.len < sizeof(uint32_t))
       
   288 +        return (-1); 
       
   289 +
       
   290 +    dlp = (union DL_primitives *)buf;
       
   291 +    if (dlp->dl_primitive == DL_OK_ACK && ctlbuf.len >= DL_OK_ACK_SIZE)
       
   292 +        return (0); 
       
   293 +    return (-1);
       
   294 +}
       
   295 +
       
   296 +static int
       
   297 +_dlpi_parse_devname(char *devname, int *ppap)
       
   298 +{
       
   299 +    int ppa = 0;
       
   300 +    int m = 1;
       
   301 +    int i = strlen(devname) - 1;
       
   302 +
       
   303 +    while (i >= 0 && isdigit(devname[i])) {
       
   304 +        ppa += m * (devname[i] - '0'); 
       
   305 +        m *= 10;
       
   306 +        i--;
       
   307 +    }
       
   308 +
       
   309 +    if (m == 1) {
       
   310 +        return (-1);
       
   311 +    }
       
   312 +    *ppap = ppa;
       
   313 +    devname[i + 1] = '\0';
       
   314 +
       
   315 +    return (0);
       
   316 +}
       
   317 +static int
       
   318  getif(mib2_ifEntry_t *ifbuf, size_t size, req_e req_type,
       
   319        mib2_ifEntry_t *resp,  size_t *length, int (*comp)(void *, void *),
       
   320        void *arg)
       
   321 @@ -1229,7 +1523,8 @@
       
   322  
       
   323  	if (ioctl(ifsd, SIOCGIFFLAGS, ifrp) < 0) {
       
   324  	    ret = -1;
       
   325 -	    snmp_log(LOG_ERR, "SIOCGIFFLAGS %s: %s\n", ifrp->ifr_name, strerror(errno));
       
   326 +	    snmp_log(LOG_ERR, "SIOCGIFFLAGS %s: %s\n", ifrp->ifr_name,
       
   327 +                     strerror(errno));
       
   328  	    goto Return;
       
   329  	}
       
   330          if_flags = ifrp->ifr_flags;
       
   331 @@ -1522,294 +1817,7 @@
       
   332                                        ifp->ifHCOutMulticastPkts);
       
   333      return(0);
       
   334  }
       
   335 -
       
   336  /*
       
   337 - * Open a DLPI device.
       
   338 - *
       
   339 - * On success the file descriptor is returned.
       
   340 - * On error -1 is returned.
       
   341 - */
       
   342 -static int
       
   343 -_dlpi_open(const char *devname)
       
   344 -{
       
   345 -    char *devstr;
       
   346 -    int fd = -1;
       
   347 -    int ppa = -1;
       
   348 -
       
   349 -    DEBUGMSGTL(("kernel_sunos5", "_dlpi_open called\n"));
       
   350 -
       
   351 -    if (devname == NULL)
       
   352 -        return (-1);
       
   353 -
       
   354 -    if ((devstr = malloc(5 + strlen(devname) + 1)) == NULL)
       
   355 -        return (-1);
       
   356 -    (void) sprintf(devstr, "/dev/%s", devname);
       
   357 -    DEBUGMSGTL(("kernel_sunos5:dlpi", "devstr(%s)\n", devstr));
       
   358 -    /*
       
   359 -     * First try opening the device using style 1, if the device does not
       
   360 -     * exist we try style 2. Modules will not be pushed, so something like
       
   361 -     * ip tunnels will not work. 
       
   362 -     */
       
   363 -   
       
   364 -    DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open(%s)\n", devstr));
       
   365 -    if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) < 0) {
       
   366 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open failed\n"));
       
   367 -        if (_dlpi_parse_devname(devstr, &ppa) == 0) {
       
   368 -            DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 parse: %s, %d\n", 
       
   369 -                       devstr, ppa));
       
   370 -            /* try style 2 */
       
   371 -            DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open(%s)\n", devstr));
       
   372 -
       
   373 -            if ((fd = open(devstr, O_RDWR | O_NONBLOCK)) != -1) {
       
   374 -                if (_dlpi_attach(fd, ppa) == 0) {
       
   375 -                    DEBUGMSGTL(("kernel_sunos5:dlpi", "attached\n"));
       
   376 -                } else {
       
   377 -                    DEBUGMSGTL(("kernel_sunos5:dlpi", "attached failed\n"));
       
   378 -                    close(fd);
       
   379 -                    fd = -1;
       
   380 -                }
       
   381 -            } else {
       
   382 -                DEBUGMSGTL(("kernel_sunos5:dlpi", "style2 open failed\n"));
       
   383 -            }
       
   384 -        } 
       
   385 -    } else {
       
   386 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "style1 open succeeded\n"));
       
   387 -    }
       
   388 -
       
   389 -    /* clean up */
       
   390 -    free(devstr);
       
   391 -
       
   392 -    return (fd);
       
   393 -}
       
   394 -
       
   395 -/*
       
   396 - * Obtain the physical address of the interface using DLPI
       
   397 - */
       
   398 -static int
       
   399 -_dlpi_get_phys_address(int fd, char *addr, int maxlen, int *addrlen)
       
   400 -{
       
   401 -    dl_phys_addr_req_t  paddr_req;
       
   402 -    union DL_primitives *dlp;
       
   403 -    struct strbuf       ctlbuf;
       
   404 -    char                buf[MAX(DL_PHYS_ADDR_ACK_SIZE+64, DL_ERROR_ACK_SIZE)];
       
   405 -    int                 flag = 0;
       
   406 -
       
   407 -    DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_phys_address\n"));
       
   408 -
       
   409 -    paddr_req.dl_primitive = DL_PHYS_ADDR_REQ;
       
   410 -    paddr_req.dl_addr_type = DL_CURR_PHYS_ADDR;
       
   411 -    ctlbuf.buf = (char *)&paddr_req;
       
   412 -    ctlbuf.len = DL_PHYS_ADDR_REQ_SIZE;
       
   413 -    if (putmsg(fd, &ctlbuf, NULL, 0) < 0)
       
   414 -        return (-1);
       
   415 -    
       
   416 -    ctlbuf.maxlen = sizeof(buf);
       
   417 -    ctlbuf.len = 0;
       
   418 -    ctlbuf.buf = buf;
       
   419 -    if (getmsg(fd, &ctlbuf, NULL, &flag) < 0)
       
   420 -        return (-1);
       
   421 -
       
   422 -    if (ctlbuf.len < sizeof(uint32_t))
       
   423 -        return (-1);
       
   424 -    dlp = (union DL_primitives *)buf;
       
   425 -    switch (dlp->dl_primitive) {
       
   426 -    case DL_PHYS_ADDR_ACK: {
       
   427 -        dl_phys_addr_ack_t *phyp = (dl_phys_addr_ack_t *)buf;
       
   428 -
       
   429 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "got ACK\n"));
       
   430 -        if (ctlbuf.len < DL_PHYS_ADDR_ACK_SIZE || phyp->dl_addr_length > maxlen)
       
   431 -            return (-1); 
       
   432 -        (void) memcpy(addr, buf+phyp->dl_addr_offset, phyp->dl_addr_length);
       
   433 -        *addrlen = phyp->dl_addr_length;
       
   434 -        return (0);
       
   435 -    }
       
   436 -    case DL_ERROR_ACK: {
       
   437 -        dl_error_ack_t *errp = (dl_error_ack_t *)buf;
       
   438 -
       
   439 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "got ERROR ACK\n"));
       
   440 -        if (ctlbuf.len < DL_ERROR_ACK_SIZE)
       
   441 -            return (-1);
       
   442 -        return (errp->dl_errno);
       
   443 -    }
       
   444 -    default:
       
   445 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "got type: %x\n", dlp->dl_primitive));
       
   446 -        return (-1);
       
   447 -    }
       
   448 -}
       
   449 -
       
   450 -/*
       
   451 - * Query the interface about it's type.
       
   452 - */
       
   453 -static int
       
   454 -_dlpi_get_iftype(int fd, unsigned int *iftype)
       
   455 -{
       
   456 -    dl_info_req_t info_req;
       
   457 -    union DL_primitives *dlp;
       
   458 -    struct strbuf       ctlbuf;
       
   459 -    char                buf[MAX(DL_INFO_ACK_SIZE, DL_ERROR_ACK_SIZE)];
       
   460 -    int                 flag = 0;
       
   461 -
       
   462 -    DEBUGMSGTL(("kernel_sunos5:dlpi", "_dlpi_get_iftype\n"));
       
   463 -
       
   464 -    info_req.dl_primitive = DL_INFO_REQ;
       
   465 -    ctlbuf.buf = (char *)&info_req;
       
   466 -    ctlbuf.len = DL_INFO_REQ_SIZE;
       
   467 -    if (putmsg(fd, &ctlbuf, NULL, 0) < 0) {
       
   468 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "putmsg failed: %d\nn", errno));
       
   469 -        return (-1);
       
   470 -    }
       
   471 -    
       
   472 -    ctlbuf.maxlen = sizeof(buf);
       
   473 -    ctlbuf.len = 0;
       
   474 -    ctlbuf.buf = buf;
       
   475 -    if (getmsg(fd, &ctlbuf, NULL, &flag) < 0) {
       
   476 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "getmsg failed: %d\n", errno));
       
   477 -        return (-1);
       
   478 -    }
       
   479 -
       
   480 -    if (ctlbuf.len < sizeof(uint32_t))
       
   481 -        return (-1);
       
   482 -    dlp = (union DL_primitives *)buf;
       
   483 -    switch (dlp->dl_primitive) {
       
   484 -    case DL_INFO_ACK: {
       
   485 -        dl_info_ack_t *info = (dl_info_ack_t *)buf;
       
   486 -
       
   487 -        if (ctlbuf.len < DL_INFO_ACK_SIZE)
       
   488 -            return (-1); 
       
   489 -
       
   490 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "dl_mac_type: %x\n",
       
   491 -	           info->dl_mac_type));
       
   492 -	switch (info->dl_mac_type) {
       
   493 -	case DL_CSMACD:
       
   494 -	case DL_ETHER:
       
   495 -	case DL_ETH_CSMA:
       
   496 -		*iftype = 6;
       
   497 -		break;
       
   498 -	case DL_TPB:	/* Token Passing Bus */
       
   499 -		*iftype = 8;
       
   500 -		break;
       
   501 -	case DL_TPR:	/* Token Passing Ring */
       
   502 -		*iftype = 9;
       
   503 -		break;
       
   504 -	case DL_HDLC:
       
   505 -		*iftype = 118;
       
   506 -		break;
       
   507 -	case DL_FDDI:
       
   508 -		*iftype = 15;
       
   509 -		break;
       
   510 -	case DL_FC:	/* Fibre channel */
       
   511 -		*iftype = 56;
       
   512 -		break;
       
   513 -	case DL_ATM:
       
   514 -		*iftype = 37;
       
   515 -		break;
       
   516 -	case DL_X25:
       
   517 -	case DL_ISDN:
       
   518 -		*iftype = 63;
       
   519 -		break;
       
   520 -	case DL_HIPPI:
       
   521 -		*iftype = 47;
       
   522 -		break;
       
   523 -#ifdef DL_IB
       
   524 -	case DL_IB:
       
   525 -		*iftype = 199;
       
   526 -		break;
       
   527 -#endif
       
   528 -	case DL_FRAME:	/* Frame Relay */
       
   529 -		*iftype = 32;
       
   530 -		break;
       
   531 -	case DL_LOOP:
       
   532 -		*iftype = 24;
       
   533 -		break;
       
   534 -#ifdef DL_WIFI
       
   535 -	case DL_WIFI:
       
   536 -		*iftype = 71;
       
   537 -		break;
       
   538 -#endif
       
   539 -#ifdef DL_IPV4	/* then IPv6 is also defined */
       
   540 -	case DL_IPV4:	/* IPv4 Tunnel */
       
   541 -	case DL_IPV6:	/* IPv6 Tunnel */
       
   542 -		*iftype = 131;
       
   543 -		break;
       
   544 -#endif
       
   545 -	default:
       
   546 -		*iftype = 1;	/* Other */
       
   547 -		break;
       
   548 -	}
       
   549 -	
       
   550 -        return (0);
       
   551 -    }
       
   552 -    case DL_ERROR_ACK: {
       
   553 -        dl_error_ack_t *errp = (dl_error_ack_t *)buf;
       
   554 -
       
   555 -        DEBUGMSGTL(("kernel_sunos5:dlpi",
       
   556 -                    "got DL_ERROR_ACK: dlpi %d, error %d\n", errp->dl_errno,
       
   557 -                    errp->dl_unix_errno));
       
   558 -
       
   559 -        if (ctlbuf.len < DL_ERROR_ACK_SIZE)
       
   560 -            return (-1);
       
   561 -        return (errp->dl_errno);
       
   562 -    }
       
   563 -    default:
       
   564 -        DEBUGMSGTL(("kernel_sunos5:dlpi", "got type %x\n", dlp->dl_primitive));
       
   565 -        return (-1);
       
   566 -    }
       
   567 -}
       
   568 -
       
   569 -static int
       
   570 -_dlpi_attach(int fd, int ppa)
       
   571 -{
       
   572 -    dl_attach_req_t     attach_req;
       
   573 -    struct strbuf       ctlbuf;
       
   574 -    union DL_primitives *dlp;
       
   575 -    char                buf[MAX(DL_OK_ACK_SIZE, DL_ERROR_ACK_SIZE)];
       
   576 -    int                 flag = 0;
       
   577 -   
       
   578 -    attach_req.dl_primitive = DL_ATTACH_REQ;
       
   579 -    attach_req.dl_ppa = ppa;
       
   580 -    ctlbuf.buf = (char *)&attach_req;
       
   581 -    ctlbuf.len = DL_ATTACH_REQ_SIZE;
       
   582 -    if (putmsg(fd, &ctlbuf, NULL, 0) != 0)
       
   583 -        return (-1);
       
   584 -
       
   585 -    ctlbuf.buf = buf;
       
   586 -    ctlbuf.len = 0;
       
   587 -    ctlbuf.maxlen = sizeof(buf);
       
   588 -    if (getmsg(fd, &ctlbuf, NULL, &flag) != 0)
       
   589 -        return (-1);
       
   590 -
       
   591 -    if (ctlbuf.len < sizeof(uint32_t))
       
   592 -        return (-1); 
       
   593 -
       
   594 -    dlp = (union DL_primitives *)buf;
       
   595 -    if (dlp->dl_primitive == DL_OK_ACK && ctlbuf.len >= DL_OK_ACK_SIZE)
       
   596 -        return (0); 
       
   597 -    return (-1);
       
   598 -}
       
   599 -
       
   600 -static int
       
   601 -_dlpi_parse_devname(char *devname, int *ppap)
       
   602 -{
       
   603 -    int ppa = 0;
       
   604 -    int m = 1;
       
   605 -    int i = strlen(devname) - 1;
       
   606 -
       
   607 -    while (i >= 0 && isdigit(devname[i])) {
       
   608 -        ppa += m * (devname[i] - '0'); 
       
   609 -        m *= 10;
       
   610 -        i--;
       
   611 -    }
       
   612 -
       
   613 -    if (m == 1) {
       
   614 -        return (-1);
       
   615 -    }
       
   616 -    *ppap = ppa;
       
   617 -    devname[i + 1] = '\0';
       
   618 -
       
   619 -    return (0);
       
   620 -}
       
   621 -
       
   622 -/*
       
   623   * Always TRUE. May be used as a comparison function in getMibstat
       
   624   * to obtain the whole table (GET_FIRST should be used) 
       
   625   */