Module: xenomai-3 Branch: next Commit: a73161a18c90440b6ee4125e09526616dcff506a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a73161a18c90440b6ee4125e09526616dcff506a
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