Re: [PATCH 1/3] Rough VJ Channel Implementation - vj_core.patch
From: Kelly Daly <hidden>
Date: 2006-05-04 07:28:43
On Wednesday 26 April 2006 17:59, David S. Miller wrote:
Next, you can't even begin to work on the protocol channels before you
do one very important piece of work. Integration of all of the ipv4
and ipv6 protocol hash tables into a central code, it's a total
prerequisite. Then you modify things to use a generic
inet_{,listen_}lookup() or inet6_{,listen_}lookup() that takes a
protocol number as well as saddr/daddr/sport/dport and searches
from a central table.Back here again ;) Is this on the right track (see patch below)? K _____________________ diff -urp davem_orig/include/net/inet_hashtables.h kelly/include/net/inet_hashtables.h
--- davem_orig/include/net/inet_hashtables.h 2006-04-27 00:08:32.000000000 +1000
+++ kelly/include/net/inet_hashtables.h 2006-05-04 14:28:59.000000000 +1000@@ -418,4 +418,6 @@ static inline struct sock *inet_lookup(s extern int inet_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk); + +extern struct inet_hashinfo *inet_hashes[256]; #endif /* _INET_HASHTABLES_H */
diff -urp davem_orig/include/net/sock.h kelly/include/net/sock.h
--- davem_orig/include/net/sock.h 2006-05-02 13:42:10.000000000 +1000
+++ kelly/include/net/sock.h 2006-05-04 14:28:59.000000000 +1000@@ -196,6 +196,7 @@ struct sock { unsigned short sk_type; int sk_rcvbuf; socket_lock_t sk_lock; + struct netchannel *sk_channel; wait_queue_head_t *sk_sleep; struct dst_entry *sk_dst_cache; struct xfrm_policy *sk_policy[2];
diff -urp davem_orig/net/core/dev.c kelly/net/core/dev.c
--- davem_orig/net/core/dev.c 2006-04-27 15:49:27.000000000 +1000
+++ kelly/net/core/dev.c 2006-05-04 16:58:49.000000000 +1000@@ -116,6 +116,7 @@ #include <net/iw_handler.h> #include <asm/current.h> #include <linux/audit.h> +#include <net/inet_hashtables.h> /* * The list of packet types we will receive (as opposed to discard)
@@ -190,6 +191,8 @@ static inline struct hlist_head *dev_ind return &dev_index_head[ifindex & ((1<<NETDEV_HASHBITS)-1)]; } +static struct netchannel default_netchannel; + /* * Our notifier list */
@@ -1907,6 +1910,37 @@ struct netchannel_buftrailer *__netchann } EXPORT_SYMBOL_GPL(__netchannel_dequeue); + +/* Find the channel for a packet, or return default channel. */ +struct netchannel *find_netchannel(const struct netchannel_buftrailer *np) +{ + struct sock *sk = NULL; + unsigned long dlen = np->netchan_buf_len - np->netchan_buf_offset; + void *data = (void *)np - dlen; + + switch (np->netchan_buf_proto) { + case __constant_htons(ETH_P_IP): { + struct iphdr *ip = data; + int iphl = ip->ihl * 4; + + if (dlen >= (iphl + 4) && iphl == sizeof(struct iphdr)) { + u16 *ports = (u16 *)(ip + 1); + + if (inet_hashes[ip->protocol]) { + sk = inet_lookup(inet_hashes[ip->protocol], + ip->saddr, ports[0], + ip->daddr, ports[1], + np->netchan_buf_dev->ifindex); + } + break; + } + } + } + if (sk && sk->sk_channel) + return sk->sk_channel; + return &default_netchannel; +} + static gifconf_func_t * gifconf_list [NPROTO]; /**
@@ -3421,6 +3455,9 @@ static int __init net_dev_init(void) hotcpu_notifier(dev_cpu_callback, 0); dst_init(); dev_mcast_init(); + + /* FIXME: This should be attached to thread/threads. */ + netchannel_init(&default_netchannel, NULL, NULL); rc = 0; out: return rc;
diff -urp davem_orig/net/ipv4/inet_hashtables.c kelly/net/ipv4/inet_hashtables.c
--- davem_orig/net/ipv4/inet_hashtables.c 2006-04-27 00:08:33.000000000 +1000
+++ kelly/net/ipv4/inet_hashtables.c 2006-05-04 14:28:59.000000000 +1000@@ -337,3 +337,5 @@ out: } EXPORT_SYMBOL_GPL(inet_hash_connect); + +struct inet_hashinfo *inet_hashes[256];
diff -urp davem_orig/net/ipv4/tcp.c kelly/net/ipv4/tcp.c
--- davem_orig/net/ipv4/tcp.c 2006-04-27 00:08:33.000000000 +1000
+++ kelly/net/ipv4/tcp.c 2006-05-04 14:28:59.000000000 +1000@@ -2173,6 +2173,7 @@ void __init tcp_init(void) tcp_hashinfo.ehash_size << 1, tcp_hashinfo.bhash_size); tcp_register_congestion_control(&tcp_reno); + inet_hashes[IPPROTO_TCP] = &tcp_hashinfo; } EXPORT_SYMBOL(tcp_close);