Module: xenomai-gch
Branch: for-3.0.x
Commit: ba315472fef528ce82cf2bfe852c99092f0046c7
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=ba315472fef528ce82cf2bfe852c99092f0046c7

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Sat Oct 10 19:37:50 2015 +0200

rtnet/ioctl: allow checking link state

Use the IFF_RUNNING bit in the flags returned by the SIOCGIFFLAGS ioctl,
like Linux SIOCGIFFLAGS ioctl.

---

 kernel/drivers/net/stack/include/rtdev.h |    4 ++++
 kernel/drivers/net/stack/rtdev.c         |    2 +-
 kernel/drivers/net/stack/rtnet_chrdev.c  |    7 +++++++
 kernel/drivers/net/stack/socket.c        |    8 +++++++-
 utils/net/rtifconfig.c                   |    2 +-
 5 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/kernel/drivers/net/stack/include/rtdev.h 
b/kernel/drivers/net/stack/include/rtdev.h
index 67a8ffd..c1c0b4e 100644
--- a/kernel/drivers/net/stack/include/rtdev.h
+++ b/kernel/drivers/net/stack/include/rtdev.h
@@ -55,6 +55,10 @@ enum rtnet_link_state {
        __RTNET_LINK_STATE_PRESENT,
        __RTNET_LINK_STATE_NOCARRIER,
 };
+#define RTNET_LINK_STATE_XOFF (1 << __RTNET_LINK_STATE_XOFF)
+#define RTNET_LINK_STATE_START (1 << __RTNET_LINK_STATE_START)
+#define RTNET_LINK_STATE_PRESENT (1 << __RTNET_LINK_STATE_PRESENT)
+#define RTNET_LINK_STATE_NOCARRIER (1 << __RTNET_LINK_STATE_NOCARRIER)
 
 /***
  *  rtnet_device
diff --git a/kernel/drivers/net/stack/rtdev.c b/kernel/drivers/net/stack/rtdev.c
index f7e1f41..5eb73ce 100644
--- a/kernel/drivers/net/stack/rtdev.c
+++ b/kernel/drivers/net/stack/rtdev.c
@@ -644,7 +644,7 @@ int rtdev_open(struct rtnet_device *rtdev)
        ret = rtdev->open(rtdev);
 
     if ( !ret )  {
-       rtdev->flags |= (IFF_UP | IFF_RUNNING);
+       rtdev->flags |= IFF_UP;
        set_bit(__RTNET_LINK_STATE_START, &rtdev->link_state);
     } else
        rtdev_dereference(rtdev);
diff --git a/kernel/drivers/net/stack/rtnet_chrdev.c 
b/kernel/drivers/net/stack/rtnet_chrdev.c
index d3f617c..f06ff2a 100644
--- a/kernel/drivers/net/stack/rtnet_chrdev.c
+++ b/kernel/drivers/net/stack/rtnet_chrdev.c
@@ -210,6 +210,13 @@ static int rtnet_core_ioctl(struct rtnet_device *rtdev, 
unsigned int request,
            cmd.args.info.broadcast_ip = rtdev->broadcast_ip;
            cmd.args.info.mtu          = rtdev->mtu;
            cmd.args.info.flags        = rtdev->flags;
+            if ((cmd.args.info.flags & IFF_UP)
+                   && (rtdev->link_state
+                           & (RTNET_LINK_STATE_PRESENT
+                                   | RTNET_LINK_STATE_NOCARRIER))
+                    == RTNET_LINK_STATE_PRESENT)
+                    cmd.args.info.flags |= IFF_RUNNING;
+
            memcpy(cmd.args.info.dev_addr, rtdev->dev_addr, MAX_ADDR_LEN);
 
            mutex_unlock(&rtdev->nrt_lock);
diff --git a/kernel/drivers/net/stack/socket.c 
b/kernel/drivers/net/stack/socket.c
index 64a2a2e..7dacb25 100644
--- a/kernel/drivers/net/stack/socket.c
+++ b/kernel/drivers/net/stack/socket.c
@@ -242,7 +242,7 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void *arg)
        for (i = 1; i <= MAX_RT_DEVICES; i++) {
            rtdev = rtdev_get_by_index(i);
            if (rtdev != NULL) {
-               if ((rtdev->flags & IFF_RUNNING) == 0) {
+               if ((rtdev->flags & IFF_UP) == 0) {
                    rtdev_dereference(rtdev);
                    continue;
                }
@@ -288,6 +288,12 @@ int rt_socket_if_ioctl(struct rtdm_fd *fd, int request, 
void *arg)
 
        case SIOCGIFFLAGS:
            ifr->ifr_flags = rtdev->flags;
+            if ((ifr->ifr_flags & IFF_UP)
+                   && (rtdev->link_state
+                           & (RTNET_LINK_STATE_PRESENT
+                                   | RTNET_LINK_STATE_NOCARRIER))
+                    == RTNET_LINK_STATE_PRESENT)
+                    ifr->ifr_flags |= IFF_RUNNING;
            break;
 
        case SIOCGIFHWADDR:
diff --git a/utils/net/rtifconfig.c b/utils/net/rtifconfig.c
index 2024afe..8117e12 100644
--- a/utils/net/rtifconfig.c
+++ b/utils/net/rtifconfig.c
@@ -290,7 +290,7 @@ void do_display(int print_flags)
             ret = ioctl(f, IOC_RT_IFINFO, &cmd);
             if (ret == 0) {
                 if (((print_flags & PRINT_FLAG_INACTIVE) != 0) ||
-                    ((cmd.args.info.flags & IFF_RUNNING) != 0))
+                    ((cmd.args.info.flags & IFF_UP) != 0))
                     print_dev();
             } else if (errno != ENODEV) {
                 perror("ioctl");


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to