IFA_F_OPTIMISTIC is not supported?

2017-09-08 Thread soohoon . lee
rtm_newaddr masks off OPTIMISTIC.

inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh)
...
/* We ignore other flags so far. */
ifa_flags &= IFA_F_NODAD | IFA_F_HOMEADDRESS | IFA_F_MANAGETEMPADDR |
 IFA_F_NOPREFIXROUTE;

Is there any problem or not allowed?

I need to do something like adding a route for the address after adding the 
address but fails because the address is not useable yet.
I tried NODAD but there's still little delay until IFA_F_TENTATIVE is cleared.
- rtm_newaddr sets IFA_F_TENTATIVE
- set a timer for dad start with delay=0
- some delay
- dad starts but ends immediately because of NODAD flag, and clears 
TENTATIVE.

And it looks like OPTIMISTIC does what I need but kind of disabled like the 
code above.

Thanks,
Soohoon.


[PATCH net v3] usbnet: Stop RX Q on MTU change

2016-06-29 Thread soohoon . lee


When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh()
can fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush
never ends.

Signed-off-by: Soohoon Lee <soohoon@f5.com>
Reviewed-by: Kimball Murray <kmur...@f5.com>

---

 drivers/net/usb/usbnet.c |   10 +++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..6086a01 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -395,8 +395,11 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
dev->hard_mtu = net->mtu + net->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
-   if (dev->rx_urb_size > old_rx_urb_size)
+   if (dev->rx_urb_size > old_rx_urb_size) {
+   usbnet_pause_rx(dev);
usbnet_unlink_rx_urbs(dev);
+   usbnet_resume_rx(dev);
+   }
}
 
/* max qlen depend on hard_mtu and rx_urb_size */
@@ -1508,8 +1511,9 @@ static void usbnet_bh (unsigned long param)
} else if (netif_running (dev->net) &&
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
-  !timer_pending (>delay) &&
-  !test_bit (EVENT_RX_HALT, >flags)) {
+  !timer_pending(>delay) &&
+  !test_bit(EVENT_RX_PAUSED, >flags) &&
+  !test_bit(EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;
 
if (temp < RX_QLEN(dev)) {


[PATCH net v2.3] usbnet: Stop RX Q on MTU change

2016-06-29 Thread soohoon . lee


When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh() can 
fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush never 
ends.

Signed-off-by: Soohoon Lee <soohoon@f5.com>
Reviewed-by: Kimball Murray <kmur...@f5.com>

---
 drivers/net/usb/usbnet.c |6 +-
  1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..ce72dd0 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -395,8 +395,11 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
dev->hard_mtu = net->mtu + net->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
-   if (dev->rx_urb_size > old_rx_urb_size)
+   if (dev->rx_urb_size > old_rx_urb_size) {
+   usbnet_pause_rx(dev);
usbnet_unlink_rx_urbs(dev);
+   usbnet_resume_rx(dev);
+   }
}
 
/* max qlen depend on hard_mtu and rx_urb_size */
@@ -1509,6 +1512,7 @@ static void usbnet_bh (unsigned long param)
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
   !timer_pending (>delay) &&
+  !test_bit (EVENT_RX_PAUSED, >flags) &&
   !test_bit (EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;
 


[PATCH usbnet v2.1] mtu change needs to stop RX

2016-06-23 Thread Soohoon Lee

When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh() can 
fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush never 
ends.

Signed-off-by: Soohoon Lee <soohoon@f5.com>
Reviewed-by: Kimball Murray <kmur...@f5.com>

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..ce72dd0 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -395,8 +395,11 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
dev->hard_mtu = net->mtu + net->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
-   if (dev->rx_urb_size > old_rx_urb_size)
+   if (dev->rx_urb_size > old_rx_urb_size) {
+   usbnet_pause_rx(dev);
usbnet_unlink_rx_urbs(dev);
+   usbnet_resume_rx(dev);
+   }
}

/* max qlen depend on hard_mtu and rx_urb_size */
@@ -1509,6 +1512,7 @@ static void usbnet_bh (unsigned long param)
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
   !timer_pending (>delay) &&
+  !test_bit (EVENT_RX_PAUSED, >flags) &&
   !test_bit (EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;



[PATCH usbnet v2] mtu change needs to stop RX

2016-06-23 Thread Soohoon Lee

When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh() can 
fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush never 
ends.

Reviewed-by: kmur...@f5.com

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..ce72dd0 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -395,8 +395,11 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
dev->hard_mtu = net->mtu + net->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
-   if (dev->rx_urb_size > old_rx_urb_size)
+   if (dev->rx_urb_size > old_rx_urb_size) {
+   usbnet_pause_rx(dev);
usbnet_unlink_rx_urbs(dev);
+   usbnet_resume_rx(dev);
+   }
}
 
/* max qlen depend on hard_mtu and rx_urb_size */
@@ -1509,6 +1512,7 @@ static void usbnet_bh (unsigned long param)
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
   !timer_pending (>delay) &&
+  !test_bit (EVENT_RX_PAUSED, >flags) &&
   !test_bit (EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;



[ PATCH] usbnet.c mtu change needs to stop RX

2016-06-23 Thread Soohoon Lee

When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh() can 
fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush never 
ends.


diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..e03e3e6 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -708,6 +708,7 @@ static int unlink_urbs (struct usbnet *dev, struct 
sk_buff_head *q)
int count = 0;
 
spin_lock_irqsave (>lock, flags);
+   usbnet_pause_rx(dev);
while (!skb_queue_empty(q)) {
struct skb_data *entry;
struct urb  *urb;
@@ -742,6 +743,7 @@ found:
usb_put_urb(urb);
spin_lock_irqsave(>lock, flags);
}
+   usbnet_resume_rx(dev);
spin_unlock_irqrestore (>lock, flags);
return count;
 }
@@ -1509,6 +1511,7 @@ static void usbnet_bh (unsigned long param)
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
   !timer_pending (>delay) &&
+  !test_bit (EVENT_RX_PAUSED, >flags) &&
   !test_bit (EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;