I do agree with you.
I based my patch on the code on the ifHighSpeed case block at line 1291 in the 
same file.
You might want to make it more explicit too.

-----Message d'origine-----
De : Stuart Henderson <s...@spacehopper.org> 
Envoyé : mercredi 9 mai 2018 15:41
À : BRAND Arnaud <arnaud.br...@md6.fr>
Cc : bugs@openbsd.org
Objet : Re: snmpd ifSpeed reporting seems wrong for speeds over 4G (ex: 10G)

On 2018/05/09 12:48, BRAND Arnaud wrote:
> Hi,
> 
> I would like to report was looks like a bug in snmpd.
> 
> When walking on the ifTable my client crashes when walking over 10G 
> interfaces.
> Tcpdump shows that ifSpeed (1.3.6.1.2.1.2.2.1.5) is sending the value 
> 10000000000 (10Gbps).
> But ifSpeed is of type GAUGE and maxes out at 2^32-1 (4Gbps-1).
> 
> My MIB browser  states :
> "An estimate of the interface's current bandwidth in bits per second.  
> For interfaces which do not vary in bandwidth or for those where no 
> accurate estimation can be made, this object should contain the 
> nominal bandwidth.  If the bandwidth of the interface is greater than 
> the maximum value reportable by this object then this object should 
> report its maximum value (4,294,967,295) and ifHighSpeed must be used 
> to report the interace's speed.  For a sub-layer which has no concept 
> of bandwidth, this object should be zero."
> 
> So I guess the case block at line 1111 in /usr.sbin/snmpd/mib.c should read :
>                 case 5:
>                                i = kif->if_baudrate >= 4294967295 ?
>                                                4294967295 : kif->if_baudrate ;
>                                ber = ber_add_integer(ber, i);
>                                ber_set_header(ber, BER_CLASS_APPLICATION, 
> SNMP_T_GAUGE32);
>                 break;
> instead of
>                 case 5:
>                                ber = ber_add_integer(ber, kif->if_baudrate);
>                                ber_set_header(ber, BER_CLASS_APPLICATION, 
> SNMP_T_GAUGE32);
>                 break;
> 
> Is my assumption correct or have I missed something ?
> 
> I'm gonna give it a try while a fix perhaps makes its way in the next release 
> or patches.
> 
> Have a nice day and thanks for your nice work in OpenBSD !
> 
> Best regards
> Arnaud

I think that's the right thing to do, but an if() and using a macro instead of 
writing 4294967295 out in full is easier on the eye.
Any OKs for this?


Index: mib.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/mib.c,v retrieving revision 1.85 diff -u -p 
-r1.85 mib.c
--- mib.c       18 Dec 2017 05:51:53 -0000      1.85
+++ mib.c       9 May 2018 13:38:50 -0000
@@ -1109,7 +1109,11 @@ mib_iftable(struct oid *oid, struct ber_
                ber = ber_add_integer(ber, kif->if_mtu);
                break;
        case 5:
-               ber = ber_add_integer(ber, kif->if_baudrate);
+               if (kif->if_baudrate > UINT32_MAX) {
+                       /* speed should be obtained from ifHighSpeed instead */
+                       ber = ber_add_integer(ber, UINT32_MAX);
+               } else
+                       ber = ber_add_integer(ber, kif->if_baudrate);
                ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_GAUGE32);
                break;
        case 6:


Reply via email to