Author: kib
Date: Tue Sep 24 06:37:01 2019
New Revision: 352650
URL: https://svnweb.freebsd.org/changeset/base/352650

Log:
  MFC r352459:
  ifconfig: add report of the string from SIOCGIFDOWNREASON.
  
  Sponsored by: Mellanox Technologies

Modified:
  stable/11/sbin/ifconfig/ifmedia.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/ifconfig/ifmedia.c
==============================================================================
--- stable/11/sbin/ifconfig/ifmedia.c   Tue Sep 24 06:36:25 2019        
(r352649)
+++ stable/11/sbin/ifconfig/ifmedia.c   Tue Sep 24 06:37:01 2019        
(r352650)
@@ -78,6 +78,7 @@
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -108,18 +109,20 @@ static void
 media_status(int s)
 {
        struct ifmediareq ifmr;
+       struct ifdownreason ifdr;
        int *media_list, i;
-       int xmedia = 1;
+       bool no_carrier, xmedia;
 
        (void) memset(&ifmr, 0, sizeof(ifmr));
        (void) strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+       xmedia = true;
 
        /*
         * Check if interface supports extended media types.
         */
        if (ioctl(s, SIOCGIFXMEDIA, (caddr_t)&ifmr) < 0)
-               xmedia = 0;
-       if (xmedia == 0 && ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
+               xmedia = false;
+       if (!xmedia && ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
                /*
                 * Interface doesn't support SIOC{G,S}IFMEDIA.
                 */
@@ -156,6 +159,7 @@ media_status(int s)
        putchar('\n');
 
        if (ifmr.ifm_status & IFM_AVALID) {
+               no_carrier = false;
                printf("\tstatus: ");
                switch (IFM_TYPE(ifmr.ifm_active)) {
                case IFM_ETHER:
@@ -163,7 +167,7 @@ media_status(int s)
                        if (ifmr.ifm_status & IFM_ACTIVE)
                                printf("active");
                        else
-                               printf("no carrier");
+                               no_carrier = true;
                        break;
 
                case IFM_FDDI:
@@ -182,8 +186,26 @@ media_status(int s)
                                else
                                        printf("running");
                        } else
-                               printf("no carrier");
+                               no_carrier = true;
                        break;
+               }
+               if (no_carrier) {
+                       printf("no carrier");
+                       memset(&ifdr, 0, sizeof(ifdr));
+                       strlcpy(ifdr.ifdr_name, name, sizeof(ifdr.ifdr_name));
+                       if (ioctl(s, SIOCGIFDOWNREASON, (caddr_t)&ifdr) == 0) {
+                               switch (ifdr.ifdr_reason) {
+                               case IFDR_REASON_MSG:
+                                       printf(" (%s)", ifdr.ifdr_msg);
+                                       break;
+                               case IFDR_REASON_VENDOR:
+                                       printf(" (vendor code %d)",
+                                           ifdr.ifdr_vendor);
+                                       break;
+                               default:
+                                       break;
+                               }
+                       }
                }
                putchar('\n');
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to