Date: Fri, 27 Apr 2007 07:09:52 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 118862 for review Message-ID: <200704270709.l3R79qRj083087@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118862 Change 118862 by kmacy@kmacy_vt-x:opentoe_init on 2007/04/27 07:08:55 mechanical BSD-ification of toedev.c Affected files ... .. //depot/projects/opentoe/sys/dev/cxgb/ulp/toecore/toedev.c#2 edit Differences ... ==== //depot/projects/opentoe/sys/dev/cxgb/ulp/toecore/toedev.c#2 (text+ko) ==== @@ -1,24 +1,37 @@ -/* - * TOE device support infrastructure. - * - * Copyright (C) 2003-2006 Chelsio Communications. All rights reserved. - * - * Written by Dimitris Michailidis (dm@chelsio.com) - * - * 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. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + +/************************************************************************** + +Copyright (c) 2007, Chelsio Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Chelsio Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +***************************************************************************/ #include <linux/module.h> #include <linux/string.h> @@ -35,16 +48,16 @@ #include "version.h" #include "toe_bonding.h" -static DECLARE_MUTEX(offload_db_lock); -static LIST_HEAD(offload_dev_list); -static LIST_HEAD(offload_module_list); +static struct mtx offload_db_lock; +static TAILQ_HEAD(, toedev) offload_dev_list; +static TAILQ_HEAD(, tom_info) offload_module_list; /* * Returns the entry in the given table with the given offload id, or NULL * if the id is not found. */ -static const struct offload_id *id_find(unsigned int id, - const struct offload_id *table) +static const struct offload_id * +id_find(unsigned int id, const struct offload_id *table) { for ( ; table->id; ++table) if (table->id == id) @@ -55,7 +68,8 @@ /* * Returns true if an offload device is presently attached to an offload module. */ -static inline int is_attached(const struct toedev *dev) +static inline int +is_attached(const struct toedev *dev) { return dev->offload_mod != NULL; } @@ -66,7 +80,8 @@ * * Must be called with the offload_db_lock held. */ -static int offload_attach(struct toedev *dev) +static int +offload_attach(struct toedev *dev) { struct tom_info *t; @@ -79,7 +94,7 @@ return 0; } } - return -ENOPROTOOPT; + return ENOPROTOOPT; } /** @@ -88,14 +103,14 @@ * * Register a TCP Offload Module (TOM). */ -int register_tom(struct tom_info *t) +int +register_tom(struct tom_info *t) { down(&offload_db_lock); list_add(&t->list_node, &offload_module_list); up(&offload_db_lock); return 0; } -EXPORT_SYMBOL(register_tom); /** * unregister_tom - unregister a TCP Offload Module (TOM) @@ -111,12 +126,12 @@ up(&offload_db_lock); return 0; } -EXPORT_SYMBOL(unregister_tom); /* * Find an offload device by name. Must be called with offload_db_lock held. */ -static struct toedev *__find_offload_dev_by_name(const char *name) +static struct toedev * +__find_offload_dev_by_name(const char *name) { struct toedev *dev; @@ -131,7 +146,8 @@ * Returns true if an offload device is already registered. * Must be called with the offload_db_lock held. */ -static int is_registered(const struct toedev *dev) +static int +is_registered(const struct toedev *dev) { struct toedev *d; @@ -146,7 +162,8 @@ * Finalize the name of an offload device by assigning values to any format * strings in its name. */ -static int assign_name(struct toedev *dev, const char *name, int limit) +static int +assign_name(struct toedev *dev, const char *name, int limit) { int i; @@ -166,14 +183,16 @@ #ifdef CONFIG_PROC_FS #include <linux/proc_fs.h> -static struct proc_dir_entry *offload_proc_root; - +/* + * XXX remove after implementing sysctl equivalent + * + */ static int devices_read_proc(char *buf, char **start, off_t offset, int length, int *eof, void *data) { int len; struct toedev *dev; - struct net_device *ndev; + struct ifnet *ndev; len = sprintf(buf, "Device Offload Module Interfaces\n"); @@ -240,7 +259,7 @@ offload_proc_root = proc_mkdir("net/offload", NULL); if (!offload_proc_root) - return -ENOMEM; + return ENOMEM; offload_proc_root->owner = THIS_MODULE; d = create_proc_read_entry("devices", 0, offload_proc_root, @@ -252,7 +271,7 @@ cleanup: offload_proc_cleanup(); - return -ENOMEM; + return ENOMEM; } #else #define offload_proc_init() 0 @@ -270,7 +289,8 @@ * to it. @name is a template that may contain at most one %d format * specifier. */ -int register_toedev(struct toedev *dev, const char *name) +int +register_toedev(struct toedev *dev, const char *name) { int ret; const char *p; @@ -281,15 +301,15 @@ */ if (!name || !*name || !strcmp(name, ".") || !strcmp(name, "..") || strchr(name, '/')) - return -EINVAL; + return EINVAL; p = strchr(name, '%'); if (p && (p[1] != 'd' || strchr(p + 2, '%'))) - return -EINVAL; + return EINVAL; down(&offload_db_lock); if (is_registered(dev)) { /* device already registered */ - ret = -EEXIST; + ret = EEXIST; goto out; } @@ -303,7 +323,6 @@ up(&offload_db_lock); return ret; } -EXPORT_SYMBOL(register_toedev); /** * unregister_toedev - unregister a TOE device @@ -312,17 +331,18 @@ * Unregister a TOE device. The device must not be attached to an offload * module. */ -int unregister_toedev(struct toedev *dev) +int +unregister_toedev(struct toedev *dev) { int ret = 0; down(&offload_db_lock); if (!is_registered(dev)) { - ret = -ENODEV; + ret = ENODEV; goto out; } if (is_attached(dev)) { - ret = -EBUSY; + ret = EBUSY; goto out; } list_del(&dev->toe_list); @@ -331,7 +351,6 @@ up(&offload_db_lock); return ret; } -EXPORT_SYMBOL(unregister_toedev); /** * activate_offload - activate an offload device @@ -341,57 +360,51 @@ * module. If no module is found the operation fails and may be retried at * a later time. */ -int activate_offload(struct toedev *dev) +int +activate_offload(struct toedev *dev) { int ret = 0; -#ifdef CONFIG_TCP_OFFLOAD_MODULE ret = prepare_tcp_for_offload(); if (ret) return ret; -#endif down(&offload_db_lock); if (!is_registered(dev)) - ret = -ENODEV; + ret = ENODEV; else if (!is_attached(dev)) ret = offload_attach(dev); up(&offload_db_lock); return ret; } -EXPORT_SYMBOL(activate_offload); /** * toe_send - send a packet to a TOE device * @dev: the device * @skb: the packet * - * Sends an sk_buff to a TOE driver after dealing with any active network taps. + * Sends an mbuf to a TOE driver after dealing with any active network taps. */ -int toe_send(struct toedev *dev, struct sk_buff *skb) +int toe_send(struct toedev *dev, struct mbuf *skb) { int r; local_bh_disable(); -#if defined(CONFIG_TCP_OFFLOAD) if (unlikely(netdev_nit)) { /* deal with active taps */ skb->nh.raw = skb->data; if (!skb->dev) skb->dev = dev->lldev; dev_queue_xmit_nit(skb, skb->dev); } -#endif r = dev->send(dev, skb); local_bh_enable(); return r; } -EXPORT_SYMBOL(toe_send); -#if defined(CONFIG_TCP_OFFLOAD) /** * toe_receive_skb - process n received TOE packets * @dev: the toe device - * @skb: an array of offload packets + * @m: an array of offload packets * @n: the number of offload packets * * Process an array of ingress offload packets. Each packet is forwarded @@ -399,30 +412,31 @@ * method. We optimize passing packets to the receive method by passing * it the whole array at once except when there are active taps. */ -int toe_receive_skb(struct toedev *dev, struct sk_buff **skb, int n) +int +toe_receive_skb(struct toedev *dev, struct mbuf **m, int n) { if (likely(!netdev_nit)) - return dev->recv(dev, skb, n); + return dev->recv(dev, m, n); - for ( ; n; n--, skb++) { - skb[0]->dev = dev->lldev; - dev_queue_xmit_nit(skb[0], dev->lldev); - skb[0]->dev = NULL; - dev->recv(dev, skb, 1); + for ( ; n; n--, m++) { + m[0]->dev = dev->lldev; + dev_queue_xmit_nit(m[0], dev->lldev); + m[0]->dev = NULL; + dev->recv(dev, m, 1); } return 0; } -EXPORT_SYMBOL(toe_receive_skb); -#endif -static inline int netdev_is_offload(const struct net_device *dev) +static inline int +netdev_is_offload(const struct ifnet *dev) { return dev->features & NETIF_F_TCPIP_OFFLOAD; } -void toe_neigh_update(struct neighbour *neigh) +void +toe_neigh_update(struct rtentry *neigh) { - struct net_device *dev = neigh->dev; + struct ifnet *dev = neigh->dev; if (dev && netdev_is_offload(dev)) { struct toedev *tdev = TOEDEV(dev); @@ -445,8 +459,9 @@ * considers the decisions of the bonding device given its mode to locate the * correct egress device. */ -struct net_device *offload_get_phys_egress(struct net_device *root_dev, - struct sock *sk, int context) +struct ifnet * +offload_get_phys_egress(struct ifnet *root_dev, + struct socket *so, int context) { while (root_dev && netdev_is_offload(root_dev)) { if (root_dev->priv_flags & IFF_802_1Q_VLAN) @@ -458,15 +473,14 @@ } return root_dev; } -EXPORT_SYMBOL(offload_get_phys_egress); /* * The following few functions define the operations of a virtual offload - * device that is attached to virtual net_devices, such as VLAN or bonding, + * device that is attached to virtual ifnets, such as VLAN or bonding, * to endow them with offload support. These operations simply find the - * next net_device in a stack of net_devices and invoke the same operation on - * the offload device associated with that net_device. Eventually we reach - * the physical net_device at the bottom of the stack, whose associated + * next ifnet in a stack of ifnets and invoke the same operation on + * the offload device associated with that ifnet. Eventually we reach + * the physical ifnet at the bottom of the stack, whose associated * offload device can then complete the operation. */ @@ -474,12 +488,13 @@ * Define a virtual offload device for VLANs that simply forwards offload * operations to the offload device associated with the VLAN device's child. */ -static int virtual_can_offload(struct toedev *tdev, struct sock *sk) +static int +virtual_can_offload(struct toedev *tdev, struct socket *so) { - struct net_device *root_dev = __sk_dst_get(sk)->dev; + struct ifnet *root_dev = __sk_dst_get(sk)->dev; if (root_dev->priv_flags & IFF_802_1Q_VLAN) { - struct net_device *child = VLAN_DEV_INFO(root_dev)->real_dev; + struct ifnet *child = VLAN_DEV_INFO(root_dev)->real_dev; if (netdev_is_offload(child)) { struct toedev *tdev = TOEDEV(child); @@ -492,10 +507,11 @@ return 0; } -static int virtual_connect(struct toedev *dev, struct sock *sk, - struct net_device *egress_dev) +static int +virtual_connect(struct toedev *dev, struct socket *so, + struct ifnet *egress_dev) { - struct net_device *edev = offload_get_phys_egress(egress_dev, sk, + struct ifnet *edev = offload_get_phys_egress(egress_dev, sk, TOE_OPEN); if (edev && netdev_is_offload(edev)) { @@ -505,9 +521,10 @@ return -1; } -static void virtual_neigh_update(struct toedev *dev, struct neighbour *neigh) +static void +virtual_neigh_update(struct toedev *dev, struct rtentry *neigh) { - struct net_device *child = neigh->dev; + struct ifnet *child = neigh->dev; if (neigh->dev->priv_flags & IFF_802_1Q_VLAN) child = VLAN_DEV_INFO(child)->real_dev; @@ -529,13 +546,14 @@ }; /* - * This handler monitors net_device registration and associates virtual offload - * devices with virtual net_devices, such as VLAN and bonding devices. + * This handler monitors ifnet registration and associates virtual offload + * devices with virtual ifnets, such as VLAN and bonding devices. */ -static int virt_dev_notify_handler(struct notifier_block *this, +static int +virt_dev_notify_handler(struct notifier_block *this, unsigned long event, void *data) { - struct net_device *dev = data; + struct ifnet *dev = data; if (event == NETDEV_REGISTER) if (dev->priv_flags & IFF_802_1Q_VLAN) { @@ -557,7 +575,8 @@ * the same TOE device. * */ -int toe_enslave(struct net_device *bond_dev, struct net_device *slave_dev) +int +toe_enslave(struct ifnet *bond_dev, struct ifnet *slave_dev) { struct toedev *tdev; int slave_count; @@ -567,7 +586,7 @@ return 0; if (!is_bmode_supported(bond_dev)) - return -EOPNOTSUPP; + return EOPNOTSUPP; tdev = toe_bond_slave_toedev(bond_dev); slave_count = toe_bond_slavecnt(bond_dev); @@ -581,15 +600,14 @@ /* Mix of TOE enabled and regular devices not supported */ else if (netdev_is_offload(bond_dev) ^ netdev_is_offload(slave_dev)) - ret = -EOPNOTSUPP; + ret = EOPNOTSUPP; /* TOE enabled device belongs to another adapter */ else if (tdev != TOEDEV(slave_dev)) - ret = -EOPNOTSUPP; + ret = EOPNOTSUPP; return ret; } -EXPORT_SYMBOL(toe_enslave); /** * toe_failover - executes failover for offloaded connections @@ -600,7 +618,8 @@ * Called under bond driver locks. */ -void toe_failover(struct net_device *bond_dev, struct net_device *dev, int event) +void +toe_failover(struct ifnet *bond_dev, struct ifnet *dev, int event) { if (netdev_is_offload(bond_dev)) { struct toedev *tdev = toe_bond_slave_toedev(bond_dev); @@ -609,13 +628,13 @@ tdev->failover(tdev, bond_dev, dev, event); } } -EXPORT_SYMBOL(toe_failover); static struct notifier_block virt_dev_notifier = { .notifier_call = virt_dev_notify_handler }; -static int __init offload_init(void) +static int +offload_init(void) { /* We tolerate proc failures */ if (offload_proc_init()) @@ -628,19 +647,11 @@ return 0; } -static void __exit offload_cleanup(void) +static void +offload_cleanup(void) { unregister_netdevice_notifier(&virt_dev_notifier); offload_proc_cleanup(); -#ifdef CONFIG_TCP_OFFLOAD_MODULE restore_tcp_to_nonoffload(); -#endif } -subsys_initcall(offload_init); -module_exit(offload_cleanup); - -MODULE_DESCRIPTION("Support for TCP offload devices"); -MODULE_AUTHOR("Chelsio Communications"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(TOECORE_VERSION);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704270709.l3R79qRj083087>