components/net-snmp/patches/038.16032482.kernel_sunos5.patch
branchs11u1-sru
changeset 3022 7f059e598d55
equal deleted inserted replaced
3015:90a75efeb254 3022:7f059e598d55
       
     1 --- net-snmp-5.4.1.old/snmplib/Makefile.in  2013-08-16 04:02:40.253396400 -0700
       
     2 +++ net-snmp-5.4.1/snmplib/Makefile.in 2013-08-01 03:20:45.668713600 -0700
       
     3 @@ -182,7 +182,7 @@
       
     4  TOBJS=$(LOBJS)
       
     5 
       
     6  # To satisfy -zdefs
       
     7 -LIB_LD_ADD	=-lnsl -lsocket -L$(libdir)
       
     8 +LIB_LD_ADD	=-lnsl -lsocket -ldladm -L$(libdir)
       
     9 
       
    10  #
       
    11  CPPFLAGS = $(TOP_INCLUDES) -I. 	$(SNMPLIB_INCLUDES) @CPPFLAGS@
       
    12 --- net-snmp-5.4.1.old/agent/mibgroup/kernel_sunos5.c	2014-02-25 06:04:49.253524010 -0500
       
    13 +++ net-snmp-5.4.1/agent/mibgroup/kernel_sunos5.c	2014-02-26 05:32:10.697219080 -0500
       
    14 @@ -60,6 +60,8 @@
       
    15  #include <net/if.h>
       
    16  #include <netinet/in.h>
       
    17  
       
    18 +#include <libdladm.h>
       
    19 +#include <libdllink.h>
       
    20  /*-
       
    21   * Includes of local application header files 
       
    22   */
       
    23 @@ -172,7 +174,7 @@
       
    24  set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
       
    25              boolean_t flags_unknown, int mtu);
       
    26  static int get_if_stats(mib2_ifEntry_t *ifp);
       
    27 -
       
    28 +static int link_to_phydev(char *link, char *phy_devname);
       
    29  #if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)
       
    30  static int _dlpi_open(const char *devname);
       
    31  static int _dlpi_get_phys_address(int fd, char *paddr, int maxlen,
       
    32 @@ -1724,11 +1726,155 @@
       
    33  }
       
    34  #endif /*defined(HAVE_IF_NAMEINDEX)&&defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)*/
       
    35  
       
    36 +int link_to_phydev(char *link, char *phy_devname)
       
    37 +{
       
    38 +        char *key = NULL;
       
    39 +        datalink_id_t linkid;
       
    40 +        dladm_phys_attr_t dpa;
       
    41 +        dladm_handle_t handle;
       
    42 +
       
    43 +        if (dladm_open(&handle, NULL) != DLADM_STATUS_OK) {
       
    44 +            DEBUGMSGTL(("kernel_sunos5","dladm_open failed "
       
    45 +                       "with errno=%d\n",errno));
       
    46 +            return (-1);
       
    47 +        }
       
    48 +
       
    49 +        if (dladm_name2info(handle, link, &linkid, NULL, NULL, NULL) !=
       
    50 +            DLADM_STATUS_OK) {
       
    51 +                DEBUGMSGTL(("kernel_sunos5","dladm_name2info failed "
       
    52 +                           "with errno=%d\n",errno));
       
    53 +                dladm_close(handle);
       
    54 +                return (-1);
       
    55 +        }
       
    56 +
       
    57 +        /*
       
    58 +         * Get the device name of the link, which will be used as the door
       
    59 +         * file name used to communicate with the driver.
       
    60 +         */
       
    61 +        if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) !=
       
    62 +            DLADM_STATUS_OK) {
       
    63 +                DEBUGMSGTL(("kernel_sunos5","dladm_phys_info failed "
       
    64 +                           "with errno=%d\n",errno));
       
    65 +                dladm_close(handle);
       
    66 +                return (-1);
       
    67 +        }
       
    68 +
       
    69 +        if(dpa.dp_dev == NULL) {
       
    70 +            DEBUGMSGTL(("kernel_sunos5","device name from "
       
    71 +                       "dladm_phys_info = NULL\n")); 
       
    72 +            dladm_close(handle);
       
    73 +            return -1;
       
    74 +        
       
    75 +        }
       
    76 +        strcpy(phy_devname, dpa.dp_dev);
       
    77 +        dladm_close(handle); 
       
    78 +        
       
    79 +        return 0;
       
    80 +}
       
    81 +
       
    82 +
       
    83 +static int getKstatIntInstance(const char *classname, int instance,
       
    84 +                               const char *statname, const char *varname,
       
    85 +                               int *value)
       
    86 +{
       
    87 +    kstat_ctl_t    *ksc;
       
    88 +    kstat_t        *ks;
       
    89 +    kid_t           kid;
       
    90 +    kstat_named_t  *named;
       
    91 +
       
    92 +    int             ret = -1;        /* fail unless ... */
       
    93 +    int             lookup_stat = 0;
       
    94 +    
       
    95 +    DEBUGMSGTL(("kernel_sunos5","\n Inside getKstatIntInstance: variable = %s",
       
    96 +               varname));
       
    97 +
       
    98 +    if (kstat_fd == 0) {
       
    99 +        kstat_fd = kstat_open();
       
   100 +        if (kstat_fd == 0) {
       
   101 +            snmp_log_perror("kstat_open");
       
   102 +        }
       
   103 +    }
       
   104 +    if ((ksc = kstat_fd) == NULL) {
       
   105 +        goto Return;
       
   106 +    }
       
   107 +
       
   108 +    ks = kstat_lookup(ksc, classname, instance, statname);
       
   109 +    if (ks == NULL) {
       
   110 +        DEBUGMSGTL(("kernel_sunos5","\nclass %s, stat %s not found\n",
       
   111 +                   classname ? classname : "NULL",
       
   112 +                   statname ? statname : "NULL"));
       
   113 +        goto Return;
       
   114 +    }
       
   115 +
       
   116 +    kid = kstat_read(ksc, ks, NULL);
       
   117 +    if (kid == -1) {
       
   118 +        DEBUGMSGTL(("kernel_sunos5","\ncannot read class %s stats %s\n",
       
   119 +                   classname ? classname : "NULL", 
       
   120 +                   statname ? statname : "NULL"));
       
   121 +        goto Return;
       
   122 +    }
       
   123 +
       
   124 +    named = kstat_data_lookup(ks, varname);
       
   125 +    if (named == NULL) {
       
   126 +         DEBUGMSGTL(("kernel_sunos5","\nno var %s for class %s stat %s\n",
       
   127 +                    varname, classname ? classname : "NULL",
       
   128 +                    statname ? statname : "NULL"));
       
   129 +         goto Return;
       
   130 +    }
       
   131 +    ret = 0;                /* maybe successful */
       
   132 +    switch (named->data_type) {
       
   133 +#ifdef KSTAT_DATA_INT32         /* Solaris 2.6 and up */
       
   134 +    case KSTAT_DATA_INT32:
       
   135 +        DEBUGMSGTL(("kernel_sunos5"," value: %d\n", named->value.i32));
       
   136 +        *value = named->value.i32; 
       
   137 +        break;
       
   138 +    case KSTAT_DATA_UINT32:
       
   139 +        DEBUGMSGTL(("kernel_sunos5"," value: %u\n", named->value.ui32));
       
   140 +        *value = named->value.ui32; 
       
   141 +        break;
       
   142 +    case KSTAT_DATA_INT64:
       
   143 +        DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.i64));
       
   144 +        *value = named->value.i64;
       
   145 +        break;
       
   146 +    case KSTAT_DATA_UINT64:
       
   147 +        DEBUGMSGTL(("kernel_sunos5"," value: %llu\n", named->value.ui64));
       
   148 +        *value = named->value.ui64; 
       
   149 +        break;
       
   150 +#else
       
   151 +    case KSTAT_DATA_LONG:
       
   152 +        DEBUGMSGTL(("kernel_sunos5"," value: %ld\n", named->value.l));
       
   153 +        *value = named->value.l; 
       
   154 +        break;
       
   155 +    case KSTAT_DATA_ULONG:
       
   156 +        DEBUGMSGTL(("kernel_sunos5"," value: %lu\n", named->value.ul));
       
   157 +        *value = named->value.ul; 
       
   158 +        break;
       
   159 +    case KSTAT_DATA_LONGLONG:
       
   160 +        DEBUGMSGTL(("kernel_sunos5"," value: %lld\n", (long) named->value.ll));
       
   161 +        *value = (long)named->value.ll;  
       
   162 +        break;
       
   163 +    case KSTAT_DATA_ULONGLONG:
       
   164 +        DEBUGMSGTL(("kernel_sunos5"," value: %llu\n",
       
   165 +                   (unsigned long) named->value.ull));
       
   166 +        *value = (unsigned long)named->value.ull;  
       
   167 +        break;
       
   168 +#endif
       
   169 +    default:
       
   170 +        ret = -1;            /* fail */
       
   171 +        break;
       
   172 +    }
       
   173 + Return:
       
   174 +    return ret;
       
   175 +}
       
   176 +
       
   177  static void
       
   178  set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
       
   179              boolean_t flags_unknown, int mtu)
       
   180  { 
       
   181      boolean_t havespeed = B_FALSE;
       
   182 +    char phydevname[100];
       
   183 +    char devbasename[100];
       
   184 +    int instance = -1;
       
   185  
       
   186      /*
       
   187       * Set basic information 
       
   188 @@ -1770,6 +1916,16 @@
       
   189          /* only UPed interfaces get correct link status - if any */
       
   190          if (getKstatInt(NULL, name,"link_up",&i_tmp) == 0) {
       
   191              ifp->ifOperStatus = i_tmp ? 1 : 2;
       
   192 +        } else if(link_to_phydev(name, phydevname) == 0) {
       
   193 +                 strcpy(devbasename, phydevname);
       
   194 +                 DEBUGMSGTL(("kernel_sunos5","phydevname = %s\n", phydevname));
       
   195 +                 _dlpi_parse_devname(devbasename, &instance);
       
   196 +                 DEBUGMSGTL(("kernel_sunos5","devbasename = %s, "
       
   197 +                            "instance= %d\n", devbasename, instance));
       
   198 +                 if(getKstatIntInstance(devbasename, instance, "phys",
       
   199 +                                        "link_up", &i_tmp) == 0) {
       
   200 +                     ifp->ifOperStatus = i_tmp ? 1 : 2;
       
   201 +                 } 
       
   202  #ifdef IFF_FAILED
       
   203          } else if (flags & IFF_FAILED) {
       
   204              /*