On 2018/05/14 17:59, Jan Klemkow wrote:
> Hi,
> 
> The following diff adds an interface group table to the OpenBSD MIBs and
> the OpenSNMPd.  The new snmp table helps to keep track of the demote
> values of more complex carp setups.  To iterate directly through all
> interface groups, the diff has to extent ioctl interface by a new
> command SIOCGIFGLIST.
> 
> This new interface could also be used to extent ifconfig(8), in a later
> diff, to list all interface groups with there demote counter.
> 
> I tested this diff with snmpctl(8) from base and snmpwalk from
> net/net-snmp under current amd64.
> 
> Bye,
> Jan

This seems a reasonable thing to report on and I didn't spot any code
problems yet, one thing with the MIB file though:

> Index: share/snmp/OPENBSD-CARP-MIB.txt
> ===================================================================
> RCS file: /cvs//src/share/snmp/OPENBSD-CARP-MIB.txt,v
> retrieving revision 1.3
> diff -u -p -r1.3 OPENBSD-CARP-MIB.txt
> --- share/snmp/OPENBSD-CARP-MIB.txt   28 Sep 2012 09:21:48 -0000      1.3
> +++ share/snmp/OPENBSD-CARP-MIB.txt   14 May 2018 14:53:02 -0000
> @@ -32,7 +32,7 @@ IMPORTS
>               FROM SNMPv2-CONF;
>  
>  carpMIBObjects MODULE-IDENTITY
> -    LAST-UPDATED "201201310000Z"
> +    LAST-UPDATED "201805140000Z"
>      ORGANIZATION "OpenBSD"
>      CONTACT-INFO "
>                    Author:     Joel Knight
> @@ -41,7 +41,7 @@ carpMIBObjects MODULE-IDENTITY
>                   "
>      DESCRIPTION  "The MIB module for gathering information about
>                Common Address Redundancy Protocol (CARP) interfaces."
> -    REVISION     "201201310000Z"
> +    REVISION     "201805140000Z"
>      DESCRIPTION  "Add the OPENBSD-CARP-MIB to snmpd."
>      ::= { openBSD 6 }

This section is meant to be a sort of changelog; please add a new
REVISION/DESCRIPTION rather than changing the existing one. (Also check
that smilint is happy).

>  
> @@ -51,6 +51,7 @@ carpMIBObjects MODULE-IDENTITY
>  carpSysctl                   OBJECT IDENTIFIER ::= { carpMIBObjects 1 }
>  carpIf                               OBJECT IDENTIFIER ::= { carpMIBObjects 
> 2 }
>  carpStats                    OBJECT IDENTIFIER ::= { carpMIBObjects 3 }
> +carpGroupTable                       OBJECT IDENTIFIER ::= { carpMIBObjects 
> 4 }
>  
>  
>  -- carpSysctl
> @@ -174,6 +175,49 @@ carpIfState OBJECT-TYPE
>       DESCRIPTION
>       "Indicates the operational state of the CARP interface."
>       ::= { carpIfEntry 7 }
> +
> +
> +-- carpGroup
> +
> +carpGroupTable OBJECT-TYPE
> +     SYNTAX          SEQUENCE OF CarpGroupEntry
> +     MAX-ACCESS      not-accessible
> +     STATUS          current
> +     DESCRIPTION
> +     "A list of interface groups."
> +     ::= { carpMIBObjects 4 }
> +
> +carpGroupEntry OBJECT-TYPE
> +     SYNTAX      CarpGroupEntry
> +     MAX-ACCESS  not-accessible
> +     STATUS      current
> +     DESCRIPTION
> +     "An entry containing management information applicable to a
> +     particular interface group."
> +     INDEX   { carpGroupIndex }
> +     ::= { carpGroupTable 1 }
> +
> +CarpGroupEntry ::=
> +     SEQUENCE {
> +             carpGroupName           OCTET STRING,
> +             carpGroupDemote         Integer32
> +     }
> +
> +carpGroupName OBJECT-TYPE
> +     SYNTAX          OCTET STRING
> +     MAX-ACCESS      read-only
> +     STATUS          current
> +     DESCRIPTION
> +     "The name of the interface group."
> +     ::= { carpIfEntry 1 }
> +
> +carpGroupDemote OBJECT-TYPE
> +     SYNTAX          Integer32 (1..2147483647)
> +     MAX-ACCESS      read-only
> +     STATUS          current
> +     DESCRIPTION
> +     "The demote value of the interface group."
> +     ::= { carpIfEntry 2 }
>  
>  
>  -- carpStats
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs//src/sys/net/if.c,v
> retrieving revision 1.551
> diff -u -p -r1.551 if.c
> --- sys/net/if.c      28 Apr 2018 15:44:59 -0000      1.551
> +++ sys/net/if.c      9 May 2018 08:16:33 -0000
> @@ -145,6 +145,7 @@ int       if_getgroup(caddr_t, struct ifnet *)
>  int  if_getgroupmembers(caddr_t);
>  int  if_getgroupattribs(caddr_t);
>  int  if_setgroupattribs(caddr_t);
> +int  if_getgrouplist(caddr_t);
>  
>  void if_linkstate(struct ifnet *);
>  void if_linkstate_task(void *);
> @@ -1838,6 +1839,7 @@ ifioctl(struct socket *so, u_long cmd, c
>       case SIOCIFGCLONERS:
>       case SIOCGIFGMEMB:
>       case SIOCGIFGATTR:
> +     case SIOCGIFGLIST:
>       case SIOCGIFFLAGS:
>       case SIOCGIFXFLAGS:
>       case SIOCGIFMETRIC:
> @@ -2178,6 +2180,11 @@ ifioctl_get(u_long cmd, caddr_t data)
>               error = if_getgroupattribs(data);
>               NET_RUNLOCK();
>               return (error);
> +     case SIOCGIFGLIST:
> +             NET_RLOCK();
> +             error = if_getgrouplist(data);
> +             NET_RUNLOCK();
> +             return (error);
>       }
>  
>       ifp = ifunit(ifr->ifr_name);
> @@ -2609,6 +2616,41 @@ if_setgroupattribs(caddr_t data)
>  
>       TAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next)
>               ifgm->ifgm_ifp->if_ioctl(ifgm->ifgm_ifp, SIOCSIFGATTR, data);
> +
> +     return (0);
> +}
> +
> +/*
> + * Stores all groups in memory pointed to by data
> + */
> +int
> +if_getgrouplist(caddr_t data)
> +{
> +     struct ifgroupreq       *ifgr = (struct ifgroupreq *)data;
> +     struct ifg_group        *ifg;
> +     struct ifg_req           ifgrq, *ifgp;
> +     int                      len, error;
> +
> +     if (ifgr->ifgr_len == 0) {
> +             TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
> +                     ifgr->ifgr_len += sizeof(ifgrq);
> +             return (0);
> +     }
> +
> +     len = ifgr->ifgr_len;
> +     ifgp = ifgr->ifgr_groups;
> +     TAILQ_FOREACH(ifg, &ifg_head, ifg_next) {
> +             if (len < sizeof(ifgrq))
> +                     return (EINVAL);
> +             bzero(&ifgrq, sizeof ifgrq);
> +             strlcpy(ifgrq.ifgrq_group, ifg->ifg_group,
> +                    sizeof(ifgrq.ifgrq_group));
> +             if ((error = copyout((caddr_t)&ifgrq, (caddr_t)ifgp,
> +                    sizeof(struct ifg_req))))
> +                     return (error);
> +             ifgr->ifgr_len += sizeof(ifgrq);
> +             ifgp++;
> +     }
>  
>       return (0);
>  }
> Index: sys/sys/sockio.h
> ===================================================================
> RCS file: /cvs//src/sys/sys/sockio.h,v
> retrieving revision 1.75
> diff -u -p -r1.75 sockio.h
> --- sys/sys/sockio.h  20 Feb 2018 03:43:07 -0000      1.75
> +++ sys/sys/sockio.h  9 May 2018 12:56:46 -0000
> @@ -129,6 +129,7 @@
>  #define      SIOCGIFGMEMB   _IOWR('i', 138, struct ifgroupreq) /* get 
> members */
>  #define      SIOCGIFGATTR   _IOWR('i', 139, struct ifgroupreq) /* get 
> ifgroup attribs */
>  #define      SIOCSIFGATTR   _IOW('i', 140, struct ifgroupreq) /* set ifgroup 
> attribs */
> +#define      SIOCGIFGLIST   _IOWR('i', 141, struct ifgroupreq) /* get 
> ifgroup list */
>  
>  #define      SIOCSIFDESCR     _IOW('i', 128, struct ifreq)   /* set ifnet 
> descr */
>  #define      SIOCGIFDESCR    _IOWR('i', 129, struct ifreq)   /* get ifnet 
> descr */
> Index: usr.sbin/snmpd/mib.c
> ===================================================================
> RCS file: /cvs//src/usr.sbin/snmpd/mib.c,v
> retrieving revision 1.86
> diff -u -p -r1.86 mib.c
> --- usr.sbin/snmpd/mib.c      9 May 2018 13:56:46 -0000       1.86
> +++ usr.sbin/snmpd/mib.c      14 May 2018 15:18:07 -0000
> @@ -1422,6 +1422,7 @@ char    *mib_sensorvalue(struct sensor *);
>  int   mib_carpsysctl(struct oid *, struct ber_oid *, struct ber_element **);
>  int   mib_carpstats(struct oid *, struct ber_oid *, struct ber_element **);
>  int   mib_carpiftable(struct oid *, struct ber_oid *, struct ber_element **);
> +int   mib_carpgrouptable(struct oid *, struct ber_oid *, struct ber_element 
> **);
>  int   mib_carpifnum(struct oid *, struct ber_oid *, struct ber_element **);
>  struct carpif
>       *mib_carpifget(u_int);
> @@ -1637,6 +1638,8 @@ static struct oid openbsd_mib[] = {
>       { MIB(carpIfAdvbase),           OID_TRD, mib_carpiftable },
>       { MIB(carpIfAdvskew),           OID_TRD, mib_carpiftable },
>       { MIB(carpIfState),             OID_TRD, mib_carpiftable },
> +     { MIB(carpGroupName),           OID_TRD, mib_carpgrouptable },
> +     { MIB(carpGroupDemote),         OID_TRD, mib_carpgrouptable },
>       { MIB(memMIBObjects),           OID_MIB },
>       { MIB(memMIBVersion),           OID_RD, mps_getint, NULL, NULL,
>           OIDVER_OPENBSD_MEM },
> @@ -2871,6 +2874,105 @@ mib_carpiftable(struct oid *oid, struct 
>       }
>  
>       free(cif);
> +     return (0);
> +}
> +
> +static struct ifg_req *
> +mib_carpgroupget(u_int idx)
> +{
> +     struct ifgroupreq        ifgr;
> +     struct ifg_req          *ifg = NULL;
> +     u_int                    len;
> +     int                      s = -1;
> +
> +     bzero(&ifgr, sizeof(ifgr));
> +
> +     if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
> +             log_warn("socket");
> +             return (NULL);
> +     }
> +
> +     if (ioctl(s, SIOCGIFGLIST, (caddr_t)&ifgr) == -1) {
> +             log_warn("SIOCGIFGLIST");
> +             goto err;
> +     }
> +     len = ifgr.ifgr_len;
> +
> +     if (len / sizeof(*ifgr.ifgr_groups) <= idx-1)
> +             goto err;
> +
> +     if ((ifgr.ifgr_groups = calloc(1, len)) == NULL) {
> +             log_warn("alloc");
> +             return (NULL);
> +     }
> +     if (ioctl(s, SIOCGIFGLIST, (caddr_t)&ifgr) == -1) {
> +             log_warn("SIOCGIFGLIST");
> +             free(ifgr.ifgr_groups);
> +             goto err;
> +     }
> +     close(s);
> +
> +     if ((ifg = calloc(1, sizeof *ifg)) == NULL) {
> +             log_warn("alloc");
> +             goto err;
> +     }
> +
> +     memcpy(ifg, &ifgr.ifgr_groups[idx-1], sizeof *ifg);
> +     free(ifgr.ifgr_groups);
> +     return ifg;
> + err:
> +     free(ifgr.ifgr_groups);
> +     close(s);
> +     return (NULL);
> +}
> +
> +int
> +mib_carpgrouptable(struct oid *oid, struct ber_oid *o, struct ber_element 
> **elm)
> +{
> +     struct ifgroupreq        ifgr;
> +     struct ifg_req          *ifg;
> +     uint32_t                 idx;
> +     int                      s;
> +
> +     /* Get and verify the current row index */
> +     idx = o->bo_id[OIDIDX_carpGroupIndex];
> +
> +     if ((ifg = mib_carpgroupget(idx)) == NULL)
> +             return (1);
> +
> +     /* Tables need to prepend the OID on their own */
> +     o->bo_id[OIDIDX_carpGroupIndex] = idx;
> +     *elm = ber_add_oid(*elm, o);
> +
> +     switch (o->bo_id[OIDIDX_carpGroupEntry]) {
> +     case 1:
> +             *elm = ber_add_string(*elm, ifg->ifgrq_group);
> +             break;
> +     case 2:
> +             if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
> +                     log_warn("socket");
> +                     free(ifg);
> +                     return (1);
> +             }
> +
> +             bzero(&ifgr, sizeof(ifgr));
> +             strlcpy(ifgr.ifgr_name, ifg->ifgrq_group, 
> sizeof(ifgr.ifgr_name));
> +             if (ioctl(s, SIOCGIFGATTR, (caddr_t)&ifgr) == -1) {
> +                     log_warn("SIOCGIFGATTR");
> +                     close(s);
> +                     free(ifg);
> +                     return (1);
> +             }
> +
> +             close(s);
> +             *elm = ber_add_integer(*elm, ifgr.ifgr_attrib.ifg_carp_demoted);
> +             break;
> +     default:
> +             free(ifg);
> +             return (1);
> +     }
> +
> +     free(ifg);
>       return (0);
>  }
>  
> Index: usr.sbin/snmpd/mib.h
> ===================================================================
> RCS file: /cvs//src/usr.sbin/snmpd/mib.h,v
> retrieving revision 1.38
> diff -u -p -r1.38 mib.h
> --- usr.sbin/snmpd/mib.h      7 Mar 2016 19:33:26 -0000       1.38
> +++ usr.sbin/snmpd/mib.h      14 May 2018 13:30:28 -0000
> @@ -722,6 +722,12 @@
>  #define MIB_carpIp6PktsSent          MIB_carpStats, 13
>  #define MIB_carpNoMemory             MIB_carpStats, 14
>  #define MIB_carpTransitionsToMaster  MIB_carpStats, 15
> +#define MIB_carpGroupTable           MIB_carpMIBObjects, 4
> +#define MIB_carpGroupEntry           MIB_carpGroupTable, 1
> +#define OIDIDX_carpGroupEntry                10
> +#define OIDIDX_carpGroupIndex                11
> +#define MIB_carpGroupName            MIB_carpGroupEntry, 1
> +#define MIB_carpGroupDemote          MIB_carpGroupEntry, 2
>  #define MIB_localSystem                      MIB_openBSD, 23
>  #define MIB_SYSOID_DEFAULT           MIB_openBSD, 23, 1
>  #define MIB_localTest                        MIB_openBSD, 42
> @@ -1272,6 +1278,10 @@
>       { MIBDECL(carpIp6PktsSent) },                   \
>       { MIBDECL(carpNoMemory) },                      \
>       { MIBDECL(carpTransitionsToMaster) },           \
> +     { MIBDECL(carpGroupTable) },                    \
> +     { MIBDECL(carpGroupEntry) },                    \
> +     { MIBDECL(carpGroupName) },                     \
> +     { MIBDECL(carpGroupDemote) },                   \
>       { MIBDECL(localSystem) },                       \
>       { MIBDECL(localTest) },                         \
>                                                       \


Reply via email to