On Wed, Aug 31, 2016 at 05:04:38PM +0200, Stefan Sperling wrote:
> This makes ifconfig display baudrates defined in ifmedia.h tables.
> 
> Before (prints media subtype):
> 
> $ ifconfig iwn0 | grep media:
>         media: IEEE802.11 autoselect (OFDM6 mode 11a)
> $ ifconfig em0 | grep media: 
>         media: Ethernet autoselect (100baseTX full-duplex,rxpause,txpause)
> 
> After (prints corresponding baudrate):
> 
> $ ifconfig iwn0 | grep media:
>         media: IEEE802.11 autoselect (6Mbps mode 11a)
> $ ifconfig em0 | grep media: 
>         media: Ethernet autoselect (100Mbps full-duplex,rxpause,txpause)
> 
> The output of 'ifconfig media' (which prints command syntax) is unchanged
> and we fall back to printing the media subtype if no baudrate is found.
> 
> I've kept this disabled in the ramdisk for now.
> The baudrate table will grow when more 11n features are implemented.
> 

I find it much more useful to have the actual speed ("baudrate")
displayed instead of the mode or rate name - especially with these
non-obvious MCS rates from 11n.

OK reyk@

> Index: ifconfig.c
> ===================================================================
> RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
> retrieving revision 1.328
> diff -u -p -r1.328 ifconfig.c
> --- ifconfig.c        31 Aug 2016 13:32:27 -0000      1.328
> +++ ifconfig.c        31 Aug 2016 14:51:36 -0000
> @@ -2715,6 +2715,11 @@ const struct ifmedia_description ifm_typ
>  const struct ifmedia_description ifm_subtype_descriptions[] =
>      IFM_SUBTYPE_DESCRIPTIONS;
>  
> +#ifndef SMALL
> +const struct ifmedia_baudrate ifm_baudrate_descriptions[] =
> +    IFM_BAUDRATE_DESCRIPTIONS;
> +#endif
> +
>  struct ifmedia_description ifm_mode_descriptions[] =
>      IFM_MODE_DESCRIPTIONS;
>  
> @@ -2748,6 +2753,39 @@ get_media_subtype_string(uint64_t mword)
>       return ("<unknown subtype>");
>  }
>  
> +#ifndef SMALL
> +char *
> +get_media_baudrate_string(uint64_t mword)
> +{
> +     const struct ifmedia_baudrate *ifmb;
> +     char *str;
> +     int ret = -1;
> +
> +     for (ifmb = ifm_baudrate_descriptions; ifmb->ifmb_word != 0; ifmb++) {
> +             if (!IFM_TYPE_MATCH(ifmb->ifmb_word, mword) ||
> +                 IFM_SUBTYPE(ifmb->ifmb_word) != IFM_SUBTYPE(mword))
> +                     continue;
> +
> +             if (ifmb->ifmb_baudrate >= IF_Gbps(1))
> +                     ret = asprintf(&str,
> +                         "%lluGbps", ifmb->ifmb_baudrate / IF_Gbps(1));
> +             else if (ifmb->ifmb_baudrate >= IF_Mbps(1))
> +                     ret = asprintf(&str,
> +                         "%lluMbps", ifmb->ifmb_baudrate / IF_Mbps(1));
> +             else if (ifmb->ifmb_baudrate >= IF_Kbps(1))
> +                     ret = asprintf(&str,
> +                         "%lluKbps", ifmb->ifmb_baudrate / IF_Kbps(1));
> +             else
> +                     ret = asprintf(&str, "%llubps", ifmb->ifmb_baudrate);
> +
> +             break;
> +     }
> +     if (ret == -1)
> +             str = NULL;
> +     return str;
> +}
> +#endif
> +
>  uint64_t
>  get_media_subtype(uint64_t type, const char *val)
>  {
> @@ -2818,11 +2856,18 @@ print_media_word(uint64_t ifmw, int prin
>  {
>       const struct ifmedia_description *desc;
>       uint64_t seen_option = 0;
> +     char *baudrate = NULL;
> +
> +#ifndef SMALL
> +     baudrate = as_syntax ? NULL : get_media_baudrate_string(ifmw);
> +#endif
>  
>       if (print_type)
>               printf("%s ", get_media_type_string(ifmw));
>       printf("%s%s", as_syntax ? "media " : "",
> -         get_media_subtype_string(ifmw));
> +         baudrate ? baudrate : get_media_subtype_string(ifmw));
> +
> +     free(baudrate);
>  
>       /* Find mode. */
>       if (IFM_MODE(ifmw) != 0) {
> 

-- 

Reply via email to