Commit 8ff96da6 authored by David S. Miller's avatar David S. Miller

Merge davem@nuts.davemloft.net:/disk1/BK/net-2.6

into kernel.bkbits.net:/home/davem/net-2.6
parents f465882d 3adb8bfe
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/checksum.h> #include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */ #include <linux/if_ether.h> /* For the statistics structure. */
...@@ -183,6 +184,17 @@ static struct net_device_stats *get_stats(struct net_device *dev) ...@@ -183,6 +184,17 @@ static struct net_device_stats *get_stats(struct net_device *dev)
return stats; return stats;
} }
u32 loopback_get_link(struct net_device *dev)
{
return 1;
}
static struct ethtool_ops loopback_ethtool_ops = {
.get_link = loopback_get_link,
.get_tso = ethtool_op_get_tso,
.set_tso = ethtool_op_set_tso,
};
struct net_device loopback_dev = { struct net_device loopback_dev = {
.name = "lo", .name = "lo",
.mtu = (16 * 1024) + 20 + 20 + 12, .mtu = (16 * 1024) + 20 + 20 + 12,
...@@ -199,6 +211,7 @@ struct net_device loopback_dev = { ...@@ -199,6 +211,7 @@ struct net_device loopback_dev = {
.features = NETIF_F_SG|NETIF_F_FRAGLIST .features = NETIF_F_SG|NETIF_F_FRAGLIST
|NETIF_F_NO_CSUM|NETIF_F_HIGHDMA |NETIF_F_NO_CSUM|NETIF_F_HIGHDMA
|NETIF_F_LLTX, |NETIF_F_LLTX,
.ethtool_ops = &loopback_ethtool_ops,
}; };
/* Setup and register the of the LOOPBACK device. */ /* Setup and register the of the LOOPBACK device. */
......
...@@ -40,9 +40,7 @@ config TULIP ...@@ -40,9 +40,7 @@ config TULIP
(smc9332dst), you can also try the driver for "Generic DECchip" (smc9332dst), you can also try the driver for "Generic DECchip"
cards, above. However, most people with a network card of this type cards, above. However, most people with a network card of this type
will say Y here.) Do read the Ethernet-HOWTO, available from will say Y here.) Do read the Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto>. More specific <http://www.tldp.org/docs.html#howto>.
information is contained in
<file:Documentation/networking/tulip.txt>.
To compile this driver as a module, choose M here and read To compile this driver as a module, choose M here and read
<file:Documentation/networking/net-modules.txt>. The module will <file:Documentation/networking/net-modules.txt>. The module will
......
...@@ -577,6 +577,17 @@ struct rtnl_link_stats ...@@ -577,6 +577,17 @@ struct rtnl_link_stats
__u32 tx_compressed; __u32 tx_compressed;
}; };
/* The struct should be in sync with struct ifmap */
struct rtnl_link_ifmap
{
__u64 mem_start;
__u64 mem_end;
__u64 base_addr;
__u16 irq;
__u8 dma;
__u8 port;
};
enum enum
{ {
IFLA_UNSPEC, IFLA_UNSPEC,
......
...@@ -182,7 +182,7 @@ static int rtnetlink_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, ...@@ -182,7 +182,7 @@ static int rtnetlink_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
} }
if (1) { if (1) {
struct ifmap map = { struct rtnl_link_ifmap map = {
.mem_start = dev->mem_start, .mem_start = dev->mem_start,
.mem_end = dev->mem_end, .mem_end = dev->mem_end,
.base_addr = dev->base_addr, .base_addr = dev->base_addr,
...@@ -277,6 +277,9 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) ...@@ -277,6 +277,9 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
dev_change_flags(dev, ifm->ifi_flags); dev_change_flags(dev, ifm->ifi_flags);
if (ida[IFLA_MAP - 1]) { if (ida[IFLA_MAP - 1]) {
struct rtnl_link_ifmap *u_map;
struct ifmap k_map;
if (!dev->set_config) { if (!dev->set_config) {
err = -EOPNOTSUPP; err = -EOPNOTSUPP;
goto out; goto out;
...@@ -287,11 +290,19 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) ...@@ -287,11 +290,19 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
goto out; goto out;
} }
if (ida[IFLA_MAP - 1]->rta_len != RTA_LENGTH(sizeof(struct ifmap))) if (ida[IFLA_MAP - 1]->rta_len != RTA_LENGTH(sizeof(*u_map)))
goto out; goto out;
err = dev->set_config(dev, (struct ifmap *) u_map = RTA_DATA(ida[IFLA_MAP - 1]);
RTA_DATA(ida[IFLA_MAP - 1]));
k_map.mem_start = (unsigned long) u_map->mem_start;
k_map.mem_end = (unsigned long) u_map->mem_end;
k_map.base_addr = (unsigned short) u_map->base_addr;
k_map.irq = (unsigned char) u_map->irq;
k_map.dma = (unsigned char) u_map->dma;
k_map.port = (unsigned char) u_map->port;
err = dev->set_config(dev, &k_map);
if (err) if (err)
goto out; goto out;
......
...@@ -60,12 +60,8 @@ config IP_MULTIPLE_TABLES ...@@ -60,12 +60,8 @@ config IP_MULTIPLE_TABLES
Normally, a router decides what to do with a received packet based Normally, a router decides what to do with a received packet based
solely on the packet's final destination address. If you say Y here, solely on the packet's final destination address. If you say Y here,
the Linux router will also be able to take the packet's source the Linux router will also be able to take the packet's source
address into account. Furthermore, if you also say Y to "Use TOS address into account. Furthermore, the TOS (Type-Of-Service) field
value as routing key" below, the TOS (Type-Of-Service) field of the of the packet can be used for routing decisions as well.
packet can be used for routing decisions as well. In addition, if
you say Y here and to "Fast network address translation" below,
the router will also be able to modify source and destination
addresses of forwarded packets.
If you are interested in this, please see the preliminary If you are interested in this, please see the preliminary
documentation at <http://www.compendium.com.ar/policy-routing.txt> documentation at <http://www.compendium.com.ar/policy-routing.txt>
......
...@@ -536,7 +536,7 @@ fn_hash_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, ...@@ -536,7 +536,7 @@ fn_hash_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,
* information. * information.
*/ */
fa_orig = fa; fa_orig = fa;
list_for_each_entry(fa, fa->fa_list.prev, fa_list) { list_for_each_entry(fa, fa_orig->fa_list.prev, fa_list) {
if (fa->fa_info->fib_priority != fi->fib_priority) if (fa->fa_info->fib_priority != fi->fib_priority)
break; break;
if (fa->fa_type == type && if (fa->fa_type == type &&
......
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#include <linux/security.h> #include <linux/security.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/scm.h> #include <net/scm.h>
#include <linux/workqueue.h>
#define Nprintk(a...) #define Nprintk(a...)
...@@ -70,14 +69,6 @@ struct netlink_opt ...@@ -70,14 +69,6 @@ struct netlink_opt
#define nlk_sk(__sk) ((struct netlink_opt *)(__sk)->sk_protinfo) #define nlk_sk(__sk) ((struct netlink_opt *)(__sk)->sk_protinfo)
struct netlink_work
{
struct sock *sk;
int len;
struct work_struct work;
};
static struct workqueue_struct *netlink_wq;
static struct hlist_head nl_table[MAX_LINKS]; static struct hlist_head nl_table[MAX_LINKS];
static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait); static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
static unsigned nl_nonroot[MAX_LINKS]; static unsigned nl_nonroot[MAX_LINKS];
...@@ -96,16 +87,6 @@ static atomic_t nl_table_users = ATOMIC_INIT(0); ...@@ -96,16 +87,6 @@ static atomic_t nl_table_users = ATOMIC_INIT(0);
static struct notifier_block *netlink_chain; static struct notifier_block *netlink_chain;
/* netlink workqueue handler */
static void netlink_wq_handler(void *data)
{
struct netlink_work *work = data;
work->sk->sk_data_ready(work->sk, work->len);
sock_put(work->sk);
kfree(work);
}
static void netlink_sock_destruct(struct sock *sk) static void netlink_sock_destruct(struct sock *sk)
{ {
skb_queue_purge(&sk->sk_receive_queue); skb_queue_purge(&sk->sk_receive_queue);
...@@ -497,8 +478,6 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long t ...@@ -497,8 +478,6 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long t
if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||
test_bit(0, &nlk->state)) { test_bit(0, &nlk->state)) {
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
task_t *client;
if (!timeo) { if (!timeo) {
if (!nlk->pid) if (!nlk->pid)
netlink_overrun(sk); netlink_overrun(sk);
...@@ -507,19 +486,6 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long t ...@@ -507,19 +486,6 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long t
return -EAGAIN; return -EAGAIN;
} }
if (nlk->pid) {
/* Kernel is sending information to user space
* and socket buffer is full: Wake up user
* process */
client = find_task_by_pid(nlk->pid);
if (!client) {
sock_put(sk);
kfree_skb(skb);
return -EAGAIN;
}
wake_up_process(client);
}
__set_current_state(TASK_INTERRUPTIBLE); __set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&nlk->wait, &wait); add_wait_queue(&nlk->wait, &wait);
...@@ -559,24 +525,8 @@ int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol) ...@@ -559,24 +525,8 @@ int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol)
#endif #endif
skb_queue_tail(&sk->sk_receive_queue, skb); skb_queue_tail(&sk->sk_receive_queue, skb);
if (!nlk->pid) { sk->sk_data_ready(sk, len);
struct netlink_work *nlwork = sock_put(sk);
kmalloc(sizeof(struct netlink_work), GFP_KERNEL);
if (!nlwork) {
sock_put(sk);
return -EAGAIN;
}
INIT_WORK(&nlwork->work, netlink_wq_handler, nlwork);
nlwork->sk = sk;
nlwork->len = len;
queue_work(netlink_wq, &nlwork->work);
} else {
sk->sk_data_ready(sk, len);
sock_put(sk);
}
return len; return len;
} }
...@@ -623,21 +573,7 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff ...@@ -623,21 +573,7 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff
skb_orphan(skb); skb_orphan(skb);
skb_set_owner_r(skb, sk); skb_set_owner_r(skb, sk);
skb_queue_tail(&sk->sk_receive_queue, skb); skb_queue_tail(&sk->sk_receive_queue, skb);
sk->sk_data_ready(sk, skb->len);
if (!nlk->pid) {
struct netlink_work *nlwork =
kmalloc(sizeof(struct netlink_work), GFP_KERNEL);
if (!nlwork)
return -1;
INIT_WORK(&nlwork->work, netlink_wq_handler, nlwork);
nlwork->sk = sk;
nlwork->len = skb->len;
queue_work(netlink_wq, &nlwork->work);
} else
sk->sk_data_ready(sk, skb->len);
return 0; return 0;
} }
return -1; return -1;
...@@ -683,14 +619,13 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, ...@@ -683,14 +619,13 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
netlink_overrun(sk); netlink_overrun(sk);
/* Clone failed. Notify ALL listeners. */ /* Clone failed. Notify ALL listeners. */
failure = 1; failure = 1;
sock_put(sk);
} else if (netlink_broadcast_deliver(sk, skb2)) { } else if (netlink_broadcast_deliver(sk, skb2)) {
netlink_overrun(sk); netlink_overrun(sk);
sock_put(sk);
} else { } else {
delivered = 1; delivered = 1;
skb2 = NULL; skb2 = NULL;
} }
sock_put(sk);
} }
netlink_unlock_table(); netlink_unlock_table();
...@@ -1267,9 +1202,6 @@ static int __init netlink_proto_init(void) ...@@ -1267,9 +1202,6 @@ static int __init netlink_proto_init(void)
#endif #endif
/* The netlink device handler may be needed early. */ /* The netlink device handler may be needed early. */
rtnetlink_init(); rtnetlink_init();
/* Create a work queue to handle callbacks to modules */
netlink_wq = create_workqueue("netlink");
return 0; return 0;
} }
...@@ -1277,7 +1209,6 @@ static void __exit netlink_proto_exit(void) ...@@ -1277,7 +1209,6 @@ static void __exit netlink_proto_exit(void)
{ {
sock_unregister(PF_NETLINK); sock_unregister(PF_NETLINK);
proc_net_remove("netlink"); proc_net_remove("netlink");
destroy_workqueue(netlink_wq);
} }
core_initcall(netlink_proto_init); core_initcall(netlink_proto_init);
......
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