diff options
Diffstat (limited to 'tools/vnet/vnet-module')
-rw-r--r-- | tools/vnet/vnet-module/Makefile.ver | 27 | ||||
-rw-r--r-- | tools/vnet/vnet-module/esp.c | 16 | ||||
-rw-r--r-- | tools/vnet/vnet-module/etherip.c | 43 | ||||
-rw-r--r-- | tools/vnet/vnet-module/tunnel.c | 7 | ||||
-rw-r--r-- | tools/vnet/vnet-module/tunnel.h | 8 | ||||
-rw-r--r-- | tools/vnet/vnet-module/varp.c | 9 | ||||
-rw-r--r-- | tools/vnet/vnet-module/varp_socket.c | 72 | ||||
-rw-r--r-- | tools/vnet/vnet-module/vif.c | 1 | ||||
-rw-r--r-- | tools/vnet/vnet-module/vnet.c | 13 | ||||
-rw-r--r-- | tools/vnet/vnet-module/vnet_dev.c | 12 | ||||
-rw-r--r-- | tools/vnet/vnet-module/vnet_eval.c | 2 | ||||
-rw-r--r-- | tools/vnet/vnet-module/vnet_forward.c | 1 |
12 files changed, 168 insertions, 43 deletions
diff --git a/tools/vnet/vnet-module/Makefile.ver b/tools/vnet/vnet-module/Makefile.ver index 2529bb9405..2567f9242f 100644 --- a/tools/vnet/vnet-module/Makefile.ver +++ b/tools/vnet/vnet-module/Makefile.ver @@ -18,27 +18,32 @@ # 59 Temple Place, suite 330, Boston, MA 02111-1307 USA #============================================================================ -LINUX_SERIES ?=2.6 -KERNEL_MINOR ?=-xen0 +LINUX_SERIES?=2.6 +KERNEL_MINOR=-xen -LINUX_VERSION ?= $(shell (/bin/ls -ld $(XEN_ROOT)/pristine-linux-$(LINUX_SERIES).* 2>/dev/null) | \ +LINUX_VERSION?=$(shell (/bin/ls -d $(XEN_ROOT)/pristine-linux-$(LINUX_SERIES).* 2>/dev/null) | \ sed -e 's!^.*linux-\(.\+\)!\1!' ) ifeq ($(LINUX_VERSION),) $(error Kernel source for linux $(LINUX_SERIES) not found) endif -KERNEL_VERSION =$(LINUX_VERSION)$(KERNEL_MINOR) +KERNEL_VERSION=$(LINUX_VERSION)$(KERNEL_MINOR) -KERNEL_SRC ?= $(XEN_ROOT)/linux-$(KERNEL_VERSION) +KERNEL_SRC?=$(shell cd $(XEN_ROOT)/linux-$(KERNEL_VERSION) && pwd) + +ifeq ($(KERNEL_SRC),) +$(error Kernel source for kernel $(KERNEL_VERSION) not found) +endif # Get the full kernel release version from its makefile, as the source path # may not have the extraversion, e.g. linux-2.6.12-xen0 may contain release 2.6.12.6-xen0. -KERNEL_RELEASE = $(shell make -s -C $(KERNEL_SRC) kernelrelease || \ - make -f $(shell pwd)/Makefile.kver -s -C $(KERNEL_SRC) kernelrelease ) +KERNEL_RELEASE=$(shell make -s -C $(KERNEL_SRC) kernelrelease) -KERNEL_MODULE_DIR = /lib/modules/$(KERNEL_RELEASE)/kernel +KERNEL_MODULE_DIR=/lib/modules/$$(KERNEL_RELEASE)/kernel -$(warning KERNEL_SRC $(KERNEL_SRC)) -#$(warning KERNEL_VERSION $(KERNEL_VERSION)) -$(warning KERNEL_RELEASE $(KERNEL_RELEASE)) +$(warning KERNEL_SRC $(KERNEL_SRC)) +$(warning LINUX_VERSION $(LINUX_VERSION)) +$(warning KERNEL_VERSION $(KERNEL_VERSION)) +$(warning KERNEL_RELEASE $(KERNEL_RELEASE)) +$(warning KERNEL_ MODULE_DIR $(KERNEL_MODULE_DIR)) diff --git a/tools/vnet/vnet-module/esp.c b/tools/vnet/vnet-module/esp.c index 29449faa6b..f18d1b1523 100644 --- a/tools/vnet/vnet-module/esp.c +++ b/tools/vnet/vnet-module/esp.c @@ -104,7 +104,7 @@ void __exit esp_module_exit(void){ * @param block size to round to a multiple of * @return rounded value */ -static inline int roundup(int n, int block){ +static inline int roundupto(int n, int block){ if(block <= 1) return n; block--; return (n + block) & ~block; @@ -312,9 +312,9 @@ static int esp_sa_send(SAState *sa, struct sk_buff *skb, Tunnel *tunnel){ // header and IP header. plaintext_n = skb->len - ETH_HLEN - ip_n; // Add size of padding fields. - ciphertext_n = roundup(plaintext_n + ESP_PAD_N, esp->cipher.block_n); + ciphertext_n = roundupto(plaintext_n + ESP_PAD_N, esp->cipher.block_n); if(esp->cipher.pad_n > 0){ - ciphertext_n = roundup(ciphertext_n, esp->cipher.pad_n); + ciphertext_n = roundupto(ciphertext_n, esp->cipher.pad_n); } extra_n = ciphertext_n - plaintext_n; iv_n = esp->cipher.iv_n; @@ -502,9 +502,9 @@ static u32 esp_sa_size(SAState *sa, int data_n){ // Have to add some padding for alignment even if pad_n is zero. ESPState *esp = sa->data; - data_n = roundup(data_n + ESP_PAD_N, esp->cipher.block_n); + data_n = roundupto(data_n + ESP_PAD_N, esp->cipher.block_n); if(esp->cipher.pad_n > 0){ - data_n = roundup(data_n, esp->cipher.pad_n); + data_n = roundupto(data_n, esp->cipher.pad_n); } data_n += esp->digest.icv_n; //data_n += esp->cipher.iv_n; @@ -607,7 +607,7 @@ static int esp_cipher_init(SAState *sa, ESPState *esp){ err = -EINVAL; goto exit; } - esp->cipher.key_n = roundup(sa->cipher.bits, 8); + esp->cipher.key_n = roundupto(sa->cipher.bits, 8); // If cipher is null must use ECB because CBC algo does not support blocksize 1. if(strcmp(sa->cipher.name, "cipher_null")){ cipher_mode = CRYPTO_TFM_MODE_ECB; @@ -617,7 +617,7 @@ static int esp_cipher_init(SAState *sa, ESPState *esp){ err = -ENOMEM; goto exit; } - esp->cipher.block_n = roundup(crypto_tfm_alg_blocksize(esp->cipher.tfm), 4); + esp->cipher.block_n = roundupto(crypto_tfm_alg_blocksize(esp->cipher.tfm), 4); esp->cipher.iv_n = crypto_tfm_alg_ivsize(esp->cipher.tfm); esp->cipher.pad_n = 0; if(esp->cipher.iv_n){ @@ -643,7 +643,7 @@ static int esp_digest_init(SAState *sa, ESPState *esp){ dprintf(">\n"); esp->digest.key = sa->digest.key; - esp->digest.key_n = bits_to_bytes(roundup(sa->digest.bits, 8)); + esp->digest.key_n = bits_to_bytes(roundupto(sa->digest.bits, 8)); esp->digest.tfm = crypto_alloc_tfm(sa->digest.name, 0); if(!esp->digest.tfm){ err = -ENOMEM; diff --git a/tools/vnet/vnet-module/etherip.c b/tools/vnet/vnet-module/etherip.c index 2548d1a80a..3e531c7fbe 100644 --- a/tools/vnet/vnet-module/etherip.c +++ b/tools/vnet/vnet-module/etherip.c @@ -128,9 +128,27 @@ static void etherip_tunnel_close(Tunnel *tunnel){ } +static inline int skb_make_headroom(struct sk_buff **pskb, struct sk_buff *skb, int head_n){ + int err = 0; + dprintf("> skb=%p headroom=%d head_n=%d\n", skb, skb_headroom(skb), head_n); + if(head_n > skb_headroom(skb) || skb_cloned(skb) || skb_shared(skb)){ + // Expand header the way GRE does. + struct sk_buff *new_skb = skb_realloc_headroom(skb, head_n + 16); + if(!new_skb){ + err = -ENOMEM; + goto exit; + } + kfree_skb(skb); + *pskb = new_skb; + } else { + *pskb = skb; + } + exit: + return err; +} + /** Send a packet via an etherip tunnel. - * Adds etherip header, new ip header, new ethernet header around - * ethernet frame. + * Adds etherip header and new ip header around ethernet frame. * * @param tunnel tunnel * @param skb packet @@ -150,7 +168,7 @@ static int etherip_tunnel_send(Tunnel *tunnel, struct sk_buff *skb){ if(etherip_in_udp){ head_n += vnet_n + udp_n; } - err = skb_make_room(&skb, skb, head_n, 0); + err = skb_make_headroom(&skb, skb, head_n); if(err) goto exit; // Null the pointer as we are pushing a new IP header. @@ -219,6 +237,20 @@ int etherip_tunnel_create(VnetId *vnet, VarpAddr *addr, Tunnel *base, Tunnel **t return Tunnel_create(etherip_tunnel_type, vnet, addr, base, tunnel); } +#if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER) +/** We need our own copy of this as it is no longer exported from the bridge module. + */ +static inline void _nf_bridge_save_header(struct sk_buff *skb){ + int header_size = 16; + + // Were using this modified to use h_proto instead of skb->protocol. + if(skb->protocol == htons(ETH_P_8021Q)){ + header_size = 18; + } + memcpy(skb->nf_bridge->data, skb->data - header_size, header_size); +} +#endif + /** Do etherip receive processing. * Strips the etherip header to extract the ethernet frame, sets * the vnet from the header and re-receives the frame. @@ -320,10 +352,9 @@ int etherip_protocol_recv(struct sk_buff *skb){ skb->dst = NULL; nf_reset(skb); #ifdef CONFIG_BRIDGE_NETFILTER - // Stop the eth header being clobbered by nf_bridge_maybe_copy_header(). - // Were using this modified to use h_proto instead of skb->protocol. if(skb->nf_bridge){ - nf_bridge_save_header(skb); + // Stop the eth header being clobbered by nf_bridge_maybe_copy_header(). + _nf_bridge_save_header(skb); } #endif #endif // __KERNEL__ diff --git a/tools/vnet/vnet-module/tunnel.c b/tools/vnet/vnet-module/tunnel.c index 49b8cdce48..3403e3dcde 100644 --- a/tools/vnet/vnet-module/tunnel.c +++ b/tools/vnet/vnet-module/tunnel.c @@ -51,6 +51,12 @@ rwlock_t tunnel_table_lock = RW_LOCK_UNLOCKED; #define tunnel_write_lock(flags) write_lock_irqsave(&tunnel_table_lock, (flags)) #define tunnel_write_unlock(flags) write_unlock_irqrestore(&tunnel_table_lock, (flags)) +void Tunnel_free(Tunnel *tunnel){ + tunnel->type->close(tunnel); + Tunnel_decref(tunnel->base); + kfree(tunnel); +} + void Tunnel_print(Tunnel *tunnel){ if(tunnel){ iprintf("Tunnel<%p base=%p ref=%02d type=%s>\n", @@ -136,6 +142,7 @@ int Tunnel_init(void){ goto exit; } tunnel_table->entry_free_fn = tunnel_table_entry_free_fn; + tunnel_table->key_size = sizeof(TunnelKey); tunnel_table->key_hash_fn = tunnel_table_key_hash_fn; tunnel_table->key_equal_fn = tunnel_table_key_equal_fn; exit: diff --git a/tools/vnet/vnet-module/tunnel.h b/tools/vnet/vnet-module/tunnel.h index 23c72027c4..c363eca51a 100644 --- a/tools/vnet/vnet-module/tunnel.h +++ b/tools/vnet/vnet-module/tunnel.h @@ -70,6 +70,8 @@ typedef struct Tunnel { struct Tunnel *base; } Tunnel; +extern void Tunnel_free(struct Tunnel *tunnel); + /** Decrement the reference count, freeing if zero. * * @param tunnel tunnel (may be null) @@ -77,9 +79,7 @@ typedef struct Tunnel { static inline void Tunnel_decref(struct Tunnel *tunnel){ if(!tunnel) return; if(atomic_dec_and_test(&tunnel->refcount)){ - tunnel->type->close(tunnel); - Tunnel_decref(tunnel->base); - kfree(tunnel); + Tunnel_free(tunnel); } } @@ -87,7 +87,7 @@ static inline void Tunnel_decref(struct Tunnel *tunnel){ * * @param tunnel tunnel (may be null) */ -static inline void Tunnel_incref(Tunnel *tunnel){ +static inline void Tunnel_incref(struct Tunnel *tunnel){ if(!tunnel) return; atomic_inc(&tunnel->refcount); } diff --git a/tools/vnet/vnet-module/varp.c b/tools/vnet/vnet-module/varp.c index c1d2c63237..94c2f7569b 100644 --- a/tools/vnet/vnet-module/varp.c +++ b/tools/vnet/vnet-module/varp.c @@ -849,6 +849,7 @@ VarpTable * VarpTable_new(void){ if(!vtable) goto exit; vtable->table = HashTable_new(VARP_TABLE_BUCKETS); if(!vtable->table) goto exit; + vtable->table->key_size = sizeof(VarpKey); vtable->table->key_equal_fn = varp_key_equal_fn; vtable->table->key_hash_fn = varp_key_hash_fn; vtable->table->entry_free_fn = varp_entry_free_fn; @@ -1529,8 +1530,12 @@ void varp_exit(void){ dprintf("<\n"); } +#ifdef MODULE_PARM MODULE_PARM(varp_mcaddr, "s"); -MODULE_PARM_DESC(varp_mcaddr, "VARP multicast address"); - MODULE_PARM(varp_device, "s"); +#else +module_param(varp_mcaddr, charp, 0644); +module_param(varp_device, charp, 0644); +#endif +MODULE_PARM_DESC(varp_mcaddr, "VARP multicast address"); MODULE_PARM_DESC(varp_device, "VARP network device"); diff --git a/tools/vnet/vnet-module/varp_socket.c b/tools/vnet/vnet-module/varp_socket.c index 7ad14a37f2..7b2ef9f938 100644 --- a/tools/vnet/vnet-module/varp_socket.c +++ b/tools/vnet/vnet-module/varp_socket.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com> + * Copyright (C) 2004, 2005, 2006 Mike Wray <mike.wray@hp.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 @@ -36,7 +36,7 @@ /* Get macros needed to define system calls as functions in the kernel. */ #define __KERNEL_SYSCALLS__ -static int errno; +int errno=0; #include <linux/unistd.h> #define MODULE_NAME "VARP" @@ -73,8 +73,14 @@ static inline _syscall3(int, fcntl, /* Replicate the user-space socket API. * The parts we need anyway. + * + * Some architectures use socketcall() to multiplex the socket-related calls, + * but others define individual syscalls instead. + * Architectures using socketcall() define __ARCH_WANT_SYS_SOCKETCALL. */ +#ifdef __ARCH_WANT_SYS_SOCKETCALL + /* Define the socketcall() syscall. * Multiplexes all the socket-related calls. * @@ -180,6 +186,66 @@ int getsockname(int fd, struct sockaddr *usockaddr, int *usockaddr_len){ return socketcall(SYS_GETSOCKNAME, args); } +#else /* !__ARCH_WANT_SYS_SOCKETCALL */ + +/* No socketcall - define the individual syscalls. */ + +static inline _syscall3(int, socket, + int, family, + int, type, + int, protocol); + +static inline _syscall3(int, bind, + int, fd, + struct sockaddr *, umyaddr, + int, addrlen); + +static inline _syscall3(int, connect, + int, fd, + struct sockaddr *, uservaddr, + int, addrlen); + +static inline _syscall6(int, sendto, + int, fd, + void *, buff, + size_t, len, + unsigned, flags, + struct sockaddr *, addr, + int, addr_len); + +static inline _syscall6(int, recvfrom, + int, fd, + void *, ubuf, + size_t, size, + unsigned, flags, + struct sockaddr *, addr, + int *, addr_len); + +static inline _syscall5(int, setsockopt, + int, fd, + int, level, + int, optname, + void *, optval, + int, optlen); + +static inline _syscall5(int, getsockopt, + int, fd, + int, level, + int, optname, + void *, optval, + int *, optlen); + +static inline _syscall2(int, shutdown, + int, fd, + int, how); + +static inline _syscall3(int, getsockname, + int, fd, + struct sockaddr *, usockaddr, + int *, usockaddr_len); + +#endif /* __ARCH_WANT_SYS_SOCKETCALL */ + /*============================================================================*/ /** Socket flags. */ enum VsockFlag { @@ -418,9 +484,7 @@ int varp_ucast_open(uint32_t addr, u16 port, int *val){ * an error. */ static int handle_varp_skb(struct sk_buff *skb){ - static int count = 0; int err = 0; - count++; switch(skb->pkt_type){ case PACKET_BROADCAST: case PACKET_MULTICAST: diff --git a/tools/vnet/vnet-module/vif.c b/tools/vnet/vnet-module/vif.c index 25c1eec292..1175f01196 100644 --- a/tools/vnet/vnet-module/vif.c +++ b/tools/vnet/vnet-module/vif.c @@ -366,6 +366,7 @@ int vif_init(void){ goto exit; } vif_table->entry_free_fn = vif_entry_free_fn; + vif_table->key_size = sizeof(VifKey); vif_table->key_hash_fn = vif_key_hash_fn; vif_table->key_equal_fn = vif_key_equal_fn; diff --git a/tools/vnet/vnet-module/vnet.c b/tools/vnet/vnet-module/vnet.c index c1359ab9f9..23855d5399 100644 --- a/tools/vnet/vnet-module/vnet.c +++ b/tools/vnet/vnet-module/vnet.c @@ -318,6 +318,7 @@ int vnet_table_init(void){ err = -ENOMEM; goto exit; } + vnet_table->key_size = sizeof(VnetId); vnet_table->key_equal_fn = vnet_key_equal_fn; vnet_table->key_hash_fn = vnet_key_hash_fn; vnet_table->entry_free_fn = vnet_entry_free_fn; @@ -431,14 +432,14 @@ inline int _skb_xmit(struct sk_buff *skb, uint32_t saddr){ ip_send_check(skb->nh.iph); - if(1){ +#if 1 // Output to skb destination. Will use ip_output(), which fragments. // Slightly slower than neigh_compat_output() (marginal - 1%). err = dst_output(skb); - } else { +#else // Sends direct to device via dev_queue_xmit(). No fragmentation? err = neigh_compat_output(skb); - } +#endif #if 0 if(needs_frags){ @@ -447,6 +448,7 @@ inline int _skb_xmit(struct sk_buff *skb, uint32_t saddr){ err = ip_finish_output(skb); } #endif + exit: dprintf("< err=%d\n", err); return err; @@ -691,7 +693,12 @@ module_init(vnet_module_init); module_exit(vnet_module_exit); MODULE_LICENSE("GPL"); +#ifdef MODULE_PARM MODULE_PARM(vnet_encaps, "s"); +#else +module_param(vnet_encaps, charp, 0644); +#endif + MODULE_PARM_DESC(vnet_encaps, "Vnet encapsulation: etherip or udp."); #endif diff --git a/tools/vnet/vnet-module/vnet_dev.c b/tools/vnet/vnet-module/vnet_dev.c index fbfd3e0bf6..6f79efdb5f 100644 --- a/tools/vnet/vnet-module/vnet_dev.c +++ b/tools/vnet/vnet-module/vnet_dev.c @@ -49,8 +49,12 @@ #undef DEBUG #include "debug.h" -#ifndef CONFIG_BRIDGE -#warning Should configure ethernet bridging in kernel Network Options +#if !defined(CONFIG_BRIDGE) && !defined(CONFIG_BRIDGE_MODULE) +#warning Should configure Ethernet Bridging in kernel Network Options +#endif + +#ifndef CONFIG_BRIDGE_NETFILTER +#warning Should configure CONFIG_BRIDGE_NETFILTER in kernel #endif static void vnet_dev_destructor(struct net_device *dev){ @@ -254,7 +258,7 @@ static int vnet_dev_setup(Vnet *vnet, struct net_device *dev){ return err; } -static inline int roundup(int n, int k){ +static inline int roundupto(int n, int k){ return k * ((n + k - 1) / k); } @@ -275,7 +279,7 @@ int vnet_dev_add(Vnet *vnet){ vnet->header_n += sizeof(struct VnetMsgHdr); vnet->header_n += sizeof(struct udphdr); } - vnet->header_n = roundup(vnet->header_n, 4); + vnet->header_n = roundupto(vnet->header_n, 4); dev = alloc_netdev(0, vnet->device, vnet_dev_init); if(!dev){ err = -ENOMEM; diff --git a/tools/vnet/vnet-module/vnet_eval.c b/tools/vnet/vnet-module/vnet_eval.c index fda0ac847d..d0d8902e5f 100644 --- a/tools/vnet/vnet-module/vnet_eval.c +++ b/tools/vnet/vnet-module/vnet_eval.c @@ -188,7 +188,7 @@ int eval_vnet_add(Sxpr exp, IOStream *out, void *data){ if(err) goto exit; child_string(exp, ovnetif, &device); if(!device){ - snprintf(dev, IFNAMSIZ-1, "vnif%04x", ntohs(vnet.u.vnet16[7])); + snprintf(dev, IFNAMSIZ-1, "vnif%04x", ntohs(vnet.u.vnet16[VNETID_SIZE16 - 1])); device = dev; } csecurity = sxpr_child_value(exp, osecurity, intern("none")); diff --git a/tools/vnet/vnet-module/vnet_forward.c b/tools/vnet/vnet-module/vnet_forward.c index 43b857e069..2064d7890d 100644 --- a/tools/vnet/vnet-module/vnet_forward.c +++ b/tools/vnet/vnet-module/vnet_forward.c @@ -370,6 +370,7 @@ int vnet_forward_init(void){ err = -ENOMEM; goto exit; } + vnet_peer_table->key_size = sizeof(struct VarpAddr); vnet_peer_table->key_equal_fn = peer_key_equal_fn; vnet_peer_table->key_hash_fn = peer_key_hash_fn; vnet_peer_table->entry_free_fn = peer_entry_free_fn; |