* [net-next PATCH 0/2] iovnl netlink ops + enic dynamic vnics
From: Scott Feldman @ 2010-04-19 19:18 UTC (permalink / raw)
To: davem; +Cc: netdev, chrisw
Patch 1/2 adds new I/O Virtualization netlink ops:
IOV netlink (IOVNL) adds I/O Virtualization control support to a master
device (MD) netdev interface. The MD (e.g. SR-IOV PF) will set/get
control settings on behalf of a slave netdevice (e.g. SR-IOV VF). The
design allows for the case where master and slave are the
same netdev interface.
The ops currently defined are:
set_mac_vlan: set mac+vlan on VF
set_port_profile: set port-profile on VF
unset_port_profile: unset port-profile on VF
Patch 2/2 adds IOV netlink ops support to enic dynamic vnics:
Add enic iovnl ops to support setting port-profile for dynamic vnics. Enic
dynamic vnics are just like normal enic eth vnics except dynamic vnics require
an extra configuration step to assign a port-profile identifier to the
interface before the interface is useable. Once assigned, link comes up
on the interface and is ready for I/O. The port-profile is used to configure
the network port assigned to the interface. The network port configuration
includes VLAN membership, QoS policies, and port security settings typical
of a data center network.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: Roopa Prabhu<roprabhu@cisco.com>
^ permalink raw reply
* [net-next PATCH 1/2] add iovnl netlink support
From: Scott Feldman @ 2010-04-19 19:18 UTC (permalink / raw)
To: davem; +Cc: netdev, chrisw
In-Reply-To: <20100419191425.10423.88005.stgit@savbu-pc100.cisco.com>
From: Scott Feldman <scofeldm@cisco.com>
IOV netlink (IOVNL) adds I/O Virtualization control support to a master
device (MD) netdev interface. The MD (e.g. SR-IOV PF) will set/get
control settings on behalf of a slave netdevice (e.g. SR-IOV VF). The
design allows for the case where master and slave are the
same netdev interface.
One control setting example is MAC/VLAN settings for a VF. Another
example control setting is a port-profile for a VF. A port-profile is an
identifier that defines policy-based settings on the network port
backing the VF. The network port settings examples are VLAN membership,
QoS settings, and L2 security settings, typical of a data center network.
This patch adds the iovnl interface definitions and an iovnl module.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: Roopa Prabhu<roprabhu@cisco.com>
---
include/linux/iovnl.h | 124 +++++++++++++++++++++
include/linux/netdevice.h | 4 +
include/linux/rtnetlink.h | 5 +
include/net/iovnl.h | 36 ++++++
net/Kconfig | 1
net/Makefile | 3 +
net/iovnl/Kconfig | 10 ++
net/iovnl/Makefile | 1
net/iovnl/iovnl.c | 260 +++++++++++++++++++++++++++++++++++++++++++++
9 files changed, 444 insertions(+), 0 deletions(-)
diff --git a/include/linux/iovnl.h b/include/linux/iovnl.h
new file mode 100644
index 0000000..ac5fcd3
--- /dev/null
+++ b/include/linux/iovnl.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef __LINUX_IOVNL_H__
+#define __LINUX_IOVNL_H__
+
+#include <linux/types.h>
+
+#define IOVNL_PROTO_VERSION 1
+
+/**
+ * IOV netlink (IOVNL) adds I/O Virtualization control support to a master
+ * device (MD) netdev interface. The MD (e.g. SR-IOV PF) will set/get
+ * control settings on behalf of a slave netdevice (e.g. SR-IOV VF). The
+ * design allows for the degenerative case where master and slave are the
+ * same netdev interface.
+ *
+ * One control setting example is MAC/VLAN settings for a VF. Another
+ * example control setting is a port-profile for a VF. A port-profile is an
+ * identifier that defines policy-based settings on the network port
+ * backing the VF. The network port settings examples are VLAN membership,
+ * QoS settings, and L2 security settings, typical of a data center network.
+ *
+ * This file defines an rtnetlink interface to allow setting of IOVNL
+ * on capable netdev devices.
+ */
+
+struct iovnlmsg {
+ __u8 family;
+ __u8 cmd;
+ __u16 pad;
+};
+
+/**
+ * enum iovnl_cmds - supported IOV commands
+ *
+ * @IOV_CMD_UNDEFINED: unspecified command to catch errors
+ * @IOV_CMD_SET_PORT_PROFILE: set the port-profile on the device
+ * @IOV_CMD_UNSET_PORT_PROFILE: clear port-profile on the device
+ * @IOV_CMD_GET_PORT_PROFILE_STATUS: return status of last
+ * IOV_CMD_SET_PORT_PROFILE command
+ * @IOV_SET_MAC_VLAN: Set the MAC address and VLAN on the device
+ */
+enum iovnl_cmds {
+ IOV_CMD_UNDEFINED,
+
+ IOV_CMD_SET_PORT_PROFILE,
+ IOV_CMD_UNSET_PORT_PROFILE,
+ IOV_CMD_GET_PORT_PROFILE_STATUS,
+
+ IOV_CMD_SET_MAC_VLAN,
+
+ __IOV_CMD_ENUM_MAX,
+ IOV_CMD_MAX = __IOV_CMD_ENUM_MAX - 1,
+};
+
+/**
+ * enum iovnl_attrs - IOV top-level netlink attributes
+ *
+ * @IOV_ATTR_UNDEFINED: unspecified attribute to catch errors
+ * @IOV_ATTR_IFNAME: interface name of master (PF) net device (NLA_NUL_STRING)
+ * @IOV_ATTR_VF_IFNAME: interface name of target VF device (NLA_NUL_STRING)
+ * @IOV_ATTR_PORT_PROFILE: port-profile name to assign to device
+ * (NLA_NUL_STRING)
+ * @IOV_ATTR_CLIENT_NAME: client name (NLA_NUL_STRING)
+ * @IOV_ATTR_HOST_UUID: host UUID (NLA_NUL_STRING)
+ * @IOV_ATTR_PORT_PROFILE_STATUS: status of last IOV_CMD_SET_PORT_PROFILE
+ * command (NLA_U8)
+ * @IOV_ATTR_MAC_ADDR: device station MAC address (NLA_U8[6])
+ * @IOV_ATTR_VLAN: device 8021q VLAN ID (NLA_U16)
+ # @IOV_ATTR_STATUS: cmd return status code
+ */
+enum iovnl_attrs {
+ IOV_ATTR_UNDEFINED,
+
+ IOV_ATTR_IFNAME,
+ IOV_ATTR_VF_IFNAME,
+
+ IOV_ATTR_PORT_PROFILE,
+ IOV_ATTR_CLIENT_NAME,
+ IOV_ATTR_HOST_UUID,
+ IOV_ATTR_PORT_PROFILE_STATUS,
+
+ IOV_ATTR_MAC_ADDR,
+ IOV_ATTR_VLAN,
+
+ IOV_ATTR_STATUS,
+
+ __IOV_ATTR_ENUM_MAX,
+ IOV_ATTR_MAX = __IOV_ATTR_ENUM_MAX - 1,
+};
+
+/**
+ * enum iovnl_port_profile_status - IOV_ATTR_PORT_PROFILE_STATUS status
+ * return codes
+ *
+ * @IOV_PORT_PROFILE_STATUS_UNKNOWN: unspecified to catch errors
+ * @IOV_PORT_PROFILE_STATUS_SUCCESS: port-profile aiovlied successfully
+ * @IOV_PORT_PROFILE_STATUS_ERROR: port-profile setting had error
+ * @IOV_PORT_PROFILE_STATUS_INPROGRESS: port-profile setting in-progress
+ */
+enum iovnl_port_profile_status {
+ IOV_PORT_PROFILE_STATUS_UNKNOWN,
+ IOV_PORT_PROFILE_STATUS_SUCCESS,
+ IOV_PORT_PROFILE_STATUS_ERROR,
+ IOV_PORT_PROFILE_STATUS_INPROGRESS,
+};
+
+#endif /* __LINUX_IOVNL_H__ */
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 649a025..b531b0d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -50,6 +50,7 @@
#ifdef CONFIG_DCB
#include <net/dcbnl.h>
#endif
+#include <net/iovnl.h>
struct vlan_group;
struct netpoll_info;
@@ -1048,6 +1049,9 @@ struct net_device {
const struct dcbnl_rtnl_ops *dcbnl_ops;
#endif
+ /* IOV netlink ops */
+ const struct iovnl_ops *iovnl_ops;
+
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
/* max exchange id for FCoE LRO by ddp */
unsigned int fcoe_ddp_xid;
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index d1c7c90..aafadf7 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -113,6 +113,11 @@ enum {
RTM_SETDCB,
#define RTM_SETDCB RTM_SETDCB
+ RTM_GETIOV = 82,
+#define RTM_GETIOV RTM_GETIOV
+ RTM_SETIOV,
+#define RTM_SETIOV RTM_SETIOV
+
__RTM_MAX,
#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
};
diff --git a/include/net/iovnl.h b/include/net/iovnl.h
new file mode 100644
index 0000000..c353eee
--- /dev/null
+++ b/include/net/iovnl.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef __NET_IOVNL_H__
+#define __NET_IOVNL_H__
+
+/*
+ * Ops struct for the netlink callbacks. Used by IOVNL-enabled drivers through
+ * the netdevice struct.
+ */
+struct iovnl_ops {
+ int (*set_port_profile)(struct net_device *, struct net_device *,
+ char *, u8 *, char *, char *);
+ int (*unset_port_profile)(struct net_device *, struct net_device *);
+ int (*get_port_profile_status)(struct net_device *,
+ struct net_device *);
+ int (*set_mac_vlan)(struct net_device *, struct net_device *,
+ u8 *, u16);
+};
+
+#endif /* __NET_IOVNL_H__ */
diff --git a/net/Kconfig b/net/Kconfig
index 0d68b40..aca5de0 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -203,6 +203,7 @@ source "net/phonet/Kconfig"
source "net/ieee802154/Kconfig"
source "net/sched/Kconfig"
source "net/dcb/Kconfig"
+source "net/iovnl/Kconfig"
config RPS
boolean
diff --git a/net/Makefile b/net/Makefile
index cb7bdc1..23589e9 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -61,6 +61,9 @@ obj-$(CONFIG_CAIF) += caif/
ifneq ($(CONFIG_DCB),)
obj-y += dcb/
endif
+ifneq ($(CONFIG_IOVNL),)
+obj-y += iovnl/
+endif
obj-y += ieee802154/
ifeq ($(CONFIG_NET),y)
diff --git a/net/iovnl/Kconfig b/net/iovnl/Kconfig
new file mode 100644
index 0000000..4548417
--- /dev/null
+++ b/net/iovnl/Kconfig
@@ -0,0 +1,10 @@
+config IOVNL
+ tristate "IOV rtnetlink support"
+ default n
+ ---help---
+ This enables support for configuring IOV
+ on Ethernet adapters via rtnetlink. Say 'Y'
+ if you have a Ethernet adapter which supports network
+ configuration using IOV rtnetlinl.
+
+ If unsure, say N.
diff --git a/net/iovnl/Makefile b/net/iovnl/Makefile
new file mode 100644
index 0000000..9256d01
--- /dev/null
+++ b/net/iovnl/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_IOVNL) += iovnl.o
diff --git a/net/iovnl/iovnl.c b/net/iovnl/iovnl.c
new file mode 100644
index 0000000..ce9db50
--- /dev/null
+++ b/net/iovnl/iovnl.c
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#include <linux/netdevice.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/iovnl.h>
+#include <net/netlink.h>
+#include <net/rtnetlink.h>
+#include <net/iovnl.h>
+#include <net/sock.h>
+
+MODULE_AUTHOR("Roopa Prabhu <roprabhu@cisco.com, "
+ "Scott Feldman <scofeldm@cisco.com>");
+MODULE_DESCRIPTION("IOV netlink");
+MODULE_LICENSE("GPL");
+
+/* IOVNL netlink attributes policy */
+static const struct nla_policy iovnl_rtnl_policy[IOV_ATTR_MAX + 1] = {
+ [IOV_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ - 1 },
+ [IOV_ATTR_VF_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ - 1 },
+ [IOV_ATTR_PORT_PROFILE] = { .type = NLA_NUL_STRING, .len = 32 },
+ [IOV_ATTR_CLIENT_NAME] = { .type = NLA_NUL_STRING, .len = 32 },
+ [IOV_ATTR_HOST_UUID] = { .type = NLA_NUL_STRING, .len = 64 },
+ [IOV_ATTR_PORT_PROFILE_STATUS] = { .type = NLA_U8 },
+ [IOV_ATTR_MAC_ADDR] = { .len = 6 },
+ [IOV_ATTR_VLAN] = { .type = NLA_U16 },
+ [IOV_ATTR_STATUS] = { .type = NLA_U8 },
+};
+
+/* standard netlink reply call */
+static int iovnl_reply(u8 value, u8 event, u8 cmd, u8 attr, u32 pid,
+ u32 seq, u16 flags)
+{
+ struct sk_buff *skb;
+ struct iovnlmsg *iov;
+ struct nlmsghdr *nlh;
+ int ret = -EINVAL;
+
+ skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+ if (!skb)
+ return ret;
+
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*iov), flags);
+
+ iov = NLMSG_DATA(nlh);
+ iov->family = AF_UNSPEC;
+ iov->cmd = cmd;
+ iov->pad = 0;
+
+ ret = nla_put_u8(skb, attr, value);
+ if (ret)
+ goto err;
+
+ /* end the message, assign the nlmsg_len. */
+ nlmsg_end(skb, nlh);
+ ret = rtnl_unicast(skb, &init_net, pid);
+ if (ret)
+ return -EINVAL;
+
+ return 0;
+nlmsg_failure:
+err:
+ kfree_skb(skb);
+ return ret;
+}
+
+static int iovnl_get_port_profile_status(struct net_device *dev,
+ struct net_device *vf_dev, u32 pid, u32 seq, u16 flags)
+{
+ int ret;
+
+ if (!dev->iovnl_ops->get_port_profile_status)
+ return -EINVAL;
+
+ ret = dev->iovnl_ops->get_port_profile_status(dev, vf_dev);
+
+ return iovnl_reply(ret, RTM_GETIOV,
+ IOV_CMD_GET_PORT_PROFILE_STATUS, IOV_ATTR_PORT_PROFILE_STATUS,
+ pid, seq, flags);
+}
+
+
+static int iovnl_set_port_profile(struct net_device *dev,
+ struct net_device *vf_dev, struct nlattr **tb,
+ u32 pid, u32 seq, u16 flags)
+{
+ int i, ret;
+ char *port_profile = NULL;
+ u8 *mac_addr = NULL;
+ char *client_name = NULL;
+ char *host_uuid = NULL;
+
+ if (!tb[IOV_ATTR_PORT_PROFILE] || !dev->iovnl_ops->set_port_profile)
+ return -EINVAL;
+
+ for (i = 0; i <= IOV_ATTR_MAX; i++) {
+ if (!tb[i])
+ continue;
+ switch (tb[i]->nla_type) {
+ case IOV_ATTR_PORT_PROFILE:
+ port_profile = nla_data(tb[i]);
+ break;
+ case IOV_ATTR_MAC_ADDR:
+ mac_addr = nla_data(tb[i]);
+ break;
+ case IOV_ATTR_CLIENT_NAME:
+ client_name = nla_data(tb[i]);
+ break;
+ case IOV_ATTR_HOST_UUID:
+ host_uuid = nla_data(tb[i]);
+ break;
+ }
+ }
+
+ ret = dev->iovnl_ops->set_port_profile(dev, vf_dev,
+ port_profile, mac_addr, client_name, host_uuid);
+
+ return iovnl_reply(ret, RTM_SETIOV, IOV_CMD_SET_PORT_PROFILE,
+ IOV_ATTR_STATUS, pid, seq, flags);
+}
+
+static int iovnl_set_mac_vlan(struct net_device *dev,
+ struct net_device *vf_dev, struct nlattr **tb,
+ u32 pid, u32 seq, u16 flags)
+{
+ int i, ret;
+ u8 *mac_addr = NULL;
+ u16 vlan = 0;
+
+ if (!dev->iovnl_ops->set_mac_vlan)
+ return -EINVAL;
+
+ for (i = 0; i <= IOV_ATTR_MAX; i++) {
+ if (!tb[i])
+ continue;
+ switch (tb[i]->nla_type) {
+ case IOV_ATTR_MAC_ADDR:
+ mac_addr = nla_data(tb[i]);
+ break;
+ case IOV_ATTR_VLAN:
+ vlan = nla_get_u16(tb[i]);
+ break;
+ }
+ }
+
+ ret = dev->iovnl_ops->set_mac_vlan(dev, vf_dev,
+ mac_addr, vlan);
+
+ return iovnl_reply(ret, RTM_SETIOV, IOV_CMD_SET_MAC_VLAN,
+ IOV_ATTR_STATUS, pid, seq, flags);
+}
+
+static int iovnl_unset_port_profile(struct net_device *dev,
+ struct net_device *vf_dev, struct nlattr **tb,
+ u32 pid, u32 seq, u16 flags)
+{
+ int ret;
+
+ if (!dev->iovnl_ops->unset_port_profile)
+ return -EINVAL;
+
+ ret = dev->iovnl_ops->unset_port_profile(dev, vf_dev);
+
+ return iovnl_reply(ret, RTM_SETIOV, IOV_CMD_UNSET_PORT_PROFILE,
+ IOV_ATTR_STATUS, pid, seq, flags);
+}
+
+static int iovnl_doit(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
+{
+ struct net *net = sock_net(skb->sk);
+ struct net_device *dev;
+ struct net_device *vf_dev = NULL;
+ struct iovnlmsg *iov = (struct iovnlmsg *)NLMSG_DATA(nlh);
+ struct nlattr *tb[IOV_ATTR_MAX + 1];
+ u32 pid = skb ? NETLINK_CB(skb).pid : 0;
+ int ret;
+
+ if (!net_eq(net, &init_net))
+ return -EINVAL;
+
+ ret = nlmsg_parse(nlh, sizeof(*iov), tb, IOV_ATTR_MAX,
+ iovnl_rtnl_policy);
+ if (ret < 0)
+ return ret;
+
+ if (!tb[IOV_ATTR_IFNAME])
+ return -EINVAL;
+
+ dev = dev_get_by_name(&init_net, nla_data(tb[IOV_ATTR_IFNAME]));
+ if (!dev)
+ return -EINVAL;
+
+ if (tb[IOV_ATTR_VF_IFNAME])
+ vf_dev = dev_get_by_name(&init_net,
+ nla_data(tb[IOV_ATTR_VF_IFNAME]));
+
+ if (!dev->iovnl_ops)
+ goto errout;
+
+ switch (iov->cmd) {
+ case IOV_CMD_SET_PORT_PROFILE:
+ ret = iovnl_set_port_profile(dev, vf_dev,
+ tb, pid, nlh->nlmsg_seq, nlh->nlmsg_flags);
+ goto out;
+ case IOV_CMD_UNSET_PORT_PROFILE:
+ ret = iovnl_unset_port_profile(dev, vf_dev,
+ tb, pid, nlh->nlmsg_seq, nlh->nlmsg_flags);
+ goto out;
+ case IOV_CMD_GET_PORT_PROFILE_STATUS:
+ ret = iovnl_get_port_profile_status(dev, vf_dev,
+ pid, nlh->nlmsg_seq, nlh->nlmsg_flags);
+ goto out;
+ case IOV_CMD_SET_MAC_VLAN:
+ ret = iovnl_set_mac_vlan(dev, vf_dev,
+ tb, pid, nlh->nlmsg_seq, nlh->nlmsg_flags);
+ goto out;
+ default:
+ goto errout;
+ }
+errout:
+ ret = -EINVAL;
+out:
+ dev_put(dev);
+ if (vf_dev)
+ dev_put(vf_dev);
+
+ return ret;
+}
+
+static int __init iovnl_init(void)
+{
+ rtnl_register(PF_UNSPEC, RTM_GETIOV, iovnl_doit, NULL);
+ rtnl_register(PF_UNSPEC, RTM_SETIOV, iovnl_doit, NULL);
+
+ return 0;
+}
+module_init(iovnl_init);
+
+static void __exit iovnl_exit(void)
+{
+ rtnl_unregister(PF_UNSPEC, RTM_GETIOV);
+ rtnl_unregister(PF_UNSPEC, RTM_SETIOV);
+}
+module_exit(iovnl_exit);
^ permalink raw reply related
* [net-next PATCH 2/2] add enic iovnl ops for dynamic vnics
From: Scott Feldman @ 2010-04-19 19:18 UTC (permalink / raw)
To: davem; +Cc: netdev, chrisw
In-Reply-To: <20100419191425.10423.88005.stgit@savbu-pc100.cisco.com>
From: Scott Feldman <scofeldm@cisco.com>
Add enic iovnl ops to support setting port-profile for dynamic vnics. Enic
dynamic vnics are just like normal enic eth vnics except dynamic vnics require
an extra configuration step to assign a port-profile identifier to the
interface before the interface is useable. Once assigned, link comes up
on the interface and is ready for I/O. The port-profile is used to configure
the network port assigned to the interface. The network port configuration
includes VLAN membership, QoS policies, and port security settings typical
of a data center network.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: Roopa Prabhu<roprabhu@cisco.com>
---
drivers/net/enic/Makefile | 2 -
drivers/net/enic/enic.h | 3 +
drivers/net/enic/enic_iovnl.c | 136 +++++++++++++++++++++++++++++++++++++++++
drivers/net/enic/enic_main.c | 67 +++++++++++++++++---
drivers/net/enic/enic_res.c | 5 ++
drivers/net/enic/enic_res.h | 1
drivers/net/enic/vnic_dev.c | 58 +++++++++++++++++
drivers/net/enic/vnic_dev.h | 4 +
drivers/net/enic/vnic_vic.c | 73 ++++++++++++++++++++++
drivers/net/enic/vnic_vic.h | 58 +++++++++++++++++
10 files changed, 394 insertions(+), 13 deletions(-)
diff --git a/drivers/net/enic/Makefile b/drivers/net/enic/Makefile
index 391c3bc..311613b 100644
--- a/drivers/net/enic/Makefile
+++ b/drivers/net/enic/Makefile
@@ -1,5 +1,5 @@
obj-$(CONFIG_ENIC) := enic.o
enic-y := enic_main.o vnic_cq.o vnic_intr.o vnic_wq.o \
- enic_res.o vnic_dev.o vnic_rq.o
+ enic_res.o vnic_dev.o vnic_rq.o vnic_vic.o enic_iovnl.o
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index 5fa56f1..5790655 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -122,4 +122,7 @@ struct enic {
unsigned int cq_count;
};
+void enic_set_multicast_list(struct net_device *netdev);
+void enic_set_iovnl_ops(struct net_device *netdev);
+
#endif /* _ENIC_H_ */
diff --git a/drivers/net/enic/enic_iovnl.c b/drivers/net/enic/enic_iovnl.c
new file mode 100644
index 0000000..37c5d85
--- /dev/null
+++ b/drivers/net/enic/enic_iovnl.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#include <linux/netdevice.h>
+#include <linux/iovnl.h>
+#include <net/iovnl.h>
+
+#include "enic_res.h"
+#include "enic.h"
+#include "vnic_dev.h"
+#include "vnic_vic.h"
+
+static int enic_provinfo_add_tlv_str(struct vic_provinfo *vp, u16 type,
+ char *str)
+{
+ return str ? vic_provinfo_add_tlv(vp, type, strlen(str) + 1, str) : 0;
+}
+
+static int enic_set_port_profile(struct net_device *dev,
+ struct net_device *vf_dev, char *port_profile,
+ u8 *client_mac_addr, char *client_name, char *host_uuid)
+{
+ struct enic *enic = netdev_priv(dev);
+ struct vic_provinfo *vp;
+ u8 oui[3] = VIC_PROVINFO_CISCO_OUI;
+ int enable = 1;
+ int err;
+
+ if (vf_dev && dev != vf_dev)
+ return -EINVAL;
+
+ if (!port_profile)
+ return -EINVAL;
+
+ vp = vic_provinfo_alloc(GFP_KERNEL, oui, VIC_PROVINFO_LINUX_TYPE);
+ if (!vp)
+ return -ENOMEM;
+
+ enic_provinfo_add_tlv_str(vp,
+ VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR, port_profile);
+ vic_provinfo_add_tlv(vp, VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR,
+ 6, client_mac_addr);
+ enic_provinfo_add_tlv_str(vp,
+ VIC_LINUX_PROV_TLV_CLIENT_NAME_STR, client_name);
+ enic_provinfo_add_tlv_str(vp,
+ VIC_LINUX_PROV_TLV_HOST_UUID_STR, host_uuid);
+
+ spin_lock(&enic->devcmd_lock);
+
+ err = vnic_dev_deinit(enic->vdev);
+ if (err)
+ goto err_out;
+
+ err = vnic_dev_logical_uplink(enic->vdev, enable);
+ if (err)
+ goto err_out;
+
+ err = vnic_dev_init_prov(enic->vdev, (u8 *)vp,
+ vic_provinfo_size(vp));
+
+err_out:
+ spin_unlock(&enic->devcmd_lock);
+
+ vic_provinfo_free(vp);
+
+ enic_set_multicast_list(dev);
+
+ return err;
+}
+
+static int enic_get_init_status(struct net_device *dev,
+ struct net_device *vf_dev)
+{
+ struct enic *enic = netdev_priv(dev);
+ int done, err, error;
+
+ if (vf_dev && dev != vf_dev)
+ return IOV_PORT_PROFILE_STATUS_UNKNOWN;
+
+ spin_lock(&enic->devcmd_lock);
+ err = vnic_dev_init_done(enic->vdev, &done, &error);
+ spin_unlock(&enic->devcmd_lock);
+
+ if (err || error)
+ return IOV_PORT_PROFILE_STATUS_ERROR;
+
+ if (!done)
+ return IOV_PORT_PROFILE_STATUS_INPROGRESS;
+
+ if (!error)
+ return IOV_PORT_PROFILE_STATUS_SUCCESS;
+
+ return IOV_PORT_PROFILE_STATUS_UNKNOWN;
+}
+
+static int enic_unset_port_profile(struct net_device *dev,
+ struct net_device *vf_dev)
+{
+ struct enic *enic = netdev_priv(dev);
+ int err;
+
+ if (vf_dev && dev != vf_dev)
+ return -EINVAL;
+
+ spin_lock(&enic->devcmd_lock);
+ err = vnic_dev_deinit(enic->vdev);
+ spin_unlock(&enic->devcmd_lock);
+
+ return err;
+}
+
+static const struct iovnl_ops enic_iovnl_ops = {
+ .set_port_profile = enic_set_port_profile,
+ .unset_port_profile = enic_unset_port_profile,
+ .get_port_profile_status = enic_get_init_status,
+};
+
+void enic_set_iovnl_ops(struct net_device *netdev)
+{
+ netdev->iovnl_ops = &enic_iovnl_ops;
+}
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 1232887..2fcc161 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -49,10 +49,12 @@
#define ENIC_DESC_MAX_SPLITS (MAX_TSO / WQ_ENET_MAX_DESC_LEN + 1)
#define PCI_DEVICE_ID_CISCO_VIC_ENET 0x0043 /* ethernet vnic */
+#define PCI_DEVICE_ID_CISCO_VIC_ENET_DYN 0x0044 /* enet dynamic vnic */
/* Supported devices */
static DEFINE_PCI_DEVICE_TABLE(enic_id_table) = {
{ PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET) },
+ { PCI_VDEVICE(CISCO, PCI_DEVICE_ID_CISCO_VIC_ENET_DYN) },
{ 0, } /* end of table */
};
@@ -113,6 +115,11 @@ static const struct enic_stat enic_rx_stats[] = {
static const unsigned int enic_n_tx_stats = ARRAY_SIZE(enic_tx_stats);
static const unsigned int enic_n_rx_stats = ARRAY_SIZE(enic_rx_stats);
+static int enic_is_dynamic(struct enic *enic)
+{
+ return enic->pdev->device == PCI_DEVICE_ID_CISCO_VIC_ENET_DYN;
+}
+
static int enic_get_settings(struct net_device *netdev,
struct ethtool_cmd *ecmd)
{
@@ -810,16 +817,44 @@ static void enic_reset_mcaddrs(struct enic *enic)
static int enic_set_mac_addr(struct net_device *netdev, char *addr)
{
- if (!is_valid_ether_addr(addr))
- return -EADDRNOTAVAIL;
+ struct enic *enic = netdev_priv(netdev);
+
+ if (enic_is_dynamic(enic)) {
+ if (!is_zero_ether_addr(addr) && !is_valid_ether_addr(addr))
+ return -EADDRNOTAVAIL;
+ } else {
+ if (!is_valid_ether_addr(addr))
+ return -EADDRNOTAVAIL;
+ }
memcpy(netdev->dev_addr, addr, netdev->addr_len);
return 0;
}
+static int enic_set_mac_address(struct net_device *netdev, void *p)
+{
+ struct enic *enic = netdev_priv(netdev);
+ struct sockaddr *saddr = p;
+ char *addr = saddr->sa_data;
+ int err;
+
+ if (!enic_is_dynamic(enic))
+ return 0;
+
+ err = enic_set_mac_addr(netdev, addr);
+ if (!err) {
+ spin_lock(&enic->devcmd_lock);
+ enic_del_station_addr(enic);
+ enic_add_station_addr(enic);
+ spin_unlock(&enic->devcmd_lock);
+ }
+
+ return err;
+}
+
/* netif_tx_lock held, BHs disabled */
-static void enic_set_multicast_list(struct net_device *netdev)
+void enic_set_multicast_list(struct net_device *netdev)
{
struct enic *enic = netdev_priv(netdev);
struct netdev_hw_addr *ha;
@@ -1440,10 +1475,12 @@ static int enic_open(struct net_device *netdev)
for (i = 0; i < enic->rq_count; i++)
vnic_rq_enable(&enic->rq[i]);
- spin_lock(&enic->devcmd_lock);
- enic_add_station_addr(enic);
- spin_unlock(&enic->devcmd_lock);
- enic_set_multicast_list(netdev);
+ if (!enic_is_dynamic(enic)) {
+ spin_lock(&enic->devcmd_lock);
+ enic_add_station_addr(enic);
+ spin_unlock(&enic->devcmd_lock);
+ enic_set_multicast_list(netdev);
+ }
netif_wake_queue(netdev);
napi_enable(&enic->napi);
@@ -1782,6 +1819,7 @@ static const struct net_device_ops enic_netdev_ops = {
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr,
.ndo_set_multicast_list = enic_set_multicast_list,
+ .ndo_set_mac_address = enic_set_mac_address,
.ndo_change_mtu = enic_change_mtu,
.ndo_vlan_rx_register = enic_vlan_rx_register,
.ndo_vlan_rx_add_vid = enic_vlan_rx_add_vid,
@@ -2010,11 +2048,13 @@ static int __devinit enic_probe(struct pci_dev *pdev,
netif_carrier_off(netdev);
- err = vnic_dev_init(enic->vdev, 0);
- if (err) {
- printk(KERN_ERR PFX
- "vNIC dev init failed, aborting.\n");
- goto err_out_dev_close;
+ if (!enic_is_dynamic(enic)) {
+ err = vnic_dev_init(enic->vdev, 0);
+ if (err) {
+ printk(KERN_ERR PFX
+ "vNIC dev init failed, aborting.\n");
+ goto err_out_dev_close;
+ }
}
err = enic_dev_init(enic);
@@ -2069,6 +2109,9 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (using_dac)
netdev->features |= NETIF_F_HIGHDMA;
+ if (enic_is_dynamic(enic))
+ enic_set_iovnl_ops(netdev);
+
enic->csum_rx_enabled = ENIC_SETTING(enic, RXCSUM);
enic->lro_mgr.max_aggr = ENIC_LRO_MAX_AGGR;
diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c
index 02839bf..9f31f58 100644
--- a/drivers/net/enic/enic_res.c
+++ b/drivers/net/enic/enic_res.c
@@ -108,6 +108,11 @@ void enic_add_station_addr(struct enic *enic)
vnic_dev_add_addr(enic->vdev, enic->mac_addr);
}
+void enic_del_station_addr(struct enic *enic)
+{
+ vnic_dev_del_addr(enic->vdev, enic->mac_addr);
+}
+
void enic_add_multicast_addr(struct enic *enic, u8 *addr)
{
vnic_dev_add_addr(enic->vdev, addr);
diff --git a/drivers/net/enic/enic_res.h b/drivers/net/enic/enic_res.h
index abc1974..0e16ba0 100644
--- a/drivers/net/enic/enic_res.h
+++ b/drivers/net/enic/enic_res.h
@@ -132,6 +132,7 @@ struct enic;
int enic_get_vnic_config(struct enic *);
void enic_add_station_addr(struct enic *enic);
+void enic_del_station_addr(struct enic *enic);
void enic_add_multicast_addr(struct enic *enic, u8 *addr);
void enic_del_multicast_addr(struct enic *enic, u8 *addr);
void enic_add_vlan(struct enic *enic, u16 vlanid);
diff --git a/drivers/net/enic/vnic_dev.c b/drivers/net/enic/vnic_dev.c
index d43a9d4..44b2e41 100644
--- a/drivers/net/enic/vnic_dev.c
+++ b/drivers/net/enic/vnic_dev.c
@@ -682,6 +682,64 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg)
return r;
}
+int vnic_dev_init_done(struct vnic_dev *vdev, int *done, int *err)
+{
+ u64 a0 = 0, a1 = 0;
+ int wait = 1000;
+ int ret;
+
+ *done = 0;
+
+ ret = vnic_dev_cmd(vdev, CMD_INIT_STATUS, &a0, &a1, wait);
+ if (ret)
+ return ret;
+
+ *done = (a0 == 0);
+
+ *err = (a0 == 0) ? a1 : 0;
+
+ return 0;
+}
+
+int vnic_dev_init_prov(struct vnic_dev *vdev, u8 *buf, u32 len)
+{
+ u64 a0, a1 = len;
+ int wait = 1000;
+ u64 prov_pa;
+ void *prov_buf;
+ int ret;
+
+ prov_buf = pci_alloc_consistent(vdev->pdev, len, &prov_pa);
+ if (!prov_buf)
+ return -ENOMEM;
+
+ memcpy(prov_buf, buf, len);
+
+ a0 = prov_pa;
+
+ ret = vnic_dev_cmd(vdev, CMD_INIT_PROV_INFO, &a0, &a1, wait);
+
+ pci_free_consistent(vdev->pdev, len, prov_buf, prov_pa);
+
+ return ret;
+}
+
+int vnic_dev_logical_uplink(struct vnic_dev *vdev, int enable)
+{
+ u64 a0 = enable, a1 = 0;
+ int wait = 1000;
+
+ return vnic_dev_cmd(vdev, CMD_LOGICAL_UPLINK, &a0, &a1, wait);
+}
+
+int vnic_dev_deinit(struct vnic_dev *vdev)
+{
+ u64 a0 = 0, a1 = 0;
+ int wait = 1000;
+
+ return vnic_dev_cmd(vdev, CMD_DEINIT, &a0, &a1, wait);
+}
+
int vnic_dev_link_status(struct vnic_dev *vdev)
{
if (vdev->linkstatus)
diff --git a/drivers/net/enic/vnic_dev.h b/drivers/net/enic/vnic_dev.h
index f5be640..bd40045 100644
--- a/drivers/net/enic/vnic_dev.h
+++ b/drivers/net/enic/vnic_dev.h
@@ -124,6 +124,10 @@ int vnic_dev_disable(struct vnic_dev *vdev);
int vnic_dev_open(struct vnic_dev *vdev, int arg);
int vnic_dev_open_done(struct vnic_dev *vdev, int *done);
int vnic_dev_init(struct vnic_dev *vdev, int arg);
+int vnic_dev_init_done(struct vnic_dev *vdev, int *done, int *err);
+int vnic_dev_init_prov(struct vnic_dev *vdev, u8 *buf, u32 len);
+int vnic_dev_logical_uplink(struct vnic_dev *vdev, int enable);
+int vnic_dev_deinit(struct vnic_dev *vdev);
int vnic_dev_soft_reset(struct vnic_dev *vdev, int arg);
int vnic_dev_soft_reset_done(struct vnic_dev *vdev, int *done);
void vnic_dev_set_intr_mode(struct vnic_dev *vdev,
diff --git a/drivers/net/enic/vnic_vic.c b/drivers/net/enic/vnic_vic.c
new file mode 100644
index 0000000..d769772
--- /dev/null
+++ b/drivers/net/enic/vnic_vic.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+
+#include "vnic_vic.h"
+
+struct vic_provinfo *vic_provinfo_alloc(gfp_t flags, u8 *oui, u8 type)
+{
+ struct vic_provinfo *vp = kzalloc(VIC_PROVINFO_MAX_DATA, flags);
+
+ if (!vp || !oui)
+ return NULL;
+
+ memcpy(vp->oui, oui, sizeof(vp->oui));
+ vp->type = type;
+ vp->length = htonl(sizeof(vp->num_tlvs));
+
+ return vp;
+}
+
+void vic_provinfo_free(struct vic_provinfo *vp)
+{
+ kfree(vp);
+}
+
+int vic_provinfo_add_tlv(struct vic_provinfo *vp, u16 type, u16 length,
+ void *value)
+{
+ struct vic_provinfo_tlv *tlv;
+
+ if (!vp || !value)
+ return -EINVAL;
+
+ if (ntohl(vp->length) + sizeof(*tlv) + length >
+ VIC_PROVINFO_MAX_TLV_DATA)
+ return -ENOMEM;
+
+ tlv = (struct vic_provinfo_tlv *)((u8 *)vp->tlv +
+ ntohl(vp->length) - sizeof(vp->num_tlvs));
+
+ tlv->type = htons(type);
+ tlv->length = htons(length);
+ memcpy(tlv->value, value, length);
+
+ vp->num_tlvs = htonl(ntohl(vp->num_tlvs) + 1);
+ vp->length = htonl(ntohl(vp->length) + sizeof(*tlv) + length);
+
+ return 0;
+}
+
+size_t vic_provinfo_size(struct vic_provinfo *vp)
+{
+ return vp ? ntohl(vp->length) + sizeof(*vp) - sizeof(vp->num_tlvs) : 0;
+}
diff --git a/drivers/net/enic/vnic_vic.h b/drivers/net/enic/vnic_vic.h
new file mode 100644
index 0000000..a7899fb
--- /dev/null
+++ b/drivers/net/enic/vnic_vic.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifndef _VNIC_VIC_H_
+#define _VNIC_VIC_H_
+
+/* Note: All integer fields in NETWORK byte order */
+
+/* Note: String field lengths include null char */
+
+#define VIC_PROVINFO_CISCO_OUI { 0x00, 0x00, 0x0c }
+#define VIC_PROVINFO_LINUX_TYPE 0x2
+
+enum vic_linux_prov_tlv_type {
+ VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR = 0,
+ VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR = 1, /* u8[6] */
+ VIC_LINUX_PROV_TLV_CLIENT_NAME_STR = 2,
+ VIC_LINUX_PROV_TLV_HOST_UUID_STR = 8,
+};
+
+struct vic_provinfo {
+ u8 oui[3]; /* OUI of data provider */
+ u8 type; /* provider-specific type */
+ u32 length; /* length of data below */
+ u32 num_tlvs; /* number of tlvs */
+ struct vic_provinfo_tlv {
+ u16 type;
+ u16 length;
+ u8 value[0];
+ } tlv[0];
+} __attribute__ ((packed));
+
+#define VIC_PROVINFO_MAX_DATA 1385
+#define VIC_PROVINFO_MAX_TLV_DATA (VIC_PROVINFO_MAX_DATA - \
+ sizeof(struct vic_provinfo))
+
+struct vic_provinfo *vic_provinfo_alloc(gfp_t flags, u8 *oui, u8 type);
+void vic_provinfo_free(struct vic_provinfo *vp);
+int vic_provinfo_add_tlv(struct vic_provinfo *vp, u16 type, u16 length,
+ void *value);
+size_t vic_provinfo_size(struct vic_provinfo *vp);
+
+#endif /* _VNIC_VIC_H_ */
^ permalink raw reply related
* Re: tip: origin tree build failure, [patch] fix isdn/gigaset build failure
From: Ingo Molnar @ 2010-04-19 19:54 UTC (permalink / raw)
To: Linus Torvalds; +Cc: David Miller, tilman, akpm, netdev, linux-kernel
In-Reply-To: <alpine.LFD.2.00.1004191200050.14500@i5.linux-foundation.org>
* Linus Torvalds <torvalds@linux-foundation.org> wrote:
> On Mon, 19 Apr 2010, Linus Torvalds wrote:
> >
> > Maybe add the #include <linux/sched.h> into gigaset.h, instead of
> > common.c?
>
> This compiled for me, although the only thing I tried was just turning all
> the gigaset options to 'y'. Maybe some other config doesn't work. So I
> committed it as likely to fix things.
I'll check it tomorrow - but i'd expect it to be enough, plus the all-yes
thing is that matters most in practice in any case.
Thanks,
Ingo
^ permalink raw reply
* Re: [PATCH v5] rfs: Receive Flow Steering
From: David Miller @ 2010-04-19 20:09 UTC (permalink / raw)
To: eric.dumazet; +Cc: therbert, netdev
In-Reply-To: <1271520633.16881.4754.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 17 Apr 2010 18:10:33 +0200
> Le vendredi 16 avril 2010 à 23:12 +0200, Eric Dumazet a écrit :
>> My results are on a "tbench 16" on an dual X5570 @ 2.93GHz.
>> (16 logical cpus)
>>
>> No RPS , no RFS : 4448.14 MB/sec
>> RPS : 2298.00 MB/sec (but lot of variation)
>> RFS : 2600 MB/sec
>>
>> Maybe my RFS setup is bad ?
>> (8192 flows)
>>
>
> With attached patch, I reached
>
> Throughput 4465.13 MB/sec 16 procs
>
> RFS better than no RPS/RFS :)
>
> So, the old idea to make rxhash consistent (same value in both
> directions) is a win for some workloads (Consider connection tracking /
> firewalling)
Fun :-) I toyed around with this on my 128 cpu machine (2 NUMA
nodes, 64 cpus each NUMA node).
Vanilla net-next-2.6, no configuration changes:
tbench 64: Throughput 1843.43 MB/sec 64 procs
tbench 128: Throughput 1889.67 MB/sec 128 procs
Vanilla net-next-2.6, rps_cpus="ffffffff,ffffffff,ffffffff,ffffffff"
tbench 64: Throughput 1455.89 MB/sec 64 procs
tbench 128: Throughput 2009.91 MB/sec 128 procs
net-next-2.6 + Eric's port hashing patch, rps_cpus="ffffffff,ffffffff,ffffffff,ffffffff"
tbench 64: Throughput 1593.13 MB/sec 64 procs
tbench 128: Throughput 2367.27 MB/sec 128 procs
^ permalink raw reply
* Re: [PATCH 11/13] bnx2x: Forbid LRO on when XEN is enabled
From: Stephen Hemminger @ 2010-04-19 16:14 UTC (permalink / raw)
To: David Miller; +Cc: bhutchings, vladz, eilong, netdev, dmitry
In-Reply-To: <20100418.205858.193699902.davem@davemloft.net>
On Sun, 18 Apr 2010 20:58:58 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:
> From: Ben Hutchings <bhutchings@solarflare.com>
> Date: Sun, 18 Apr 2010 16:11:25 +0100
>
> > On Sun, 2010-04-18 at 17:50 +0300, Vladislav Zolotarov wrote:
> >> LRO cannot be used on virtualized environment, so it is best
> >> to disable it on compile time in XEN kernel.
> > [...]
> >
> > If you want to cripple your performance, I'm not going to stand in your
> > way, but be aware that most distribution kernels now enable CONFIG_XEN.
>
> There is also zero reason to do this.
>
> When the XEN code or whatever setups up the bridge, LRO will be
> disabled by the bridge code.
>
> It automatically issues ethtool LRO disable commands to the devices
> involved in the bridge configuration. And it has done this for
> a _long_ time. The ipv4 routing code will do the same.
>
> This change is bogus and likely based upon behavior in some ancient
> distribution kernel that lacks the ethtool facilities.
>
> I absolutely refuse to apply this.
Agreed. It is often devices that implement LRO, but don't have way
to turn it off.
^ permalink raw reply
* Re: [PATCH net-next-2.6 0/11] bnx2x: Bug fixes and enhancements
From: David Miller @ 2010-04-19 20:17 UTC (permalink / raw)
To: vladz; +Cc: eilong, netdev
In-Reply-To: <1271675582.6900.265.camel@lb-tlvb-vladz>
From: "Vladislav Zolotarov" <vladz@broadcom.com>
Date: Mon, 19 Apr 2010 14:13:02 +0300
> Resubmitting this patch series with the following changes:
> - patch 2 VPD: using generic infrastructures for VPD access
> - omitting patch 11 (disabling LRO and leaving only GRO on XEN kernel at
> compile time)
> - omitting patch 10: changing the default queues to 1 on 32 bits system.
>
> We are looking into using kmalloc() instead of vmalloc() to overcome the
> issue on 32 bits kernels.
>
> Please consider applying these changes to net-next.
This looks a lot better, applied to net-next-2.6 thanks!
^ permalink raw reply
* Re: [PATCH net-next-2.6] rps: shortcut net_rps_action()
From: David Miller @ 2010-04-19 20:21 UTC (permalink / raw)
To: eric.dumazet; +Cc: xiaosuo, therbert, netdev
In-Reply-To: <1271689653.3845.73.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 19 Apr 2010 17:07:33 +0200
> [PATCH net-next-2.6] rps: shortcut net_rps_action()
Applied, thanks Eric.
It is getting increasingly complicated to follow who enables and
disabled local cpu irqs in these code paths. We could combat
this by adding something like "_irq_enable()" to the function
names.
^ permalink raw reply
* Re: [PATCH v5] rfs: Receive Flow Steering
From: David Miller @ 2010-04-19 20:23 UTC (permalink / raw)
To: eric.dumazet; +Cc: therbert, netdev
In-Reply-To: <20100419.130905.210660275.davem@davemloft.net>
From: David Miller <davem@davemloft.net>
Date: Mon, 19 Apr 2010 13:09:05 -0700 (PDT)
> net-next-2.6 + Eric's port hashing patch, rps_cpus="ffffffff,ffffffff,ffffffff,ffffffff"
>
> tbench 64: Throughput 1593.13 MB/sec 64 procs
> tbench 128: Throughput 2367.27 MB/sec 128 procs
Eric, I think there is agreement that your patch is not a bad idea.
Your original posting had whitespace damange in the patch plus I want
to see a proper commit message and signoff, so could you please submit
this formally?
Thanks!
^ permalink raw reply
* Re: [PATCH v5] rfs: Receive Flow Steering
From: Eric Dumazet @ 2010-04-19 20:32 UTC (permalink / raw)
To: David Miller; +Cc: therbert, netdev
In-Reply-To: <20100419.132318.192086187.davem@davemloft.net>
Le lundi 19 avril 2010 à 13:23 -0700, David Miller a écrit :
> From: David Miller <davem@davemloft.net>
> Date: Mon, 19 Apr 2010 13:09:05 -0700 (PDT)
>
> > net-next-2.6 + Eric's port hashing patch, rps_cpus="ffffffff,ffffffff,ffffffff,ffffffff"
> >
> > tbench 64: Throughput 1593.13 MB/sec 64 procs
> > tbench 128: Throughput 2367.27 MB/sec 128 procs
>
> Eric, I think there is agreement that your patch is not a bad idea.
>
> Your original posting had whitespace damange in the patch plus I want
> to see a proper commit message and signoff, so could you please submit
> this formally?
Hmm, this was not a formal patch, just an information.
Problem is if hardware provides rxhash, will it be "consistent" too ?
^ permalink raw reply
* [PATCH] 8139too: Fix a typo in the function name.
From: Alexander Kuznetsov @ 2010-04-19 20:43 UTC (permalink / raw)
To: davem; +Cc: netdev, Alexander Kuznetsov
Signed-off-by: Alexander Kuznetsov <alr.kuznetsov@gmail.com>
---
drivers/net/8139too.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c
index a03d291..f0d23de 100644
--- a/drivers/net/8139too.c
+++ b/drivers/net/8139too.c
@@ -1944,7 +1944,7 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
netif_dbg(tp, rx_status, dev, "%s() status %04x, size %04x, cur %04x\n",
__func__, rx_status, rx_size, cur_rx);
#if RTL8139_DEBUG > 2
- print_dump_hex(KERN_DEBUG, "Frame contents: ",
+ print_hex_dump(KERN_DEBUG, "Frame contents: ",
DUMP_PREFIX_OFFSET, 16, 1,
&rx_ring[ring_offset], 70, true);
#endif
--
1.6.4.4
^ permalink raw reply related
* Re: tip: origin tree build failure, [patch] fix isdn/gigaset build failure
From: Ingo Molnar @ 2010-04-19 21:01 UTC (permalink / raw)
To: David Miller; +Cc: torvalds, tilman, akpm, netdev, linux-kernel
In-Reply-To: <20100419.120600.82034948.davem@davemloft.net>
* David Miller <davem@davemloft.net> wrote:
> From: Linus Torvalds <torvalds@linux-foundation.org>
> Date: Mon, 19 Apr 2010 12:00:49 -0700 (PDT)
>
> > On Mon, 19 Apr 2010, Linus Torvalds wrote:
> >>
> >> Maybe add the #include <linux/sched.h> into gigaset.h, instead of
> >> common.c?
> >
> > This compiled for me, although the only thing I tried was just turning all
> > the gigaset options to 'y'. Maybe some other config doesn't work. So I
> > committed it as likely to fix things.
>
> Thanks Linus.
>
> Ingo, let us know if there is still some problems in your
> build tests.
I did a few tests and it looks good here!
Thanks,
Ingo
^ permalink raw reply
* Re: [PATCH] gianfar: Wait for both RX and TX to stop
From: Timur Tabi @ 2010-04-19 21:08 UTC (permalink / raw)
To: Andy Fleming; +Cc: davem, netdev
In-Reply-To: <1271632401-2472-1-git-send-email-afleming@freescale.com>
On Sun, Apr 18, 2010 at 6:13 PM, Andy Fleming <afleming@freescale.com> wrote:
> - while (!(gfar_read(®s->ievent) &
> - (IEVENT_GRSC | IEVENT_GTSC)))
> + while ((gfar_read(®s->ievent) &
> + (IEVENT_GRSC | IEVENT_GTSC)) !=
> + (IEVENT_GRSC | IEVENT_GTSC))
> cpu_relax();
How about using spin_event_timeout()? It streamlines this process and
includes a timeout.
The U-Boot version of this code doesn't have a timeout either, but
spin_event_timeout() is not available in U-Boot.
--
Timur Tabi
Linux kernel developer at Freescale
^ permalink raw reply
* Re: [PATCH] 8139too: Fix a typo in the function name.
From: David Miller @ 2010-04-19 21:17 UTC (permalink / raw)
To: alr.kuznetsov; +Cc: netdev
In-Reply-To: <1271709817-11169-1-git-send-email-alr.kuznetsov@gmail.com>
From: Alexander Kuznetsov <alr.kuznetsov@gmail.com>
Date: Mon, 19 Apr 2010 23:43:37 +0300
> Signed-off-by: Alexander Kuznetsov <alr.kuznetsov@gmail.com>
Applied, thank you.
^ permalink raw reply
* Re: [PATCH v5] rfs: Receive Flow Steering
From: David Miller @ 2010-04-19 21:19 UTC (permalink / raw)
To: eric.dumazet; +Cc: therbert, netdev
In-Reply-To: <1271709121.3845.94.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 19 Apr 2010 22:32:01 +0200
> Hmm, this was not a formal patch, just an information.
>
> Problem is if hardware provides rxhash, will it be "consistent" too ?
Yes, it is an issue. I am not aware of whether the Toeplitz
hash computed by cards is impervious to the order of the
input bits of not, probably it is.
I was thinking also about how we could compute rxhash in the
loopback driver :-)
^ permalink raw reply
* [PATCH net-next-2.6] rps: static functions
From: Eric Dumazet @ 2010-04-19 21:26 UTC (permalink / raw)
To: David Miller; +Cc: netdev
store_rps_map() & store_rps_dev_flow_table_cnt() are static.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 143052a..c57c4b2 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -550,7 +550,7 @@ static void rps_map_release(struct rcu_head *rcu)
kfree(map);
}
-ssize_t store_rps_map(struct netdev_rx_queue *queue,
+static ssize_t store_rps_map(struct netdev_rx_queue *queue,
struct rx_queue_attribute *attribute,
const char *buf, size_t len)
{
@@ -635,7 +635,7 @@ static void rps_dev_flow_table_release(struct rcu_head *rcu)
schedule_work(&table->free_work);
}
-ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
+static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
struct rx_queue_attribute *attr,
const char *buf, size_t len)
{
^ permalink raw reply related
* Re: [net-next PATCH 0/2] iovnl netlink ops + enic dynamic vnics
From: Chris Wright @ 2010-04-19 21:35 UTC (permalink / raw)
To: Scott Feldman; +Cc: davem, netdev, chrisw
In-Reply-To: <20100419191425.10423.88005.stgit@savbu-pc100.cisco.com>
* Scott Feldman (scofeldm@cisco.com) wrote:
> Patch 1/2 adds new I/O Virtualization netlink ops:
>
> IOV netlink (IOVNL) adds I/O Virtualization control support to a master
> device (MD) netdev interface. The MD (e.g. SR-IOV PF) will set/get
> control settings on behalf of a slave netdevice (e.g. SR-IOV VF). The
> design allows for the case where master and slave are the
> same netdev interface.
>
> The ops currently defined are:
> set_mac_vlan: set mac+vlan on VF
> set_port_profile: set port-profile on VF
> unset_port_profile: unset port-profile on VF
>
> Patch 2/2 adds IOV netlink ops support to enic dynamic vnics:
>
> Add enic iovnl ops to support setting port-profile for dynamic vnics. Enic
> dynamic vnics are just like normal enic eth vnics except dynamic vnics require
> an extra configuration step to assign a port-profile identifier to the
> interface before the interface is useable. Once assigned, link comes up
> on the interface and is ready for I/O. The port-profile is used to configure
> the network port assigned to the interface. The network port configuration
> includes VLAN membership, QoS policies, and port security settings typical
> of a data center network.
Note that while these just enable enic, the framework should be generic
enough for other drivers and can deliver all the way to userspace daemon
for the case of VSI Discovery Protocol.
thanks,
-chris
^ permalink raw reply
* Re: [PATCH net-next-2.6] rps: static functions
From: David Miller @ 2010-04-19 21:41 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev
In-Reply-To: <1271712395.3845.98.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 19 Apr 2010 23:26:35 +0200
> store_rps_map() & store_rps_dev_flow_table_cnt() are static.
>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Applied, thanks Eric.
^ permalink raw reply
* Re: tip: origin tree build failure, [patch] fix isdn/gigaset build failure
From: Tilman Schmidt @ 2010-04-19 21:52 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Ingo Molnar, David Miller, akpm, netdev, linux-kernel
In-Reply-To: <alpine.LFD.2.00.1004191112550.14500@i5.linux-foundation.org>
[-- Attachment #1: Type: text/plain, Size: 1422 bytes --]
Am 19.04.2010 20:14 schrieb Linus Torvalds:
> Maybe add the #include <linux/sched.h> into gigaset.h, instead of
> common.c?
Yes, that's the correct fix. Thanks a lot!
For the record, the cause of the build failure was my removal of
#include <linux/usb.h> from gigaset.h, entailing the loss of one
indirect inclusion of sched.h. There's another indirect inclusion
of sched.h from gigaset.h via interrupt.h, hardirq.h and
smp_lock.h, but that one only operates if CONFIG_PREEMPT is set.
So the reason I did not see the build failure myself was that I
only tested with CONFIG_PREEMPT=y.
> ---
> drivers/isdn/gigaset/gigaset.h | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h
> index d32efb6..05947f9 100644
> --- a/drivers/isdn/gigaset/gigaset.h
> +++ b/drivers/isdn/gigaset/gigaset.h
> @@ -20,6 +20,7 @@
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> #include <linux/kernel.h>
> +#include <linux/sched.h>
> #include <linux/compiler.h>
> #include <linux/types.h>
> #include <linux/ctype.h>
Acked-by: Tilman Schmidt <tilman@imap.cc>
in case it still matters.
Thanks again,
Tilman
--
Tilman Schmidt E-Mail: tilman@imap.cc
Bonn, Germany
Diese Nachricht besteht zu 100% aus wiederverwerteten Bits.
Ungeöffnet mindestens haltbar bis: (siehe Rückseite)
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply
* Re: [PATCH v3 0/3] e1000e,igb,ixgbe: add registers etc. printout code just before resetting adapters
From: Jeff Kirsher @ 2010-04-19 22:44 UTC (permalink / raw)
To: Taku Izumi
Cc: Bruce Allan, David S. Miller, Jesse Brandeburg, John Ronciak,
netdev@vger.kernel.org, PJ Waskiewicz, Kenji Kaneshige, chavey
In-Reply-To: <4BCC3C9B.3000901@jp.fujitsu.com>
2010/4/19 Taku Izumi <izumi.taku@jp.fujitsu.com>:
> Hi Jeff,
>
> This patchset is the update version of "register etc. printout code" patch.
> The old ones are
> http://kerneltrap.org/mailarchive/linux-netdev/2010/1/7/6265865
> http://kerneltrap.org/mailarchive/linux-netdev/2010/1/22/6267176
>
> v2 -> v3:
> - avoid modifying headers
> - delete "dump_flag" module parameter and use msglvl instead.
>
> To enable the printout, it is necessary to specify msglvl like the following.
> # ethtool -s eth0 msglvl 0x2003
>
> Best regards,
> Taku Izumi
>
Thank you Taku. I have added the series of patches to my queue of
patches destined for net-next.
--
Cheers,
Jeff
^ permalink raw reply
* [PATCH] rndis_host: Poll status channel before control channel
From: Ben Hutchings @ 2010-04-19 23:08 UTC (permalink / raw)
To: David Brownell, David Miller, John Carr
Cc: netdev, Mark Glassberg, Herton Ronaldo Krzesinski
Some RNDIS devices don't respond on the control channel until polled
on the status channel. In particular, this was reported to be the
case for the 2Wire HomePortal 1000SW.
This is roughly based on a patch by John Carr <john.carr@unrouted.co.uk>
which is reported to be needed for use with some Windows Mobile devices
and which is currently applied by Mandriva.
Reported-by: Mark Glassberg <vzeeaxwl@myfairpoint.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Tested-by: Mark Glassberg <vzeeaxwl@myfairpoint.net>
---
Note that this change hasn't yet been tested with any other RNDIS
devices. John, can you confirm whether this also handles the WinMob
devices?
Ben.
drivers/net/usb/rndis_host.c | 18 ++++++++++++------
1 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
index f56dec6..52faca1 100644
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -103,8 +103,10 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg,
int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
{
struct cdc_state *info = (void *) &dev->data;
+ struct usb_cdc_notification notification;
int master_ifnum;
int retval;
+ int partial;
unsigned count;
__le32 rsp;
u32 xid = 0, msg_len, request_id;
@@ -132,13 +134,17 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
if (unlikely(retval < 0 || xid == 0))
return retval;
- // FIXME Seems like some devices discard responses when
- // we time out and cancel our "get response" requests...
- // so, this is fragile. Probably need to poll for status.
+ /* Some devices don't respond on the control channel until
+ * polled on the status channel, so do that first. */
+ retval = usb_interrupt_msg(
+ dev->udev,
+ usb_rcvintpipe(dev->udev, dev->status->desc.bEndpointAddress),
+ ¬ification, sizeof(notification), &partial,
+ RNDIS_CONTROL_TIMEOUT_MS);
+ if (unlikely(retval < 0))
+ return retval;
- /* ignore status endpoint, just poll the control channel;
- * the request probably completed immediately
- */
+ /* Poll the control channel; the request probably completed immediately */
rsp = buf->msg_type | RNDIS_MSG_COMPLETION;
for (count = 0; count < 10; count++) {
memset(buf, 0, CONTROL_BUFFER_SIZE);
--
1.7.0.3
^ permalink raw reply related
* [PATCHv2 1/7] X25: Add if_x25.h and x25 to device identifiers
From: Andrew Hendry @ 2010-04-19 23:28 UTC (permalink / raw)
To: netdev
V2 Feedback from John Hughes.
- Add header for userspace implementations such as xot/xoe to use
- Use explicit values for interface stability
- No changes to driver patches
V1
- Use identifiers instead of magic numbers for X25 layer 3 to device interface.
- Also fixed checkpatch notes on updated code.
Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
---
include/linux/if_x25.h | 26 ++++++++++++++++++++++++++
include/net/x25device.h | 1 +
net/x25/x25_dev.c | 36 ++++++++++++++++++++----------------
3 files changed, 47 insertions(+), 16 deletions(-)
create mode 100644 include/linux/if_x25.h
diff --git a/include/linux/if_x25.h b/include/linux/if_x25.h
new file mode 100644
index 0000000..897765f
--- /dev/null
+++ b/include/linux/if_x25.h
@@ -0,0 +1,26 @@
+/*
+ * Linux X.25 packet to device interface
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _IF_X25_H
+#define _IF_X25_H
+
+#include <linux/types.h>
+
+/* Documentation/networking/x25-iface.txt */
+#define X25_IFACE_DATA 0x00
+#define X25_IFACE_CONNECT 0x01
+#define X25_IFACE_DISCONNECT 0x02
+#define X25_IFACE_PARAMS 0x03
+
+#endif /* _IF_X25_H */
diff --git a/include/net/x25device.h b/include/net/x25device.h
index 1415bcf..1fa08b4 100644
--- a/include/net/x25device.h
+++ b/include/net/x25device.h
@@ -3,6 +3,7 @@
#include <linux/if_ether.h>
#include <linux/if_packet.h>
+#include <linux/if_x25.h>
#include <linux/skbuff.h>
static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev)
diff --git a/net/x25/x25_dev.c b/net/x25/x25_dev.c
index b9ef682..9005f6d 100644
--- a/net/x25/x25_dev.c
+++ b/net/x25/x25_dev.c
@@ -24,6 +24,7 @@
#include <net/sock.h>
#include <linux/if_arp.h>
#include <net/x25.h>
+#include <net/x25device.h>
static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb)
{
@@ -115,19 +116,22 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
}
switch (skb->data[0]) {
- case 0x00:
- skb_pull(skb, 1);
- if (x25_receive_data(skb, nb)) {
- x25_neigh_put(nb);
- goto out;
- }
- break;
- case 0x01:
- x25_link_established(nb);
- break;
- case 0x02:
- x25_link_terminated(nb);
- break;
+
+ case X25_IFACE_DATA:
+ skb_pull(skb, 1);
+ if (x25_receive_data(skb, nb)) {
+ x25_neigh_put(nb);
+ goto out;
+ }
+ break;
+
+ case X25_IFACE_CONNECT:
+ x25_link_established(nb);
+ break;
+
+ case X25_IFACE_DISCONNECT:
+ x25_link_terminated(nb);
+ break;
}
x25_neigh_put(nb);
drop:
@@ -148,7 +152,7 @@ void x25_establish_link(struct x25_neigh *nb)
return;
}
ptr = skb_put(skb, 1);
- *ptr = 0x01;
+ *ptr = X25_IFACE_CONNECT;
break;
#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE)
@@ -184,7 +188,7 @@ void x25_terminate_link(struct x25_neigh *nb)
}
ptr = skb_put(skb, 1);
- *ptr = 0x02;
+ *ptr = X25_IFACE_DISCONNECT;
skb->protocol = htons(ETH_P_X25);
skb->dev = nb->dev;
@@ -200,7 +204,7 @@ void x25_send_frame(struct sk_buff *skb, struct x25_neigh *nb)
switch (nb->dev->type) {
case ARPHRD_X25:
dptr = skb_push(skb, 1);
- *dptr = 0x00;
+ *dptr = X25_IFACE_DATA;
break;
#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE)
--
1.5.6.5
^ permalink raw reply related
* [PATCHv2 2/7] X25: Use identifiers for isdn device to x25 interface
From: Andrew Hendry @ 2010-04-19 23:29 UTC (permalink / raw)
To: netdev, isdn
Change magic numbers to identifiers for X25 interface.
also minor check patch formatting.
Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
Acked-by: Karsten Keil <isdn@linux-pingi.de>
---
drivers/isdn/i4l/isdn_x25iface.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c
index efcf1f9..fd10d7c 100644
--- a/drivers/isdn/i4l/isdn_x25iface.c
+++ b/drivers/isdn/i4l/isdn_x25iface.c
@@ -194,7 +194,7 @@ static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb
if ( ( (ix25_pdata_t*) (cprot->proto_data) )
-> state == WAN_CONNECTED ){
if( skb_push(skb, 1)){
- skb -> data[0]=0x00;
+ skb->data[0] = X25_IFACE_DATA;
skb->protocol = x25_type_trans(skb, cprot->net_dev);
netif_rx(skb);
return 0;
@@ -224,7 +224,7 @@ static int isdn_x25iface_connect_ind(struct concap_proto *cprot)
skb = dev_alloc_skb(1);
if( skb ){
- *( skb_put(skb, 1) ) = 0x01;
+ *(skb_put(skb, 1)) = X25_IFACE_CONNECT;
skb->protocol = x25_type_trans(skb, cprot->net_dev);
netif_rx(skb);
return 0;
@@ -253,7 +253,7 @@ static int isdn_x25iface_disconn_ind(struct concap_proto *cprot)
*state_p = WAN_DISCONNECTED;
skb = dev_alloc_skb(1);
if( skb ){
- *( skb_put(skb, 1) ) = 0x02;
+ *(skb_put(skb, 1)) = X25_IFACE_DISCONNECT;
skb->protocol = x25_type_trans(skb, cprot->net_dev);
netif_rx(skb);
return 0;
@@ -272,9 +272,10 @@ static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
unsigned char firstbyte = skb->data[0];
enum wan_states *state = &((ix25_pdata_t*)cprot->proto_data)->state;
int ret = 0;
- IX25DEBUG( "isdn_x25iface_xmit: %s first=%x state=%d \n", MY_DEVNAME(cprot -> net_dev), firstbyte, *state );
+ IX25DEBUG("isdn_x25iface_xmit: %s first=%x state=%d\n",
+ MY_DEVNAME(cprot->net_dev), firstbyte, *state);
switch ( firstbyte ){
- case 0x00: /* dl_data request */
+ case X25_IFACE_DATA:
if( *state == WAN_CONNECTED ){
skb_pull(skb, 1);
cprot -> net_dev -> trans_start = jiffies;
@@ -285,7 +286,7 @@ static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
}
illegal_state_warn( *state, firstbyte );
break;
- case 0x01: /* dl_connect request */
+ case X25_IFACE_CONNECT:
if( *state == WAN_DISCONNECTED ){
*state = WAN_CONNECTING;
ret = cprot -> dops -> connect_req(cprot);
@@ -298,7 +299,7 @@ static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
illegal_state_warn( *state, firstbyte );
}
break;
- case 0x02: /* dl_disconnect request */
+ case X25_IFACE_DISCONNECT:
switch ( *state ){
case WAN_DISCONNECTED:
/* Should not happen. However, give upper layer a
@@ -318,7 +319,7 @@ static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
illegal_state_warn( *state, firstbyte );
}
break;
- case 0x03: /* changing lapb parameters requested */
+ case X25_IFACE_PARAMS:
printk(KERN_WARNING "isdn_x25iface_xmit: setting of lapb"
" options not yet supported\n");
break;
--
1.5.6.5
^ permalink raw reply related
* [PATCHv2 3/7] X25: Use identifiers for x25 async device to x25 interface
From: Andrew Hendry @ 2010-04-19 23:29 UTC (permalink / raw)
To: netdev
Change magic numbers to identifiers for X25 interface.
Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
---
drivers/net/wan/x25_asy.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c
index 80d5c58..166e77d 100644
--- a/drivers/net/wan/x25_asy.c
+++ b/drivers/net/wan/x25_asy.c
@@ -29,12 +29,12 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
-#include <linux/x25.h>
#include <linux/lapb.h>
#include <linux/init.h>
#include <linux/rtnetlink.h>
#include <linux/compat.h>
#include <linux/slab.h>
+#include <net/x25device.h>
#include "x25_asy.h"
#include <net/x25device.h>
@@ -315,15 +315,15 @@ static netdev_tx_t x25_asy_xmit(struct sk_buff *skb,
}
switch (skb->data[0]) {
- case 0x00:
+ case X25_IFACE_DATA:
break;
- case 0x01: /* Connection request .. do nothing */
+ case X25_IFACE_CONNECT: /* Connection request .. do nothing */
err = lapb_connect_request(dev);
if (err != LAPB_OK)
printk(KERN_ERR "x25_asy: lapb_connect_request error - %d\n", err);
kfree_skb(skb);
return NETDEV_TX_OK;
- case 0x02: /* Disconnect request .. do nothing - hang up ?? */
+ case X25_IFACE_DISCONNECT: /* do nothing - hang up ?? */
err = lapb_disconnect_request(dev);
if (err != LAPB_OK)
printk(KERN_ERR "x25_asy: lapb_disconnect_request error - %d\n", err);
@@ -411,7 +411,7 @@ static void x25_asy_connected(struct net_device *dev, int reason)
}
ptr = skb_put(skb, 1);
- *ptr = 0x01;
+ *ptr = X25_IFACE_CONNECT;
skb->protocol = x25_type_trans(skb, sl->dev);
netif_rx(skb);
@@ -430,7 +430,7 @@ static void x25_asy_disconnected(struct net_device *dev, int reason)
}
ptr = skb_put(skb, 1);
- *ptr = 0x02;
+ *ptr = X25_IFACE_DISCONNECT;
skb->protocol = x25_type_trans(skb, sl->dev);
netif_rx(skb);
--
1.5.6.5
^ permalink raw reply related
* [PATCHv2 7/7] X25: Update X25 interface documentation
From: Andrew Hendry @ 2010-04-19 23:30 UTC (permalink / raw)
To: netdev
Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
---
Documentation/networking/x25-iface.txt | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Documentation/networking/x25-iface.txt b/Documentation/networking/x25-iface.txt
index 975cc87..78f662e 100644
--- a/Documentation/networking/x25-iface.txt
+++ b/Documentation/networking/x25-iface.txt
@@ -20,23 +20,23 @@ the rest of the skbuff, if any more information does exist.
Packet Layer to Device Driver
-----------------------------
-First Byte = 0x00
+First Byte = 0x00 (X25_IFACE_DATA)
This indicates that the rest of the skbuff contains data to be transmitted
over the LAPB link. The LAPB link should already exist before any data is
passed down.
-First Byte = 0x01
+First Byte = 0x01 (X25_IFACE_CONNECT)
Establish the LAPB link. If the link is already established then the connect
confirmation message should be returned as soon as possible.
-First Byte = 0x02
+First Byte = 0x02 (X25_IFACE_DISCONNECT)
Terminate the LAPB link. If it is already disconnected then the disconnect
confirmation message should be returned as soon as possible.
-First Byte = 0x03
+First Byte = 0x03 (X25_IFACE_PARAMS)
LAPB parameters. To be defined.
@@ -44,22 +44,22 @@ LAPB parameters. To be defined.
Device Driver to Packet Layer
-----------------------------
-First Byte = 0x00
+First Byte = 0x00 (X25_IFACE_DATA)
This indicates that the rest of the skbuff contains data that has been
received over the LAPB link.
-First Byte = 0x01
+First Byte = 0x01 (X25_IFACE_CONNECT)
LAPB link has been established. The same message is used for both a LAPB
link connect_confirmation and a connect_indication.
-First Byte = 0x02
+First Byte = 0x02 (X25_IFACE_DISCONNECT)
LAPB link has been terminated. This same message is used for both a LAPB
link disconnect_confirmation and a disconnect_indication.
-First Byte = 0x03
+First Byte = 0x03 (X25_IFACE_PARAMS)
LAPB parameters. To be defined.
--
1.5.6.5
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox