Commit f75b6f30 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller:

 1) Clear up some recent tipc regressions because of registration
    ordering. Fix from Junwei Hu.

 2) tipc's TLV_SET() can read past the end of the supplied buffer during
    the copy. From Chris Packham.

 3) ptp example program doesn't match the kernel, from Richard Cochran.

 4) Outgoing message type fix in qrtr, from Bjorn Andersson.

 5) Flow control regression in stmmac, from Tan Tee Min.

 6) Fix inband autonegotiation in phylink, from Russell King.

 7) Fix sk_bound_dev_if handling in rawv6_bind(), from Mike Manning.

 8) Fix usbnet crash after disconnect, from Kloetzke Jan.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (21 commits)
  usbnet: fix kernel crash after disconnect
  selftests: fib_rule_tests: use pre-defined DEV_ADDR
  net-next: net: Fix typos in ip-sysctl.txt
  ipv6: Consider sk_bound_dev_if when binding a raw socket to an address
  net: phylink: ensure inband AN works correctly
  usbnet: ipheth: fix racing condition
  net: stmmac: dma channel control register need to be init first
  net: stmmac: fix ethtool flow control not able to get/set
  net: qrtr: Fix message type of outgoing packets
  networking: : fix typos in code comments
  ptp: Fix example program to match kernel.
  fddi: fix typos in code comments
  selftests: fib_rule_tests: enable forwarding before ipv4 from/iif test
  selftests: fib_rule_tests: fix local IPv4 address typo
  tipc: Avoid copying bytes beyond the supplied data
  2/2] net: xilinx_emaclite: use readx_poll_timeout() in mdio wait function
  1/2] net: axienet: use readx_poll_timeout() in mdio wait function
  vlan: Mark expected switch fall-through
  macvlan: Mark expected switch fall-through
  net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query
  ...
parents 86f9e56d ad70411a
...@@ -560,10 +560,10 @@ tcp_comp_sack_delay_ns - LONG INTEGER ...@@ -560,10 +560,10 @@ tcp_comp_sack_delay_ns - LONG INTEGER
Default : 1,000,000 ns (1 ms) Default : 1,000,000 ns (1 ms)
tcp_comp_sack_nr - INTEGER tcp_comp_sack_nr - INTEGER
Max numer of SACK that can be compressed. Max number of SACK that can be compressed.
Using 0 disables SACK compression. Using 0 disables SACK compression.
Detault : 44 Default : 44
tcp_slow_start_after_idle - BOOLEAN tcp_slow_start_after_idle - BOOLEAN
If set, provide RFC2861 behavior and time out the congestion If set, provide RFC2861 behavior and time out the congestion
......
...@@ -18,7 +18,7 @@ The following technologies are described: ...@@ -18,7 +18,7 @@ The following technologies are described:
* Generic Segmentation Offload - GSO * Generic Segmentation Offload - GSO
* Generic Receive Offload - GRO * Generic Receive Offload - GRO
* Partial Generic Segmentation Offload - GSO_PARTIAL * Partial Generic Segmentation Offload - GSO_PARTIAL
* SCTP accelleration with GSO - GSO_BY_FRAGS * SCTP acceleration with GSO - GSO_BY_FRAGS
TCP Segmentation Offload TCP Segmentation Offload
...@@ -148,7 +148,7 @@ that the IPv4 ID field is incremented in the case that a given header does ...@@ -148,7 +148,7 @@ that the IPv4 ID field is incremented in the case that a given header does
not have the DF bit set. not have the DF bit set.
SCTP accelleration with GSO SCTP acceleration with GSO
=========================== ===========================
SCTP - despite the lack of hardware support - can still take advantage of SCTP - despite the lack of hardware support - can still take advantage of
......
...@@ -2010,6 +2010,8 @@ static int mlx4_en_set_tunable(struct net_device *dev, ...@@ -2010,6 +2010,8 @@ static int mlx4_en_set_tunable(struct net_device *dev,
return ret; return ret;
} }
#define MLX4_EEPROM_PAGE_LEN 256
static int mlx4_en_get_module_info(struct net_device *dev, static int mlx4_en_get_module_info(struct net_device *dev,
struct ethtool_modinfo *modinfo) struct ethtool_modinfo *modinfo)
{ {
...@@ -2044,7 +2046,7 @@ static int mlx4_en_get_module_info(struct net_device *dev, ...@@ -2044,7 +2046,7 @@ static int mlx4_en_get_module_info(struct net_device *dev,
break; break;
case MLX4_MODULE_ID_SFP: case MLX4_MODULE_ID_SFP:
modinfo->type = ETH_MODULE_SFF_8472; modinfo->type = ETH_MODULE_SFF_8472;
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; modinfo->eeprom_len = MLX4_EEPROM_PAGE_LEN;
break; break;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -2077,11 +2077,6 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port, ...@@ -2077,11 +2077,6 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port,
size -= offset + size - I2C_PAGE_SIZE; size -= offset + size - I2C_PAGE_SIZE;
i2c_addr = I2C_ADDR_LOW; i2c_addr = I2C_ADDR_LOW;
if (offset >= I2C_PAGE_SIZE) {
/* Reset offset to high page */
i2c_addr = I2C_ADDR_HIGH;
offset -= I2C_PAGE_SIZE;
}
cable_info = (struct mlx4_cable_info *)inmad->data; cable_info = (struct mlx4_cable_info *)inmad->data;
cable_info->dev_mem_address = cpu_to_be16(offset); cable_info->dev_mem_address = cpu_to_be16(offset);
......
...@@ -460,7 +460,7 @@ stmmac_get_pauseparam(struct net_device *netdev, ...@@ -460,7 +460,7 @@ stmmac_get_pauseparam(struct net_device *netdev,
} else { } else {
if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
netdev->phydev->supported) || netdev->phydev->supported) ||
linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, !linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
netdev->phydev->supported)) netdev->phydev->supported))
return; return;
} }
...@@ -491,7 +491,7 @@ stmmac_set_pauseparam(struct net_device *netdev, ...@@ -491,7 +491,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
} else { } else {
if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
phy->supported) || phy->supported) ||
linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, !linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
phy->supported)) phy->supported))
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -2208,6 +2208,10 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) ...@@ -2208,6 +2208,10 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
if (priv->plat->axi) if (priv->plat->axi)
stmmac_axi(priv, priv->ioaddr, priv->plat->axi); stmmac_axi(priv, priv->ioaddr, priv->plat->axi);
/* DMA CSR Channel configuration */
for (chan = 0; chan < dma_csr_ch; chan++)
stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
/* DMA RX Channel Configuration */ /* DMA RX Channel Configuration */
for (chan = 0; chan < rx_channels_count; chan++) { for (chan = 0; chan < rx_channels_count; chan++) {
rx_q = &priv->rx_queue[chan]; rx_q = &priv->rx_queue[chan];
...@@ -2233,10 +2237,6 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) ...@@ -2233,10 +2237,6 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
tx_q->tx_tail_addr, chan); tx_q->tx_tail_addr, chan);
} }
/* DMA CSR Channel configuration */
for (chan = 0; chan < dma_csr_ch; chan++)
stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
return ret; return ret;
} }
......
...@@ -484,6 +484,11 @@ static inline u32 axienet_ior(struct axienet_local *lp, off_t offset) ...@@ -484,6 +484,11 @@ static inline u32 axienet_ior(struct axienet_local *lp, off_t offset)
return in_be32(lp->regs + offset); return in_be32(lp->regs + offset);
} }
static inline u32 axinet_ior_read_mcr(struct axienet_local *lp)
{
return axienet_ior(lp, XAE_MDIO_MCR_OFFSET);
}
/** /**
* axienet_iow - Memory mapped Axi Ethernet register write * axienet_iow - Memory mapped Axi Ethernet register write
* @lp: Pointer to axienet local structure * @lp: Pointer to axienet local structure
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_mdio.h> #include <linux/of_mdio.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/iopoll.h>
#include "xilinx_axienet.h" #include "xilinx_axienet.h"
...@@ -20,16 +21,11 @@ ...@@ -20,16 +21,11 @@
/* Wait till MDIO interface is ready to accept a new transaction.*/ /* Wait till MDIO interface is ready to accept a new transaction.*/
int axienet_mdio_wait_until_ready(struct axienet_local *lp) int axienet_mdio_wait_until_ready(struct axienet_local *lp)
{ {
unsigned long end = jiffies + 2; u32 val;
while (!(axienet_ior(lp, XAE_MDIO_MCR_OFFSET) &
XAE_MDIO_MCR_READY_MASK)) { return readx_poll_timeout(axinet_ior_read_mcr, lp,
if (time_before_eq(end, jiffies)) { val, val & XAE_MDIO_MCR_READY_MASK,
WARN_ON(1); 1, 20000);
return -ETIMEDOUT;
}
udelay(1);
}
return 0;
} }
/** /**
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/iopoll.h>
#define DRIVER_NAME "xilinx_emaclite" #define DRIVER_NAME "xilinx_emaclite"
...@@ -714,20 +715,15 @@ static irqreturn_t xemaclite_interrupt(int irq, void *dev_id) ...@@ -714,20 +715,15 @@ static irqreturn_t xemaclite_interrupt(int irq, void *dev_id)
static int xemaclite_mdio_wait(struct net_local *lp) static int xemaclite_mdio_wait(struct net_local *lp)
{ {
unsigned long end = jiffies + 2; u32 val;
/* wait for the MDIO interface to not be busy or timeout /* wait for the MDIO interface to not be busy or timeout
* after some time. * after some time.
*/ */
while (xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET) & return readx_poll_timeout(xemaclite_readl,
XEL_MDIOCTRL_MDIOSTS_MASK) { lp->base_addr + XEL_MDIOCTRL_OFFSET,
if (time_before_eq(end, jiffies)) { val, !(val & XEL_MDIOCTRL_MDIOSTS_MASK),
WARN_ON(1); 1000, 20000);
return -ETIMEDOUT;
}
msleep(1);
}
return 0;
} }
/** /**
......
...@@ -1206,7 +1206,7 @@ void process_receive(struct s_smc *smc) ...@@ -1206,7 +1206,7 @@ void process_receive(struct s_smc *smc)
} }
/* /*
* SUPERNET 3 Bug: FORMAC delivers status words * SUPERNET 3 Bug: FORMAC delivers status words
* of aborded frames to the BMU * of aborted frames to the BMU
*/ */
if (len <= 4) { if (len <= 4) {
DB_RX(2, "Frame length = 0"); DB_RX(2, "Frame length = 0");
...@@ -1343,7 +1343,7 @@ void process_receive(struct s_smc *smc) ...@@ -1343,7 +1343,7 @@ void process_receive(struct s_smc *smc)
break ; break ;
default : default :
/* /*
* unknown FC abord the frame * unknown FC abort the frame
*/ */
DB_RX(2, "unknown FC error"); DB_RX(2, "unknown FC error");
smt_free_mbuf(smc,mb) ; smt_free_mbuf(smc,mb) ;
......
...@@ -838,6 +838,7 @@ static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -838,6 +838,7 @@ static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case SIOCSHWTSTAMP: case SIOCSHWTSTAMP:
if (!net_eq(dev_net(dev), &init_net)) if (!net_eq(dev_net(dev), &init_net))
break; break;
/* fall through */
case SIOCGHWTSTAMP: case SIOCGHWTSTAMP:
if (netif_device_present(real_dev) && ops->ndo_do_ioctl) if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd); err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
......
...@@ -422,28 +422,21 @@ static void phylink_resolve(struct work_struct *w) ...@@ -422,28 +422,21 @@ static void phylink_resolve(struct work_struct *w)
case MLO_AN_INBAND: case MLO_AN_INBAND:
phylink_get_mac_state(pl, &link_state); phylink_get_mac_state(pl, &link_state);
if (pl->phydev) {
bool changed = false; /* If we have a phy, the "up" state is the union of
* both the PHY and the MAC */
link_state.link = link_state.link && if (pl->phydev)
pl->phy_state.link; link_state.link &= pl->phy_state.link;
if (pl->phy_state.interface != /* Only update if the PHY link is up */
link_state.interface) { if (pl->phydev && pl->phy_state.link) {
link_state.interface = pl->phy_state.interface; link_state.interface = pl->phy_state.interface;
changed = true;
} /* If we have a PHY, we need to update with
* the pause mode bits. */
/* Propagate the flow control from the PHY link_state.pause |= pl->phy_state.pause;
* to the MAC. Also propagate the interface phylink_resolve_flow(pl, &link_state);
* if changed. phylink_mac_config(pl, &link_state);
*/
if (pl->phy_state.link || changed) {
link_state.pause |= pl->phy_state.pause;
phylink_resolve_flow(pl, &link_state);
phylink_mac_config(pl, &link_state);
}
} }
break; break;
} }
......
...@@ -383,17 +383,18 @@ static int ipheth_tx(struct sk_buff *skb, struct net_device *net) ...@@ -383,17 +383,18 @@ static int ipheth_tx(struct sk_buff *skb, struct net_device *net)
dev); dev);
dev->tx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; dev->tx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
netif_stop_queue(net);
retval = usb_submit_urb(dev->tx_urb, GFP_ATOMIC); retval = usb_submit_urb(dev->tx_urb, GFP_ATOMIC);
if (retval) { if (retval) {
dev_err(&dev->intf->dev, "%s: usb_submit_urb: %d\n", dev_err(&dev->intf->dev, "%s: usb_submit_urb: %d\n",
__func__, retval); __func__, retval);
dev->net->stats.tx_errors++; dev->net->stats.tx_errors++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
netif_wake_queue(net);
} else { } else {
dev->net->stats.tx_packets++; dev->net->stats.tx_packets++;
dev->net->stats.tx_bytes += skb->len; dev->net->stats.tx_bytes += skb->len;
dev_consume_skb_any(skb); dev_consume_skb_any(skb);
netif_stop_queue(net);
} }
return NETDEV_TX_OK; return NETDEV_TX_OK;
......
...@@ -494,6 +494,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) ...@@ -494,6 +494,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
if (netif_running (dev->net) && if (netif_running (dev->net) &&
netif_device_present (dev->net) && netif_device_present (dev->net) &&
test_bit(EVENT_DEV_OPEN, &dev->flags) &&
!test_bit (EVENT_RX_HALT, &dev->flags) && !test_bit (EVENT_RX_HALT, &dev->flags) &&
!test_bit (EVENT_DEV_ASLEEP, &dev->flags)) { !test_bit (EVENT_DEV_ASLEEP, &dev->flags)) {
switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) { switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {
...@@ -1419,6 +1420,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, ...@@ -1419,6 +1420,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
spin_unlock_irqrestore(&dev->txq.lock, flags); spin_unlock_irqrestore(&dev->txq.lock, flags);
goto drop; goto drop;
} }
if (netif_queue_stopped(net)) {
usb_autopm_put_interface_async(dev->intf);
spin_unlock_irqrestore(&dev->txq.lock, flags);
goto drop;
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
/* if this triggers the device is still a sleep */ /* if this triggers the device is still a sleep */
......
...@@ -307,8 +307,10 @@ static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len) ...@@ -307,8 +307,10 @@ static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len)
tlv_ptr = (struct tlv_desc *)tlv; tlv_ptr = (struct tlv_desc *)tlv;
tlv_ptr->tlv_type = htons(type); tlv_ptr->tlv_type = htons(type);
tlv_ptr->tlv_len = htons(tlv_len); tlv_ptr->tlv_len = htons(tlv_len);
if (len && data) if (len && data) {
memcpy(TLV_DATA(tlv_ptr), data, tlv_len); memcpy(TLV_DATA(tlv_ptr), data, len);
memset(TLV_DATA(tlv_ptr) + len, 0, TLV_SPACE(len) - tlv_len);
}
return TLV_SPACE(len); return TLV_SPACE(len);
} }
...@@ -405,8 +407,10 @@ static inline int TCM_SET(void *msg, __u16 cmd, __u16 flags, ...@@ -405,8 +407,10 @@ static inline int TCM_SET(void *msg, __u16 cmd, __u16 flags,
tcm_hdr->tcm_len = htonl(msg_len); tcm_hdr->tcm_len = htonl(msg_len);
tcm_hdr->tcm_type = htons(cmd); tcm_hdr->tcm_type = htons(cmd);
tcm_hdr->tcm_flags = htons(flags); tcm_hdr->tcm_flags = htons(flags);
if (data_len && data) if (data_len && data) {
memcpy(TCM_DATA(msg), data, data_len); memcpy(TCM_DATA(msg), data, data_len);
memset(TCM_DATA(msg) + data_len, 0, TCM_SPACE(data_len) - msg_len);
}
return TCM_SPACE(data_len); return TCM_SPACE(data_len);
} }
......
...@@ -373,6 +373,7 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -373,6 +373,7 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case SIOCSHWTSTAMP: case SIOCSHWTSTAMP:
if (!net_eq(dev_net(dev), &init_net)) if (!net_eq(dev_net(dev), &init_net))
break; break;
/* fall through */
case SIOCGMIIPHY: case SIOCGMIIPHY:
case SIOCGMIIREG: case SIOCGMIIREG:
case SIOCSMIIREG: case SIOCSMIIREG:
......
...@@ -287,7 +287,9 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) ...@@ -287,7 +287,9 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
/* Binding to link-local address requires an interface */ /* Binding to link-local address requires an interface */
if (!sk->sk_bound_dev_if) if (!sk->sk_bound_dev_if)
goto out_unlock; goto out_unlock;
}
if (sk->sk_bound_dev_if) {
err = -ENODEV; err = -ENODEV;
dev = dev_get_by_index_rcu(sock_net(sk), dev = dev_get_by_index_rcu(sock_net(sk),
sk->sk_bound_dev_if); sk->sk_bound_dev_if);
......
...@@ -733,8 +733,8 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) ...@@ -733,8 +733,8 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct qrtr_node *node; struct qrtr_node *node;
struct sk_buff *skb; struct sk_buff *skb;
u32 type = 0;
size_t plen; size_t plen;
u32 type;
int rc; int rc;
if (msg->msg_flags & ~(MSG_DONTWAIT)) if (msg->msg_flags & ~(MSG_DONTWAIT))
...@@ -809,9 +809,9 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) ...@@ -809,9 +809,9 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
/* control messages already require the type as 'command' */ /* control messages already require the type as 'command' */
skb_copy_bits(skb, 0, &qrtr_type, 4); skb_copy_bits(skb, 0, &qrtr_type, 4);
type = le32_to_cpu(qrtr_type);
} }
type = le32_to_cpu(qrtr_type);
rc = enqueue_fn(node, skb, type, &ipc->us, addr); rc = enqueue_fn(node, skb, type, &ipc->us, addr);
if (rc >= 0) if (rc >= 0)
rc = len; rc = len;
......
...@@ -77,9 +77,6 @@ static int __net_init tipc_init_net(struct net *net) ...@@ -77,9 +77,6 @@ static int __net_init tipc_init_net(struct net *net)
goto out_nametbl; goto out_nametbl;
INIT_LIST_HEAD(&tn->dist_queue); INIT_LIST_HEAD(&tn->dist_queue);
err = tipc_topsrv_start(net);
if (err)
goto out_subscr;
err = tipc_bcast_init(net); err = tipc_bcast_init(net);
if (err) if (err)
...@@ -88,8 +85,6 @@ static int __net_init tipc_init_net(struct net *net) ...@@ -88,8 +85,6 @@ static int __net_init tipc_init_net(struct net *net)
return 0; return 0;
out_bclink: out_bclink:
tipc_bcast_stop(net);
out_subscr:
tipc_nametbl_stop(net); tipc_nametbl_stop(net);
out_nametbl: out_nametbl:
tipc_sk_rht_destroy(net); tipc_sk_rht_destroy(net);
...@@ -99,7 +94,6 @@ static int __net_init tipc_init_net(struct net *net) ...@@ -99,7 +94,6 @@ static int __net_init tipc_init_net(struct net *net)
static void __net_exit tipc_exit_net(struct net *net) static void __net_exit tipc_exit_net(struct net *net)
{ {
tipc_topsrv_stop(net);
tipc_net_stop(net); tipc_net_stop(net);
tipc_bcast_stop(net); tipc_bcast_stop(net);
tipc_nametbl_stop(net); tipc_nametbl_stop(net);
...@@ -113,6 +107,11 @@ static struct pernet_operations tipc_net_ops = { ...@@ -113,6 +107,11 @@ static struct pernet_operations tipc_net_ops = {
.size = sizeof(struct tipc_net), .size = sizeof(struct tipc_net),
}; };
static struct pernet_operations tipc_topsrv_net_ops = {
.init = tipc_topsrv_init_net,
.exit = tipc_topsrv_exit_net,
};
static int __init tipc_init(void) static int __init tipc_init(void)
{ {
int err; int err;
...@@ -143,6 +142,10 @@ static int __init tipc_init(void) ...@@ -143,6 +142,10 @@ static int __init tipc_init(void)
if (err) if (err)
goto out_socket; goto out_socket;
err = register_pernet_subsys(&tipc_topsrv_net_ops);
if (err)
goto out_pernet_topsrv;
err = tipc_bearer_setup(); err = tipc_bearer_setup();
if (err) if (err)
goto out_bearer; goto out_bearer;
...@@ -150,6 +153,8 @@ static int __init tipc_init(void) ...@@ -150,6 +153,8 @@ static int __init tipc_init(void)
pr_info("Started in single node mode\n"); pr_info("Started in single node mode\n");
return 0; return 0;
out_bearer: out_bearer:
unregister_pernet_subsys(&tipc_topsrv_net_ops);
out_pernet_topsrv:
tipc_socket_stop(); tipc_socket_stop();
out_socket: out_socket:
unregister_pernet_subsys(&tipc_net_ops); unregister_pernet_subsys(&tipc_net_ops);
...@@ -167,6 +172,7 @@ static int __init tipc_init(void) ...@@ -167,6 +172,7 @@ static int __init tipc_init(void)
static void __exit tipc_exit(void) static void __exit tipc_exit(void)
{ {
tipc_bearer_cleanup(); tipc_bearer_cleanup();
unregister_pernet_subsys(&tipc_topsrv_net_ops);
tipc_socket_stop(); tipc_socket_stop();
unregister_pernet_subsys(&tipc_net_ops); unregister_pernet_subsys(&tipc_net_ops);
tipc_netlink_stop(); tipc_netlink_stop();
......
...@@ -77,8 +77,9 @@ void tipc_sub_report_overlap(struct tipc_subscription *sub, ...@@ -77,8 +77,9 @@ void tipc_sub_report_overlap(struct tipc_subscription *sub,
u32 found_lower, u32 found_upper, u32 found_lower, u32 found_upper,
u32 event, u32 port, u32 node, u32 event, u32 port, u32 node,
u32 scope, int must); u32 scope, int must);
int tipc_topsrv_start(struct net *net);
void tipc_topsrv_stop(struct net *net); int __net_init tipc_topsrv_init_net(struct net *net);
void __net_exit tipc_topsrv_exit_net(struct net *net);
void tipc_sub_put(struct tipc_subscription *subscription); void tipc_sub_put(struct tipc_subscription *subscription);
void tipc_sub_get(struct tipc_subscription *subscription); void tipc_sub_get(struct tipc_subscription *subscription);
......
...@@ -635,7 +635,7 @@ static void tipc_topsrv_work_stop(struct tipc_topsrv *s) ...@@ -635,7 +635,7 @@ static void tipc_topsrv_work_stop(struct tipc_topsrv *s)
destroy_workqueue(s->send_wq); destroy_workqueue(s->send_wq);
} }
int tipc_topsrv_start(struct net *net) static int tipc_topsrv_start(struct net *net)
{ {
struct tipc_net *tn = tipc_net(net); struct tipc_net *tn = tipc_net(net);
const char name[] = "topology_server"; const char name[] = "topology_server";
...@@ -668,7 +668,7 @@ int tipc_topsrv_start(struct net *net) ...@@ -668,7 +668,7 @@ int tipc_topsrv_start(struct net *net)
return ret; return ret;
} }
void tipc_topsrv_stop(struct net *net) static void tipc_topsrv_stop(struct net *net)
{ {
struct tipc_topsrv *srv = tipc_topsrv(net); struct tipc_topsrv *srv = tipc_topsrv(net);
struct socket *lsock = srv->listener; struct socket *lsock = srv->listener;
...@@ -693,3 +693,13 @@ void tipc_topsrv_stop(struct net *net) ...@@ -693,3 +693,13 @@ void tipc_topsrv_stop(struct net *net)
idr_destroy(&srv->conn_idr); idr_destroy(&srv->conn_idr);
kfree(srv); kfree(srv);
} }
int __net_init tipc_topsrv_init_net(struct net *net)
{
return tipc_topsrv_start(net);
}
void __net_exit tipc_topsrv_exit_net(struct net *net)
{
tipc_topsrv_stop(net);
}
...@@ -15,6 +15,7 @@ GW_IP6=2001:db8:1::2 ...@@ -15,6 +15,7 @@ GW_IP6=2001:db8:1::2
SRC_IP6=2001:db8:1::3 SRC_IP6=2001:db8:1::3
DEV_ADDR=192.51.100.1 DEV_ADDR=192.51.100.1
DEV_ADDR6=2001:db8:1::1
DEV=dummy0 DEV=dummy0
log_test() log_test()
...@@ -55,8 +56,8 @@ setup() ...@@ -55,8 +56,8 @@ setup()
$IP link add dummy0 type dummy $IP link add dummy0 type dummy
$IP link set dev dummy0 up $IP link set dev dummy0 up
$IP address add 198.51.100.1/24 dev dummy0 $IP address add $DEV_ADDR/24 dev dummy0
$IP -6 address add 2001:db8:1::1/64 dev dummy0 $IP -6 address add $DEV_ADDR6/64 dev dummy0
set +e set +e
} }
...@@ -186,8 +187,13 @@ fib_rule4_test() ...@@ -186,8 +187,13 @@ fib_rule4_test()
match="oif $DEV" match="oif $DEV"
fib_rule4_test_match_n_redirect "$match" "$match" "oif redirect to table" fib_rule4_test_match_n_redirect "$match" "$match" "oif redirect to table"
# need enable forwarding and disable rp_filter temporarily as all the
# addresses are in the same subnet and egress device == ingress device.
ip netns exec testns sysctl -w net.ipv4.ip_forward=1
ip netns exec testns sysctl -w net.ipv4.conf.$DEV.rp_filter=0
match="from $SRC_IP iif $DEV" match="from $SRC_IP iif $DEV"
fib_rule4_test_match_n_redirect "$match" "$match" "iif redirect to table" fib_rule4_test_match_n_redirect "$match" "$match" "iif redirect to table"
ip netns exec testns sysctl -w net.ipv4.ip_forward=0
match="tos 0x10" match="tos 0x10"
fib_rule4_test_match_n_redirect "$match" "$match" "tos redirect to table" fib_rule4_test_match_n_redirect "$match" "$match" "tos redirect to table"
......
...@@ -63,30 +63,6 @@ static clockid_t get_clockid(int fd) ...@@ -63,30 +63,6 @@ static clockid_t get_clockid(int fd)
return (((unsigned int) ~fd) << 3) | CLOCKFD; return (((unsigned int) ~fd) << 3) | CLOCKFD;
} }
static void handle_alarm(int s)
{
printf("received signal %d\n", s);
}
static int install_handler(int signum, void (*handler)(int))
{
struct sigaction action;
sigset_t mask;
/* Unblock the signal. */
sigemptyset(&mask);
sigaddset(&mask, signum);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
/* Install the signal handler. */
action.sa_handler = handler;
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
sigaction(signum, &action, NULL);
return 0;
}
static long ppb_to_scaled_ppm(int ppb) static long ppb_to_scaled_ppm(int ppb)
{ {
/* /*
...@@ -112,8 +88,6 @@ static void usage(char *progname) ...@@ -112,8 +88,6 @@ static void usage(char *progname)
{ {
fprintf(stderr, fprintf(stderr,
"usage: %s [options]\n" "usage: %s [options]\n"
" -a val request a one-shot alarm after 'val' seconds\n"
" -A val request a periodic alarm every 'val' seconds\n"
" -c query the ptp clock's capabilities\n" " -c query the ptp clock's capabilities\n"
" -d name device to open\n" " -d name device to open\n"
" -e val read 'val' external time stamp events\n" " -e val read 'val' external time stamp events\n"
...@@ -148,15 +122,9 @@ int main(int argc, char *argv[]) ...@@ -148,15 +122,9 @@ int main(int argc, char *argv[])
struct ptp_pin_desc desc; struct ptp_pin_desc desc;
struct timespec ts; struct timespec ts;
struct timex tx; struct timex tx;
static timer_t timerid;
struct itimerspec timeout;
struct sigevent sigevent;
struct ptp_clock_time *pct; struct ptp_clock_time *pct;
struct ptp_sys_offset *sysoff; struct ptp_sys_offset *sysoff;
char *progname; char *progname;
unsigned int i; unsigned int i;
int c, cnt, fd; int c, cnt, fd;
...@@ -170,10 +138,8 @@ int main(int argc, char *argv[]) ...@@ -170,10 +138,8 @@ int main(int argc, char *argv[])
int gettime = 0; int gettime = 0;
int index = 0; int index = 0;
int list_pins = 0; int list_pins = 0;
int oneshot = 0;
int pct_offset = 0; int pct_offset = 0;
int n_samples = 0; int n_samples = 0;
int periodic = 0;
int perout = -1; int perout = -1;
int pin_index = -1, pin_func; int pin_index = -1, pin_func;
int pps = -1; int pps = -1;
...@@ -185,14 +151,8 @@ int main(int argc, char *argv[]) ...@@ -185,14 +151,8 @@ int main(int argc, char *argv[])
progname = strrchr(argv[0], '/'); progname = strrchr(argv[0], '/');
progname = progname ? 1+progname : argv[0]; progname = progname ? 1+progname : argv[0];
while (EOF != (c = getopt(argc, argv, "a:A:cd:e:f:ghi:k:lL:p:P:sSt:T:v"))) { while (EOF != (c = getopt(argc, argv, "cd:e:f:ghi:k:lL:p:P:sSt:T:v"))) {
switch (c) { switch (c) {
case 'a':
oneshot = atoi(optarg);
break;
case 'A':
periodic = atoi(optarg);
break;
case 'c': case 'c':
capabilities = 1; capabilities = 1;
break; break;
...@@ -393,49 +353,6 @@ int main(int argc, char *argv[]) ...@@ -393,49 +353,6 @@ int main(int argc, char *argv[])
} }
} }
if (oneshot) {
install_handler(SIGALRM, handle_alarm);
/* Create a timer. */
sigevent.sigev_notify = SIGEV_SIGNAL;
sigevent.sigev_signo = SIGALRM;
if (timer_create(clkid, &sigevent, &timerid)) {
perror("timer_create");
return -1;
}
/* Start the timer. */
memset(&timeout, 0, sizeof(timeout));
timeout.it_value.tv_sec = oneshot;
if (timer_settime(timerid, 0, &timeout, NULL)) {
perror("timer_settime");
return -1;
}
pause();
timer_delete(timerid);
}
if (periodic) {
install_handler(SIGALRM, handle_alarm);
/* Create a timer. */
sigevent.sigev_notify = SIGEV_SIGNAL;
sigevent.sigev_signo = SIGALRM;
if (timer_create(clkid, &sigevent, &timerid)) {
perror("timer_create");
return -1;
}
/* Start the timer. */
memset(&timeout, 0, sizeof(timeout));
timeout.it_interval.tv_sec = periodic;
timeout.it_value.tv_sec = periodic;
if (timer_settime(timerid, 0, &timeout, NULL)) {
perror("timer_settime");
return -1;
}
while (1) {
pause();
}
timer_delete(timerid);
}
if (perout >= 0) { if (perout >= 0) {
if (clock_gettime(clkid, &ts)) { if (clock_gettime(clkid, &ts)) {
perror("clock_gettime"); perror("clock_gettime");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment