## Automatically generated incremental diff ## From: linux-2.5.66-bk6 ## To: linux-2.5.66-bk7 ## Robot: $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $ diff -urN linux-2.5.66-bk6/Makefile linux-2.5.66-bk7/Makefile --- linux-2.5.66-bk6/Makefile Tue Apr 1 04:40:30 2003 +++ linux-2.5.66-bk7/Makefile Tue Apr 1 04:40:39 2003 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 5 SUBLEVEL = 66 -EXTRAVERSION = -bk6 +EXTRAVERSION = -bk7 # *DOCUMENTATION* # To see a list of typical targets execute "make help" diff -urN linux-2.5.66-bk6/arch/i386/boot/setup.S linux-2.5.66-bk7/arch/i386/boot/setup.S --- linux-2.5.66-bk6/arch/i386/boot/setup.S Mon Mar 24 14:00:45 2003 +++ linux-2.5.66-bk7/arch/i386/boot/setup.S Tue Apr 1 04:40:39 2003 @@ -162,7 +162,7 @@ # can be located anywhere in # low memory 0x10000 or higher. -ramdisk_max: .long __MAXMEM-1 # (Header version 0x0203 or later) +ramdisk_max: .long MAXMEM-1 # (Header version 0x0203 or later) # The highest safe address for # the contents of an initrd diff -urN linux-2.5.66-bk6/arch/i386/boot98/setup.S linux-2.5.66-bk7/arch/i386/boot98/setup.S --- linux-2.5.66-bk6/arch/i386/boot98/setup.S Mon Mar 24 14:00:00 2003 +++ linux-2.5.66-bk7/arch/i386/boot98/setup.S Tue Apr 1 04:40:39 2003 @@ -169,7 +169,7 @@ # can be located anywhere in # low memory 0x10000 or higher. -ramdisk_max: .long __MAXMEM-1 # (Header version 0x0203 or later) +ramdisk_max: .long MAXMEM-1 # (Header version 0x0203 or later) # The highest safe address for # the contents of an initrd diff -urN linux-2.5.66-bk6/arch/i386/kernel/vm86.c linux-2.5.66-bk7/arch/i386/kernel/vm86.c --- linux-2.5.66-bk6/arch/i386/kernel/vm86.c Mon Mar 24 14:00:00 2003 +++ linux-2.5.66-bk7/arch/i386/kernel/vm86.c Tue Apr 1 04:40:39 2003 @@ -289,9 +289,10 @@ asm volatile("movl %%fs,%0":"=m" (tsk->thread.saved_fs)); asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs)); - tss = init_tss + smp_processor_id(); + tss = init_tss + get_cpu(); tss->esp0 = tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0; disable_sysenter(tss); + put_cpu(); tsk->thread.screen_bitmap = info->screen_bitmap; if (info->flags & VM86_SCREEN_BITMAP) diff -urN linux-2.5.66-bk6/arch/sparc64/defconfig linux-2.5.66-bk7/arch/sparc64/defconfig --- linux-2.5.66-bk6/arch/sparc64/defconfig Mon Mar 24 14:00:15 2003 +++ linux-2.5.66-bk7/arch/sparc64/defconfig Tue Apr 1 04:40:40 2003 @@ -41,6 +41,7 @@ CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_TABLE=y CONFIG_US3_FREQ=m +CONFIG_US2E_FREQ=m CONFIG_CPU_FREQ_PROC_INTF=y CONFIG_CPU_FREQ_GOV_USERSPACE=m # CONFIG_CPU_FREQ_24_API is not set @@ -361,11 +362,11 @@ # CONFIG_SYN_COOKIES is not set CONFIG_INET_AH=y CONFIG_INET_ESP=y -CONFIG_XFRM_USER=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m +CONFIG_XFRM_USER=m # # SCTP Configuration (EXPERIMENTAL) diff -urN linux-2.5.66-bk6/arch/sparc64/kernel/irq.c linux-2.5.66-bk7/arch/sparc64/kernel/irq.c --- linux-2.5.66-bk6/arch/sparc64/kernel/irq.c Mon Mar 24 14:01:27 2003 +++ linux-2.5.66-bk7/arch/sparc64/kernel/irq.c Tue Apr 1 04:40:40 2003 @@ -356,7 +356,7 @@ } if (action == NULL) action = (struct irqaction *)kmalloc(sizeof(struct irqaction), - GFP_KERNEL); + GFP_ATOMIC); if (!action) { spin_unlock_irqrestore(&irq_action_lock, flags); @@ -376,7 +376,7 @@ goto free_and_ebusy; } if ((bucket->flags & IBF_MULTI) == 0) { - vector = kmalloc(sizeof(void *) * 4, GFP_KERNEL); + vector = kmalloc(sizeof(void *) * 4, GFP_ATOMIC); if (vector == NULL) goto free_and_enomem; @@ -900,7 +900,7 @@ } if (action == NULL) action = (struct irqaction *)kmalloc(sizeof(struct irqaction), - GFP_KERNEL); + GFP_ATOMIC); if (!action) { spin_unlock_irqrestore(&irq_action_lock, flags); return -ENOMEM; diff -urN linux-2.5.66-bk6/arch/sparc64/kernel/pci.c linux-2.5.66-bk7/arch/sparc64/kernel/pci.c --- linux-2.5.66-bk6/arch/sparc64/kernel/pci.c Mon Mar 24 13:59:46 2003 +++ linux-2.5.66-bk7/arch/sparc64/kernel/pci.c Tue Apr 1 04:40:40 2003 @@ -470,6 +470,54 @@ return err; } +/* Sort resources by alignment */ +void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) +{ + int i; + + for (i = 0; i < PCI_NUM_RESOURCES; i++) { + struct resource *r; + struct resource_list *list, *tmp; + unsigned long r_align; + + r = &dev->resource[i]; + r_align = r->end - r->start; + + if (!(r->flags) || r->parent) + continue; + if (!r_align) { + printk(KERN_WARNING "PCI: Ignore bogus resource %d " + "[%lx:%lx] of %s\n", + i, r->start, r->end, dev->dev.name); + continue; + } + r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; + for (list = head; ; list = list->next) { + unsigned long align = 0; + struct resource_list *ln = list->next; + int idx; + + if (ln) { + idx = ln->res - &ln->dev->resource[0]; + align = (idx < PCI_BRIDGE_RESOURCES) ? + ln->res->end - ln->res->start + 1 : + ln->res->start; + } + if (r_align > align) { + tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); + if (!tmp) + panic("pdev_sort_resources(): " + "kmalloc() failed!\n"); + tmp->next = ln; + tmp->res = r; + tmp->dev = dev; + list->next = tmp; + break; + } + } + } +} + void pcibios_update_irq(struct pci_dev *pdev, int irq) { } @@ -484,6 +532,44 @@ return 0; } +void pcibios_resource_to_bus(struct pci_dev *pdev, struct pci_bus_region *region, + struct resource *res) +{ + struct pci_pbm_info *pbm = pci_bus2pbm[pdev->bus->number]; + struct resource zero_res, *root; + + zero_res.start = 0; + zero_res.end = 0; + zero_res.flags = res->flags; + + if (res->flags & IORESOURCE_IO) + root = &pbm->io_space; + else + root = &pbm->mem_space; + + pbm->parent->resource_adjust(pdev, &zero_res, root); + + region->start = res->start - zero_res.start; + region->end = res->end - zero_res.start; +} + +void pcibios_bus_to_resource(struct pci_dev *pdev, struct resource *res, + struct pci_bus_region *region) +{ + struct pci_pbm_info *pbm = pci_bus2pbm[pdev->bus->number]; + struct resource *root; + + res->start = region->start; + res->end = region->end; + + if (res->flags & IORESOURCE_IO) + root = &pbm->io_space; + else + root = &pbm->mem_space; + + pbm->parent->resource_adjust(pdev, res, root); +} + char * __init pcibios_setup(char *str) { if (!strcmp(str, "onboardfirst")) { diff -urN linux-2.5.66-bk6/arch/sparc64/kernel/pci_iommu.c linux-2.5.66-bk7/arch/sparc64/kernel/pci_iommu.c --- linux-2.5.66-bk6/arch/sparc64/kernel/pci_iommu.c Mon Mar 24 14:00:03 2003 +++ linux-2.5.66-bk7/arch/sparc64/kernel/pci_iommu.c Tue Apr 1 04:40:40 2003 @@ -784,6 +784,26 @@ spin_unlock_irqrestore(&iommu->lock, flags); } +static void ali_sound_dma_hack(struct pci_dev *pdev, int set_bit) +{ + struct pci_dev *ali_isa_bridge; + u8 val; + + /* ALI sound chips generate 31-bits of DMA, a special register + * determines what bit 31 is emitted as. + */ + ali_isa_bridge = pci_find_device(PCI_VENDOR_ID_AL, + PCI_DEVICE_ID_AL_M1533, + NULL); + + pci_read_config_byte(ali_isa_bridge, 0x7e, &val); + if (set_bit) + val |= 0x01; + else + val &= ~0x01; + pci_write_config_byte(ali_isa_bridge, 0x7e, val); +} + int pci_dma_supported(struct pci_dev *pdev, u64 device_mask) { struct pcidev_cookie *pcp = pdev->sysdata; @@ -795,6 +815,14 @@ struct pci_iommu *iommu = pcp->pbm->iommu; dma_addr_mask = iommu->dma_addr_mask; + + if (pdev->vendor == PCI_VENDOR_ID_AL && + pdev->device == PCI_DEVICE_ID_AL_M5451 && + device_mask == 0x7fffffff) { + ali_sound_dma_hack(pdev, + (dma_addr_mask & 0x80000000) != 0); + return 1; + } } return (device_mask & dma_addr_mask) == dma_addr_mask; diff -urN linux-2.5.66-bk6/arch/sparc64/kernel/rtrap.S linux-2.5.66-bk7/arch/sparc64/kernel/rtrap.S --- linux-2.5.66-bk6/arch/sparc64/kernel/rtrap.S Mon Mar 24 14:00:34 2003 +++ linux-2.5.66-bk7/arch/sparc64/kernel/rtrap.S Tue Apr 1 04:40:40 2003 @@ -185,6 +185,7 @@ * sched+signal checks with IRQs disabled. */ to_user: wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate + wrpr 0, %pil __handle_preemption_continue: ldx [%g6 + TI_FLAGS], %l0 sethi %hi(_TIF_USER_WORK_MASK), %o0 @@ -271,6 +272,7 @@ brnz %l5, kern_fpucheck sethi %hi(PREEMPT_ACTIVE), %l6 stw %l6, [%g6 + TI_PRE_COUNT] + wrpr 0, %pil call schedule nop ba,pt %xcc, rtrap diff -urN linux-2.5.66-bk6/arch/sparc64/kernel/traps.c linux-2.5.66-bk7/arch/sparc64/kernel/traps.c --- linux-2.5.66-bk6/arch/sparc64/kernel/traps.c Mon Mar 24 14:01:47 2003 +++ linux-2.5.66-bk7/arch/sparc64/kernel/traps.c Tue Apr 1 04:40:40 2003 @@ -1575,6 +1575,9 @@ struct reg_window *rw; int count = 0; + if (tp == current_thread_info()) + flushw_all(); + fp = ksp + STACK_BIAS; thread_base = (unsigned long) tp; do { @@ -1597,6 +1600,15 @@ tsk->thread_info->ksp); } +void dump_stack(void) +{ + unsigned long ksp; + + __asm__ __volatile__("mov %%fp, %0" + : "=r" (ksp)); + show_trace_raw(current_thread_info(), ksp); +} + void die_if_kernel(char *str, struct pt_regs *regs) { static int die_counter; diff -urN linux-2.5.66-bk6/crypto/Kconfig linux-2.5.66-bk7/crypto/Kconfig --- linux-2.5.66-bk6/crypto/Kconfig Mon Mar 24 14:01:43 2003 +++ linux-2.5.66-bk7/crypto/Kconfig Tue Apr 1 04:40:40 2003 @@ -131,6 +131,16 @@ See http://csrc.nist.gov/encryption/aes/ for more information. +config CRYPTO_DEFLATE + tristate "Deflate compression algorithm" + depends on CRYPTO + default y if INET_IPCOMP=y || INET_IPCOMP=m + help + This is the Deflate algorithm (RFC1951), specified for use in + IPSec with the IPCOMP protocol (RFC3173, RFC2394). + + You will most probably want this if using IPSec. + config CRYPTO_TEST tristate "Testing module" depends on CRYPTO diff -urN linux-2.5.66-bk6/crypto/Makefile linux-2.5.66-bk7/crypto/Makefile --- linux-2.5.66-bk6/crypto/Makefile Mon Mar 24 14:01:46 2003 +++ linux-2.5.66-bk7/crypto/Makefile Tue Apr 1 04:40:40 2003 @@ -20,5 +20,6 @@ obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o obj-$(CONFIG_CRYPTO_AES) += aes.o +obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o diff -urN linux-2.5.66-bk6/crypto/api.c linux-2.5.66-bk7/crypto/api.c --- linux-2.5.66-bk6/crypto/api.c Mon Mar 24 14:01:43 2003 +++ linux-2.5.66-bk7/crypto/api.c Tue Apr 1 04:40:40 2003 @@ -127,7 +127,7 @@ if (tfm == NULL) goto out_put; - memset(tfm, 0, sizeof(*tfm)); + memset(tfm, 0, sizeof(*tfm) + alg->cra_ctxsize); tfm->__crt_alg = alg; diff -urN linux-2.5.66-bk6/crypto/compress.c linux-2.5.66-bk7/crypto/compress.c --- linux-2.5.66-bk6/crypto/compress.c Mon Mar 24 14:00:41 2003 +++ linux-2.5.66-bk7/crypto/compress.c Tue Apr 1 04:40:40 2003 @@ -18,29 +18,46 @@ #include #include "internal.h" -static void crypto_compress(struct crypto_tfm *tfm) +static int crypto_compress(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) { - tfm->__crt_alg->cra_compress.coa_compress(); + return tfm->__crt_alg->cra_compress.coa_compress(crypto_tfm_ctx(tfm), + src, slen, dst, + dlen); } -static void crypto_decompress(struct crypto_tfm *tfm) +static int crypto_decompress(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) { - tfm->__crt_alg->cra_compress.coa_decompress(); + return tfm->__crt_alg->cra_compress.coa_decompress(crypto_tfm_ctx(tfm), + src, slen, dst, + dlen); } int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags) { - return crypto_cipher_flags(flags) ? -EINVAL : 0; + return flags ? -EINVAL : 0; } int crypto_init_compress_ops(struct crypto_tfm *tfm) { + int ret = 0; struct compress_tfm *ops = &tfm->crt_compress; + ret = tfm->__crt_alg->cra_compress.coa_init(crypto_tfm_ctx(tfm)); + if (ret) + goto out; + ops->cot_compress = crypto_compress; ops->cot_decompress = crypto_decompress; - return 0; + +out: + return ret; } void crypto_exit_compress_ops(struct crypto_tfm *tfm) -{ } +{ + tfm->__crt_alg->cra_compress.coa_exit(crypto_tfm_ctx(tfm)); +} diff -urN linux-2.5.66-bk6/crypto/crypto_null.c linux-2.5.66-bk7/crypto/crypto_null.c --- linux-2.5.66-bk6/crypto/crypto_null.c Mon Mar 24 14:00:21 2003 +++ linux-2.5.66-bk7/crypto/crypto_null.c Tue Apr 1 04:40:40 2003 @@ -26,11 +26,13 @@ #define NULL_BLOCK_SIZE 1 #define NULL_DIGEST_SIZE 0 -static void null_compress(void) -{ } +static int null_compress(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) +{ return 0; } -static void null_decompress(void) -{ } +static int null_decompress(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) +{ return 0; } static void null_init(void *ctx) { } diff -urN linux-2.5.66-bk6/crypto/deflate.c linux-2.5.66-bk7/crypto/deflate.c --- linux-2.5.66-bk6/crypto/deflate.c Wed Dec 31 16:00:00 1969 +++ linux-2.5.66-bk7/crypto/deflate.c Tue Apr 1 04:40:40 2003 @@ -0,0 +1,224 @@ +/* + * Cryptographic API. + * + * Deflate algorithm (RFC 1951), implemented here primarily for use + * by IPCOMP (RFC 3173 & RFC 2394). + * + * Copyright (c) 2003 James Morris + * + * 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. + * + * FIXME: deflate transforms will require up to a total of about 436k of kernel + * memory on i386 (390k for compression, the rest for decompression), as the + * current zlib kernel code uses a worst case pre-allocation system by default. + * This needs to be fixed so that the amount of memory required is properly + * related to the winbits and memlevel parameters. + * + * The default winbits of 11 should suit most packets, and it may be something + * to configure on a per-tfm basis in the future. + * + * Currently, compression history is not maintained between tfm calls, as + * it is not needed for IPCOMP and keeps the code simpler. It can be + * implemented if someone wants it. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEFLATE_DEF_LEVEL Z_DEFAULT_COMPRESSION +#define DEFLATE_DEF_WINBITS 11 +#define DEFLATE_DEF_MEMLEVEL MAX_MEM_LEVEL + +struct deflate_ctx { + int comp_initialized; + int decomp_initialized; + struct z_stream_s comp_stream; + struct z_stream_s decomp_stream; +}; + +static inline int deflate_gfp(void) +{ + return in_softirq() ? GFP_ATOMIC : GFP_KERNEL; +} + +static int deflate_init(void *ctx) +{ + return 0; +} + +static void deflate_exit(void *ctx) +{ + struct deflate_ctx *dctx = ctx; + + if (dctx->comp_initialized) + vfree(dctx->comp_stream.workspace); + if (dctx->decomp_initialized) + kfree(dctx->decomp_stream.workspace); +} + +/* + * Lazy initialization to make interface simple without allocating + * un-needed workspaces. Thus can be called in softirq context. + */ +static int deflate_comp_init(struct deflate_ctx *ctx) +{ + int ret = 0; + struct z_stream_s *stream = &ctx->comp_stream; + + stream->workspace = __vmalloc(zlib_deflate_workspacesize(), + deflate_gfp()|__GFP_HIGHMEM, + PAGE_KERNEL); + if (!stream->workspace ) { + ret = -ENOMEM; + goto out; + } + memset(stream->workspace, 0, sizeof(stream->workspace)); + ret = zlib_deflateInit2(stream, DEFLATE_DEF_LEVEL, Z_DEFLATED, + -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, + Z_DEFAULT_STRATEGY); + if (ret != Z_OK) { + ret = -EINVAL; + goto out_free; + } + ctx->comp_initialized = 1; +out: + return ret; +out_free: + vfree(stream->workspace); + goto out; +} + +static int deflate_decomp_init(struct deflate_ctx *ctx) +{ + int ret = 0; + struct z_stream_s *stream = &ctx->decomp_stream; + + stream->workspace = kmalloc(zlib_inflate_workspacesize(), + deflate_gfp()); + if (!stream->workspace ) { + ret = -ENOMEM; + goto out; + } + memset(stream->workspace, 0, sizeof(stream->workspace)); + ret = zlib_inflateInit2(stream, -DEFLATE_DEF_WINBITS); + if (ret != Z_OK) { + ret = -EINVAL; + goto out_free; + } + ctx->decomp_initialized = 1; +out: + return ret; +out_free: + kfree(stream->workspace); + goto out; +} + +static int deflate_compress(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) +{ + int ret = 0; + struct deflate_ctx *dctx = ctx; + struct z_stream_s *stream = &dctx->comp_stream; + + if (!dctx->comp_initialized) { + ret = deflate_comp_init(dctx); + if (ret) + goto out; + } + + ret = zlib_deflateReset(stream); + if (ret != Z_OK) { + ret = -EINVAL; + goto out; + } + + stream->next_in = (u8 *)src; + stream->avail_in = slen; + stream->next_out = (u8 *)dst; + stream->avail_out = *dlen; + + ret = zlib_deflate(stream, Z_FINISH); + if (ret != Z_STREAM_END) { + ret = -EINVAL; + goto out; + } + ret = 0; + *dlen = stream->total_out; +out: + return ret; +} + +static int deflate_decompress(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) +{ + + int ret = 0; + struct deflate_ctx *dctx = ctx; + struct z_stream_s *stream = &dctx->decomp_stream; + + if (!dctx->decomp_initialized) { + ret = deflate_decomp_init(dctx); + if (ret) + goto out; + } + + ret = zlib_inflateReset(stream); + if (ret != Z_OK) { + ret = -EINVAL; + goto out; + } + + stream->next_in = (u8 *)src; + stream->avail_in = slen; + stream->next_out = (u8 *)dst; + stream->avail_out = *dlen; + + ret = zlib_inflate(stream, Z_FINISH); + if (ret != Z_STREAM_END) { + ret = -EINVAL; + goto out; + } + ret = 0; + *dlen = stream->total_out; +out: + return ret; +} + +static struct crypto_alg alg = { + .cra_name = "deflate", + .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, + .cra_ctxsize = sizeof(struct deflate_ctx), + .cra_module = THIS_MODULE, + .cra_list = LIST_HEAD_INIT(alg.cra_list), + .cra_u = { .compress = { + .coa_init = deflate_init, + .coa_exit = deflate_exit, + .coa_compress = deflate_compress, + .coa_decompress = deflate_decompress } } +}; + +static int __init init(void) +{ + return crypto_register_alg(&alg); +} + +static void __exit fini(void) +{ + crypto_unregister_alg(&alg); +} + +module_init(init); +module_exit(fini); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Deflate Compression Algorithm for IPCOMP"); +MODULE_AUTHOR("James Morris "); + diff -urN linux-2.5.66-bk6/crypto/digest.c linux-2.5.66-bk7/crypto/digest.c --- linux-2.5.66-bk6/crypto/digest.c Mon Mar 24 13:59:54 2003 +++ linux-2.5.66-bk7/crypto/digest.c Tue Apr 1 04:40:40 2003 @@ -61,7 +61,7 @@ int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags) { - return crypto_cipher_flags(flags) ? -EINVAL : 0; + return flags ? -EINVAL : 0; } int crypto_init_digest_ops(struct crypto_tfm *tfm) diff -urN linux-2.5.66-bk6/crypto/internal.h linux-2.5.66-bk7/crypto/internal.h --- linux-2.5.66-bk6/crypto/internal.h Mon Mar 24 13:59:54 2003 +++ linux-2.5.66-bk7/crypto/internal.h Tue Apr 1 04:40:40 2003 @@ -41,11 +41,6 @@ cond_resched(); } -static inline u32 crypto_cipher_flags(u32 flags) -{ - return flags & (CRYPTO_TFM_MODE_MASK|CRYPTO_TFM_REQ_WEAK_KEY); -} - static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm) { return (void *)&tfm[1]; diff -urN linux-2.5.66-bk6/crypto/proc.c linux-2.5.66-bk7/crypto/proc.c --- linux-2.5.66-bk6/crypto/proc.c Mon Mar 24 14:00:12 2003 +++ linux-2.5.66-bk7/crypto/proc.c Tue Apr 1 04:40:40 2003 @@ -54,10 +54,10 @@ seq_printf(m, "name : %s\n", alg->cra_name); seq_printf(m, "module : %s\n", module_name(alg->cra_module)); - seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { case CRYPTO_ALG_TYPE_CIPHER: + seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); seq_printf(m, "min keysize : %u\n", alg->cra_cipher.cia_min_keysize); seq_printf(m, "max keysize : %u\n", @@ -67,6 +67,7 @@ break; case CRYPTO_ALG_TYPE_DIGEST: + seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); seq_printf(m, "digestsize : %u\n", alg->cra_digest.dia_digestsize); break; diff -urN linux-2.5.66-bk6/crypto/tcrypt.c linux-2.5.66-bk7/crypto/tcrypt.c --- linux-2.5.66-bk6/crypto/tcrypt.c Mon Mar 24 14:01:16 2003 +++ linux-2.5.66-bk7/crypto/tcrypt.c Tue Apr 1 04:40:40 2003 @@ -48,7 +48,7 @@ static char *check[] = { "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", - "twofish", "serpent", "sha384", "sha512", "md4", "aes", + "twofish", "serpent", "sha384", "sha512", "md4", "aes", "deflate", NULL }; @@ -2193,6 +2193,86 @@ } static void +test_deflate(void) +{ + unsigned int i; + char result[COMP_BUF_SIZE]; + struct crypto_tfm *tfm; + struct comp_testvec *tv; + unsigned int tsize; + + printk("\ntesting deflate compression\n"); + + tsize = sizeof (deflate_comp_tv_template); + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + return; + } + + memcpy(tvmem, deflate_comp_tv_template, tsize); + tv = (void *) tvmem; + + tfm = crypto_alloc_tfm("deflate", 0); + if (tfm == NULL) { + printk("failed to load transform for deflate\n"); + return; + } + + for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) { + int ilen, ret, dlen = COMP_BUF_SIZE; + + printk("test %u:\n", i + 1); + memset(result, 0, sizeof (result)); + + ilen = tv[i].inlen; + ret = crypto_comp_compress(tfm, tv[i].input, + ilen, result, &dlen); + if (ret) { + printk("fail: ret=%d\n", ret); + continue; + } + hexdump(result, dlen); + printk("%s (ratio %d:%d)\n", + memcmp(result, tv[i].output, dlen) ? "fail" : "pass", + ilen, dlen); + } + + printk("\ntesting deflate decompression\n"); + + tsize = sizeof (deflate_decomp_tv_template); + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + goto out; + } + + memcpy(tvmem, deflate_decomp_tv_template, tsize); + tv = (void *) tvmem; + + for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) { + int ilen, ret, dlen = COMP_BUF_SIZE; + + printk("test %u:\n", i + 1); + memset(result, 0, sizeof (result)); + + ilen = tv[i].inlen; + ret = crypto_comp_decompress(tfm, tv[i].input, + ilen, result, &dlen); + if (ret) { + printk("fail: ret=%d\n", ret); + continue; + } + hexdump(result, dlen); + printk("%s (ratio %d:%d)\n", + memcmp(result, tv[i].output, dlen) ? "fail" : "pass", + ilen, dlen); + } +out: + crypto_free_tfm(tfm); +} + +static void test_available(void) { char **name = check; @@ -2223,6 +2303,7 @@ test_aes(); test_sha384(); test_sha512(); + test_deflate(); #ifdef CONFIG_CRYPTO_HMAC test_hmac_md5(); test_hmac_sha1(); @@ -2278,6 +2359,10 @@ test_sha512(); break; + case 13: + test_deflate(); + break; + #ifdef CONFIG_CRYPTO_HMAC case 100: test_hmac_md5(); diff -urN linux-2.5.66-bk6/crypto/tcrypt.h linux-2.5.66-bk7/crypto/tcrypt.h --- linux-2.5.66-bk6/crypto/tcrypt.h Mon Mar 24 14:01:25 2003 +++ linux-2.5.66-bk7/crypto/tcrypt.h Tue Apr 1 04:40:40 2003 @@ -1682,4 +1682,104 @@ }, }; +/* + * Compression stuff. + */ +#define COMP_BUF_SIZE 512 + +struct comp_testvec { + int inlen, outlen; + char input[COMP_BUF_SIZE]; + char output[COMP_BUF_SIZE]; +}; + +/* + * Deflate test vectors (null-terminated strings). + * Params: winbits=11, Z_DEFAULT_COMPRESSION, MAX_MEM_LEVEL. + */ +#define DEFLATE_COMP_TEST_VECTORS 2 +#define DEFLATE_DECOMP_TEST_VECTORS 2 + +struct comp_testvec deflate_comp_tv_template[] = { + { + 70, 38, + + "Join us now and share the software " + "Join us now and share the software ", + + { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56, + 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51, + 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9, + 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07, + 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 + }, + }, + + { + 191, 122, + + "This document describes a compression method based on the DEFLATE" + "compression algorithm. This document defines the application of " + "the DEFLATE algorithm to the IP Payload Compression Protocol.", + + { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04, + 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09, + 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8, + 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49, + 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27, + 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2, + 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad, + 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4, + 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b, + 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f, + 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf, + 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02, + 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98, + 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a, + 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79, + 0xfa, 0x02 }, + }, +}; + +struct comp_testvec deflate_decomp_tv_template[] = { + { + 122, 191, + + { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04, + 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09, + 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8, + 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49, + 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27, + 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2, + 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad, + 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4, + 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b, + 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f, + 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf, + 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02, + 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98, + 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a, + 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79, + 0xfa, 0x02 }, + + "This document describes a compression method based on the DEFLATE" + "compression algorithm. This document defines the application of " + "the DEFLATE algorithm to the IP Payload Compression Protocol.", + }, + + { + 38, 70, + + { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56, + 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51, + 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9, + 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07, + 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 + }, + + "Join us now and share the software " + "Join us now and share the software ", + }, +}; + #endif /* _CRYPTO_TCRYPT_H */ diff -urN linux-2.5.66-bk6/drivers/ide/ide.c linux-2.5.66-bk7/drivers/ide/ide.c --- linux-2.5.66-bk6/drivers/ide/ide.c Mon Mar 24 14:00:14 2003 +++ linux-2.5.66-bk7/drivers/ide/ide.c Tue Apr 1 04:40:41 2003 @@ -2019,7 +2019,7 @@ goto done; } #endif /* CONFIG_BLK_DEV_HT6560B */ -#if CONFIG_BLK_DEV_QD65XX +#ifdef CONFIG_BLK_DEV_QD65XX case -12: /* "qd65xx" */ { extern void init_qd65xx (void); diff -urN linux-2.5.66-bk6/drivers/net/Kconfig linux-2.5.66-bk7/drivers/net/Kconfig --- linux-2.5.66-bk6/drivers/net/Kconfig Mon Mar 24 14:01:23 2003 +++ linux-2.5.66-bk7/drivers/net/Kconfig Tue Apr 1 04:40:41 2003 @@ -2262,7 +2262,7 @@ config PPP_FILTER bool "PPP filtering" - depends on PPP && FILTER + depends on PPP help Say Y here if you want to be able to filter the packets passing over PPP interfaces. This allows you to control which packets count as diff -urN linux-2.5.66-bk6/drivers/scsi/scsi_lib.c linux-2.5.66-bk7/drivers/scsi/scsi_lib.c --- linux-2.5.66-bk6/drivers/scsi/scsi_lib.c Mon Mar 24 14:00:38 2003 +++ linux-2.5.66-bk7/drivers/scsi/scsi_lib.c Tue Apr 1 04:40:42 2003 @@ -1072,14 +1072,6 @@ if (shost->in_recovery || blk_queue_plugged(q)) return; - /* - * get next queueable request. We do this early to make sure - * that the request is fully prepared even if we cannot - * accept it. If there is no request, we'll detect this - * lower down. - */ - req = elv_next_request(q); - if (sdev->device_busy >= sdev->queue_depth) break; @@ -1134,11 +1126,12 @@ sdev->starved = 0; /* - * If we couldn't find a request that could be queued, then we - * can also quit. + * get next queueable request. We do this early to make sure + * that the request is fully prepared even if we cannot + * accept it. If there is no request, we'll detect this + * lower down. */ - if (blk_queue_empty(q)) - break; + req = elv_next_request(q); if (!req) { /* If the device is busy, a returning I/O diff -urN linux-2.5.66-bk6/drivers/usb/host/ohci-pci.c linux-2.5.66-bk7/drivers/usb/host/ohci-pci.c --- linux-2.5.66-bk6/drivers/usb/host/ohci-pci.c Mon Mar 24 14:01:12 2003 +++ linux-2.5.66-bk7/drivers/usb/host/ohci-pci.c Tue Apr 1 04:40:42 2003 @@ -389,7 +389,7 @@ if (usb_disabled()) return -ENODEV; - printk (KERN_DEBUG "%s: block sizes: ed %d td %d\n", hcd_name, + printk (KERN_DEBUG "%s: block sizes: ed %Zd td %Zd\n", hcd_name, sizeof (struct ed), sizeof (struct td)); return pci_module_init (&ohci_pci_driver); } diff -urN linux-2.5.66-bk6/include/asm-i386/page.h linux-2.5.66-bk7/include/asm-i386/page.h --- linux-2.5.66-bk6/include/asm-i386/page.h Mon Mar 24 14:00:08 2003 +++ linux-2.5.66-bk7/include/asm-i386/page.h Tue Apr 1 04:40:44 2003 @@ -90,8 +90,6 @@ * and CONFIG_HIGHMEM64G options in the kernel configuration. */ -#define __PAGE_OFFSET (0xC0000000) - /* * This much address space is reserved for vmalloc() and iomap() * as well as fixmap mappings. @@ -116,10 +114,16 @@ #endif /* __ASSEMBLY__ */ +#ifdef __ASSEMBLY__ +#define __PAGE_OFFSET (0xC0000000) +#else +#define __PAGE_OFFSET (0xC0000000UL) +#endif + + #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) -#define __MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) -#define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) +#define MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) diff -urN linux-2.5.66-bk6/include/asm-i386/string.h linux-2.5.66-bk7/include/asm-i386/string.h --- linux-2.5.66-bk6/include/asm-i386/string.h Mon Mar 24 14:01:49 2003 +++ linux-2.5.66-bk7/include/asm-i386/string.h Tue Apr 1 04:40:44 2003 @@ -69,7 +69,7 @@ "testb %%al,%%al\n\t" "jne 1b" : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) - : "0" (src), "1" (dest), "2" (0), "3" (0xffffffff):"memory"); + : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu):"memory"); return dest; } @@ -91,7 +91,7 @@ "2:\txorl %2,%2\n\t" "stosb" : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) - : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count) + : "0" (src),"1" (dest),"2" (0),"3" (0xffffffffu), "g" (count) : "memory"); return dest; } @@ -186,7 +186,7 @@ "scasb\n\t" "notl %0\n\t" "decl %0" - :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff)); + :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu)); return __res; } diff -urN linux-2.5.66-bk6/include/asm-i386/uaccess.h linux-2.5.66-bk7/include/asm-i386/uaccess.h --- linux-2.5.66-bk6/include/asm-i386/uaccess.h Tue Apr 1 04:40:32 2003 +++ linux-2.5.66-bk7/include/asm-i386/uaccess.h Tue Apr 1 04:40:44 2003 @@ -24,7 +24,7 @@ #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) -#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) +#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL) #define USER_DS MAKE_MM_SEG(PAGE_OFFSET) #define get_ds() (KERNEL_DS) diff -urN linux-2.5.66-bk6/include/asm-sparc64/pci.h linux-2.5.66-bk7/include/asm-sparc64/pci.h --- linux-2.5.66-bk6/include/asm-sparc64/pci.h Mon Mar 24 14:00:08 2003 +++ linux-2.5.66-bk7/include/asm-sparc64/pci.h Tue Apr 1 04:40:44 2003 @@ -205,9 +205,14 @@ #define HAVE_ARCH_PCI_MWI extern int pcibios_prep_mwi(struct pci_dev *dev); -#endif /* __KERNEL__ */ +extern void +pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, + struct resource *res); + +extern void +pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, + struct pci_bus_region *region); -/* generic pci stuff */ -#include +#endif /* __KERNEL__ */ #endif /* __SPARC64_PCI_H */ diff -urN linux-2.5.66-bk6/include/linux/bitops.h linux-2.5.66-bk7/include/linux/bitops.h --- linux-2.5.66-bk6/include/linux/bitops.h Mon Mar 24 14:01:46 2003 +++ linux-2.5.66-bk7/include/linux/bitops.h Tue Apr 1 04:40:44 2003 @@ -47,23 +47,23 @@ if (!x) return 0; - if (!(x & 0xffff0000)) { + if (!(x & 0xffff0000u)) { x <<= 16; r -= 16; } - if (!(x & 0xff000000)) { + if (!(x & 0xff000000u)) { x <<= 8; r -= 8; } - if (!(x & 0xf0000000)) { + if (!(x & 0xf0000000u)) { x <<= 4; r -= 4; } - if (!(x & 0xc0000000)) { + if (!(x & 0xc0000000u)) { x <<= 2; r -= 2; } - if (!(x & 0x80000000)) { + if (!(x & 0x80000000u)) { x <<= 1; r -= 1; } diff -urN linux-2.5.66-bk6/include/linux/crypto.h linux-2.5.66-bk7/include/linux/crypto.h --- linux-2.5.66-bk6/include/linux/crypto.h Mon Mar 24 14:00:12 2003 +++ linux-2.5.66-bk7/include/linux/crypto.h Tue Apr 1 04:40:44 2003 @@ -31,7 +31,6 @@ #define CRYPTO_ALG_TYPE_DIGEST 0x00000002 #define CRYPTO_ALG_TYPE_COMPRESS 0x00000004 - /* * Transform masks and values (for crt_flags). */ @@ -45,14 +44,12 @@ #define CRYPTO_TFM_MODE_CTR 0x00000008 #define CRYPTO_TFM_REQ_WEAK_KEY 0x00000100 - #define CRYPTO_TFM_RES_WEAK_KEY 0x00100000 #define CRYPTO_TFM_RES_BAD_KEY_LEN 0x00200000 #define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000 #define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000 #define CRYPTO_TFM_RES_BAD_FLAGS 0x01000000 - /* * Miscellaneous stuff. */ @@ -83,8 +80,12 @@ }; struct compress_alg { - void (*coa_compress)(void); - void (*coa_decompress)(void); + int (*coa_init)(void *ctx); + void (*coa_exit)(void *ctx); + int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen); + int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen); }; #define cra_cipher cra_u.cipher @@ -162,8 +163,12 @@ }; struct compress_tfm { - void (*cot_compress)(struct crypto_tfm *tfm); - void (*cot_decompress)(struct crypto_tfm *tfm); + int (*cot_compress)(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen); + int (*cot_decompress)(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen); }; #define crt_cipher crt_u.cipher @@ -336,16 +341,20 @@ memcpy(dst, tfm->crt_cipher.cit_iv, len); } -static inline void crypto_comp_compress(struct crypto_tfm *tfm) +static inline int crypto_comp_compress(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) { BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); - tfm->crt_compress.cot_compress(tfm); + return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen); } -static inline void crypto_comp_decompress(struct crypto_tfm *tfm) +static inline int crypto_comp_decompress(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen) { BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); - tfm->crt_compress.cot_decompress(tfm); + return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen); } /* diff -urN linux-2.5.66-bk6/include/net/compat.h linux-2.5.66-bk7/include/net/compat.h --- linux-2.5.66-bk6/include/net/compat.h Mon Mar 24 14:00:10 2003 +++ linux-2.5.66-bk7/include/net/compat.h Tue Apr 1 04:40:44 2003 @@ -33,8 +33,6 @@ extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr *,unsigned); extern asmlinkage long compat_sys_getsockopt(int, int, int, char *, int *); extern int put_cmsg_compat(struct msghdr*, int, int, int, void *); -extern int put_compat_msg_controllen(struct msghdr *, struct compat_msghdr *, - unsigned long); extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, unsigned char *, int); diff -urN linux-2.5.66-bk6/include/net/protocol.h linux-2.5.66-bk7/include/net/protocol.h --- linux-2.5.66-bk6/include/net/protocol.h Mon Mar 24 14:00:20 2003 +++ linux-2.5.66-bk7/include/net/protocol.h Tue Apr 1 04:40:44 2003 @@ -50,6 +50,7 @@ struct inet6_skb_parm *opt, int type, int code, int offset, __u32 info); + int no_policy; }; #endif diff -urN linux-2.5.66-bk6/include/net/sock.h linux-2.5.66-bk7/include/net/sock.h --- linux-2.5.66-bk6/include/net/sock.h Mon Mar 24 14:01:13 2003 +++ linux-2.5.66-bk7/include/net/sock.h Tue Apr 1 04:40:44 2003 @@ -48,9 +48,7 @@ #include /* struct sk_buff */ #include -#ifdef CONFIG_FILTER #include -#endif #include #include @@ -174,10 +172,8 @@ long rcvtimeo; long sndtimeo; -#ifdef CONFIG_FILTER /* Socket Filtering Instructions */ struct sk_filter *filter; -#endif /* CONFIG_FILTER */ /* This is where all the private (optional) areas that don't * overlap will eventually live. @@ -456,8 +452,6 @@ /* Initialise core socket variables */ extern void sock_init_data(struct socket *sock, struct sock *sk); -#ifdef CONFIG_FILTER - /** * __sk_filter - run a packet through a socket filter * @sk: sock associated with &sk_buff @@ -524,15 +518,6 @@ atomic_add(sk_filter_len(fp), &sk->omem_alloc); } -#else - -static inline int __sk_filter(struct sock *sk, struct sk_buff *skb, int needlock) -{ - return 0; -} - -#endif /* CONFIG_FILTER */ - static inline int sk_filter(struct sock *sk, struct sk_buff *skb, int needlock) { int err; diff -urN linux-2.5.66-bk6/kernel/sched.c linux-2.5.66-bk7/kernel/sched.c --- linux-2.5.66-bk6/kernel/sched.c Mon Mar 24 14:01:16 2003 +++ linux-2.5.66-bk7/kernel/sched.c Tue Apr 1 04:40:44 2003 @@ -2554,7 +2554,7 @@ #if defined(in_atomic) static unsigned long prev_jiffy; /* ratelimiting */ - if (in_atomic()) { + if (in_atomic() || irqs_disabled()) { if (time_before(jiffies, prev_jiffy + HZ)) return; prev_jiffy = jiffies; diff -urN linux-2.5.66-bk6/lib/Kconfig linux-2.5.66-bk7/lib/Kconfig --- linux-2.5.66-bk6/lib/Kconfig Mon Mar 24 14:00:49 2003 +++ linux-2.5.66-bk7/lib/Kconfig Tue Apr 1 04:40:44 2003 @@ -17,13 +17,14 @@ # config ZLIB_INFLATE tristate - default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y - default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m + default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y + default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m config ZLIB_DEFLATE tristate - default m if PPP_DEFLATE!=y && JFFS2_FS!=y && (PPP_DEFLATE=m || JFFS2_FS=m) - default y if PPP_DEFLATE=y || JFFS2_FS=y + default m if PPP_DEFLATE!=y && JFFS2_FS!=y && CRYPTO_DEFLATE!=y && \ + (PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m) + default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y endmenu diff -urN linux-2.5.66-bk6/net/Kconfig linux-2.5.66-bk7/net/Kconfig --- linux-2.5.66-bk6/net/Kconfig Tue Apr 1 04:40:33 2003 +++ linux-2.5.66-bk7/net/Kconfig Tue Apr 1 04:40:44 2003 @@ -118,22 +118,6 @@ You can say Y here if you want to get additional messages useful in debugging the netfilter code. -config FILTER - bool "Socket Filtering" - ---help--- - The Linux Socket Filter is derived from the Berkeley Packet Filter. - If you say Y here, user-space programs can attach a filter to any - socket and thereby tell the kernel that it should allow or disallow - certain types of data to get through the socket. Linux Socket - Filtering works on all socket types except TCP for now. See the - text file for more - information. - - You need to say Y here if you want to use PPP packet filtering - (see the CONFIG_PPP_FILTER option below). - - If unsure, say N. - config UNIX tristate "Unix domain sockets" ---help--- diff -urN linux-2.5.66-bk6/net/compat.c linux-2.5.66-bk7/net/compat.c --- linux-2.5.66-bk6/net/compat.c Mon Mar 24 14:00:50 2003 +++ linux-2.5.66-bk7/net/compat.c Tue Apr 1 04:40:44 2003 @@ -296,108 +296,6 @@ __scm_destroy(scm); } -/* In these cases we (currently) can just copy to data over verbatim - * because all CMSGs created by the kernel have well defined types which - * have the same layout in both the 32-bit and 64-bit API. One must add - * some special cased conversions here if we start sending control messages - * with incompatible types. - * - * SCM_RIGHTS and SCM_CREDENTIALS are done by hand in recvmsg_compat right after - * we do our work. The remaining cases are: - * - * SOL_IP IP_PKTINFO struct in_pktinfo 32-bit clean - * IP_TTL int 32-bit clean - * IP_TOS __u8 32-bit clean - * IP_RECVOPTS variable length 32-bit clean - * IP_RETOPTS variable length 32-bit clean - * (these last two are clean because the types are defined - * by the IPv4 protocol) - * IP_RECVERR struct sock_extended_err + - * struct sockaddr_in 32-bit clean - * SOL_IPV6 IPV6_RECVERR struct sock_extended_err + - * struct sockaddr_in6 32-bit clean - * IPV6_PKTINFO struct in6_pktinfo 32-bit clean - * IPV6_HOPLIMIT int 32-bit clean - * IPV6_FLOWINFO u32 32-bit clean - * IPV6_HOPOPTS ipv6 hop exthdr 32-bit clean - * IPV6_DSTOPTS ipv6 dst exthdr(s) 32-bit clean - * IPV6_RTHDR ipv6 routing exthdr 32-bit clean - * IPV6_AUTHHDR ipv6 auth exthdr 32-bit clean - */ -static void cmsg_compat_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr) -{ - unsigned char *workbuf, *wp; - unsigned long bufsz, space_avail; - struct cmsghdr *ucmsg; - - bufsz = ((unsigned long)kmsg->msg_control) - orig_cmsg_uptr; - space_avail = kmsg->msg_controllen + bufsz; - wp = workbuf = kmalloc(bufsz, GFP_KERNEL); - if(workbuf == NULL) - goto fail; - - /* To make this more sane we assume the kernel sends back properly - * formatted control messages. Because of how the kernel will truncate - * the cmsg_len for MSG_TRUNC cases, we need not check that case either. - */ - ucmsg = (struct cmsghdr *) orig_cmsg_uptr; - while(((unsigned long)ucmsg) <= - (((unsigned long)kmsg->msg_control) - sizeof(struct cmsghdr))) { - struct compat_cmsghdr *kcmsg_compat = (struct compat_cmsghdr *) wp; - int clen64, clen32; - - /* UCMSG is the 64-bit format CMSG entry in user-space. - * KCMSG_COMPAT is within the kernel space temporary buffer - * we use to convert into a 32-bit style CMSG. - */ - __get_user(kcmsg_compat->cmsg_len, &ucmsg->cmsg_len); - __get_user(kcmsg_compat->cmsg_level, &ucmsg->cmsg_level); - __get_user(kcmsg_compat->cmsg_type, &ucmsg->cmsg_type); - - clen64 = kcmsg_compat->cmsg_len; - copy_from_user(CMSG_COMPAT_DATA(kcmsg_compat), CMSG_DATA(ucmsg), - clen64 - CMSG_ALIGN(sizeof(*ucmsg))); - clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) + - CMSG_COMPAT_ALIGN(sizeof(struct compat_cmsghdr))); - kcmsg_compat->cmsg_len = clen32; - - ucmsg = (struct cmsghdr *) (((char *)ucmsg) + CMSG_ALIGN(clen64)); - wp = (((char *)kcmsg_compat) + CMSG_COMPAT_ALIGN(clen32)); - } - - /* Copy back fixed up data, and adjust pointers. */ - bufsz = (wp - workbuf); - copy_to_user((void *)orig_cmsg_uptr, workbuf, bufsz); - - kmsg->msg_control = (struct cmsghdr *) - (((char *)orig_cmsg_uptr) + bufsz); - kmsg->msg_controllen = space_avail - bufsz; - - kfree(workbuf); - return; - -fail: - /* If we leave the 64-bit format CMSG chunks in there, - * the application could get confused and crash. So to - * ensure greater recovery, we report no CMSGs. - */ - kmsg->msg_controllen += bufsz; - kmsg->msg_control = (void *) orig_cmsg_uptr; -} - -int put_compat_msg_controllen(struct msghdr *msg_sys, - struct compat_msghdr *msg_compat, unsigned long cmsg_ptr) -{ - unsigned long ucmsg_ptr; - compat_size_t uclen; - - if ((unsigned long)msg_sys->msg_control != cmsg_ptr) - cmsg_compat_recvmsg_fixup(msg_sys, cmsg_ptr); - ucmsg_ptr = ((unsigned long)msg_sys->msg_control); - uclen = (compat_size_t) (ucmsg_ptr - cmsg_ptr); - return __put_user(uclen, &msg_compat->msg_controllen); -} - extern asmlinkage long sys_setsockopt(int fd, int level, int optname, char *optval, int optlen); @@ -496,6 +394,7 @@ struct sock_fprog kfprog; mm_segment_t old_fs; compat_uptr_t uptr; + unsigned int fsize; int ret; if (!access_ok(VERIFY_READ, fprog32, sizeof(*fprog32)) || @@ -503,15 +402,14 @@ __get_user(uptr, &fprog32->filter)) return -EFAULT; - kfprog.filter = compat_ptr(uptr); - /* - * Since struct sock_filter is architecure independent, - * we can just do the access_ok check and pass the - * same pointer to the real syscall. - */ - if (!access_ok(VERIFY_READ, kfprog.filter, - kfprog.len * sizeof(struct sock_filter))) + fsize = kfprog.len * sizeof(struct sock_filter); + kfprog.filter = (struct sock_filter *)kmalloc(fsize, GFP_KERNEL); + if (kfprog.filter == NULL) + return -ENOMEM; + if (copy_from_user(kfprog.filter, compat_ptr(uptr), fsize)) { + kfree(kfprog.filter); return -EFAULT; + } old_fs = get_fs(); set_fs(KERNEL_DS); @@ -519,6 +417,7 @@ (char *)&kfprog, sizeof(kfprog)); set_fs(old_fs); + kfree(kfprog.filter); return ret; } diff -urN linux-2.5.66-bk6/net/core/Makefile linux-2.5.66-bk7/net/core/Makefile --- linux-2.5.66-bk6/net/core/Makefile Mon Mar 24 14:01:43 2003 +++ linux-2.5.66-bk7/net/core/Makefile Tue Apr 1 04:40:44 2003 @@ -10,9 +10,7 @@ endif endif -obj-$(CONFIG_FILTER) += filter.o - -obj-$(CONFIG_NET) += dev.o dev_mcast.o dst.o neighbour.o rtnetlink.o utils.o link_watch.o +obj-$(CONFIG_NET) += dev.o dev_mcast.o dst.o neighbour.o rtnetlink.o utils.o link_watch.o filter.o obj-$(CONFIG_NETFILTER) += netfilter.o obj-$(CONFIG_NET_DIVERT) += dv.o diff -urN linux-2.5.66-bk6/net/core/filter.c linux-2.5.66-bk7/net/core/filter.c --- linux-2.5.66-bk6/net/core/filter.c Mon Mar 24 14:00:15 2003 +++ linux-2.5.66-bk7/net/core/filter.c Tue Apr 1 04:40:44 2003 @@ -15,9 +15,6 @@ * Andi Kleen - Fix a few bad bugs and races. */ -#include -#if defined(CONFIG_FILTER) - #include #include #include @@ -495,4 +492,3 @@ return (err); } -#endif /* CONFIG_FILTER */ diff -urN linux-2.5.66-bk6/net/core/skbuff.c linux-2.5.66-bk7/net/core/skbuff.c --- linux-2.5.66-bk6/net/core/skbuff.c Tue Apr 1 04:40:33 2003 +++ linux-2.5.66-bk7/net/core/skbuff.c Tue Apr 1 04:40:44 2003 @@ -170,15 +170,8 @@ struct sk_buff *skb; u8 *data; - if (in_interrupt() && (gfp_mask & __GFP_WAIT)) { - static int count; - if (++count < 5) { - printk(KERN_ERR "alloc_skb called nonatomically " - "from interrupt %p\n", NET_CALLER(size)); - BUG(); - } - gfp_mask &= ~__GFP_WAIT; - } + if (gfp_mask & __GFP_WAIT) + might_sleep(); /* Get the HEAD */ skb = skb_head_from_pool(); diff -urN linux-2.5.66-bk6/net/core/sock.c linux-2.5.66-bk7/net/core/sock.c --- linux-2.5.66-bk6/net/core/sock.c Mon Mar 24 14:01:13 2003 +++ linux-2.5.66-bk7/net/core/sock.c Tue Apr 1 04:40:44 2003 @@ -119,9 +119,7 @@ #include #include -#ifdef CONFIG_FILTER #include -#endif #ifdef CONFIG_INET #include @@ -168,9 +166,7 @@ char *optval, int optlen) { struct sock *sk=sock->sk; -#ifdef CONFIG_FILTER struct sk_filter *filter; -#endif int val; int valbool; struct linger ling; @@ -381,7 +377,6 @@ #endif -#ifdef CONFIG_FILTER case SO_ATTACH_FILTER: ret = -EINVAL; if (optlen == sizeof(struct sock_fprog)) { @@ -407,7 +402,7 @@ spin_unlock_bh(&sk->lock.slock); ret = -ENONET; break; -#endif + /* We implement the SO_SNDLOWAT etc to not be settable (1003.1g 5.3) */ default: @@ -614,20 +609,16 @@ void sk_free(struct sock *sk) { -#ifdef CONFIG_FILTER struct sk_filter *filter; -#endif if (sk->destruct) sk->destruct(sk); -#ifdef CONFIG_FILTER filter = sk->filter; if (filter) { sk_filter_release(sk, filter); sk->filter = NULL; } -#endif if (atomic_read(&sk->omem_alloc)) printk(KERN_DEBUG "sk_free: optmem leakage (%d bytes) detected.\n", atomic_read(&sk->omem_alloc)); diff -urN linux-2.5.66-bk6/net/ipv4/netfilter/ip_nat_standalone.c linux-2.5.66-bk7/net/ipv4/netfilter/ip_nat_standalone.c --- linux-2.5.66-bk6/net/ipv4/netfilter/ip_nat_standalone.c Mon Mar 24 14:01:15 2003 +++ linux-2.5.66-bk7/net/ipv4/netfilter/ip_nat_standalone.c Tue Apr 1 04:40:45 2003 @@ -110,12 +110,6 @@ } /* Fall thru... (Only ICMPs can be IP_CT_IS_REPLY) */ case IP_CT_NEW: -#ifdef CONFIG_IP_NF_NAT_LOCAL - /* LOCAL_IN hook doesn't have a chain and thus doesn't care - * about new packets -HW */ - if (hooknum == NF_IP_LOCAL_IN) - return NF_ACCEPT; -#endif info = &ct->nat.info; WRITE_LOCK(&ip_nat_lock); @@ -131,6 +125,12 @@ ret = call_expect(master_ct(ct), pskb, hooknum, ct, info); } else { +#ifdef CONFIG_IP_NF_NAT_LOCAL + /* LOCAL_IN hook doesn't have a chain! */ + if (hooknum == NF_IP_LOCAL_IN) { + ret = NF_ACCEPT; + } else +#endif ret = ip_nat_rule_find(pskb, hooknum, in, out, ct, info); } diff -urN linux-2.5.66-bk6/net/ipv4/netfilter/ipt_REJECT.c linux-2.5.66-bk7/net/ipv4/netfilter/ipt_REJECT.c --- linux-2.5.66-bk6/net/ipv4/netfilter/ipt_REJECT.c Mon Mar 24 14:01:18 2003 +++ linux-2.5.66-bk7/net/ipv4/netfilter/ipt_REJECT.c Tue Apr 1 04:40:45 2003 @@ -44,6 +44,7 @@ u_int16_t tmp_port; u_int32_t tmp_addr; int needs_ack; + int hh_len; /* IP header checks: fragment, too short. */ if (oldskb->nh.iph->frag_off & htons(IP_OFFSET) @@ -63,13 +64,36 @@ csum_partial((char *)otcph, otcplen, 0)) != 0) return; + + { + struct flowi fl = { .nl_u = { .ip4_u = + { .daddr = oldskb->nh.iph->saddr, + .saddr = (local ? + oldskb->nh.iph->daddr : + 0), + .tos = (RT_TOS(oldskb->nh.iph->tos) | + RTO_CONN) } } }; + + /* Routing: if not headed for us, route won't like source */ + if (ip_route_output_key(&rt, &fl)) + return; + + hh_len = (rt->u.dst.dev->hard_header_len + 15)&~15; + } + + /* Copy skb (even if skb is about to be dropped, we can't just clone it because there may be other things, such as tcpdump, - interested in it) */ - nskb = skb_copy(oldskb, GFP_ATOMIC); + interested in it). We also need to expand headroom in case + hh_len of incoming interface < hh_len of outgoing interface */ + nskb = skb_copy_expand(oldskb, hh_len, skb_tailroom(oldskb), + GFP_ATOMIC); if (!nskb) return; + dst_release(nskb->dst); + nskb->dst = &rt->u.dst; + /* This packet will not be the same as the other: clear nf fields */ nf_conntrack_put(nskb->nfct); nskb->nfct = NULL; @@ -132,23 +156,6 @@ nskb->nh.iph->check = ip_fast_csum((unsigned char *)nskb->nh.iph, nskb->nh.iph->ihl); - { - struct flowi fl = { .nl_u = { .ip4_u = - { .daddr = nskb->nh.iph->daddr, - .saddr = (local ? - nskb->nh.iph->saddr : - 0), - .tos = (RT_TOS(nskb->nh.iph->tos) | - RTO_CONN) } } }; - - /* Routing: if not headed for us, route won't like source */ - if (ip_route_output_key(&rt, &fl)) - goto free_nskb; - } - - dst_release(nskb->dst); - nskb->dst = &rt->u.dst; - /* "Never happens" */ if (nskb->len > dst_pmtu(nskb->dst)) goto free_nskb; diff -urN linux-2.5.66-bk6/net/ipv4/netfilter/iptable_mangle.c linux-2.5.66-bk7/net/ipv4/netfilter/iptable_mangle.c --- linux-2.5.66-bk6/net/ipv4/netfilter/iptable_mangle.c Mon Mar 24 14:01:24 2003 +++ linux-2.5.66-bk7/net/ipv4/netfilter/iptable_mangle.c Tue Apr 1 04:40:45 2003 @@ -179,7 +179,7 @@ .priority = NF_IP_PRI_MANGLE, }, { - .hook = ipt_local_hook, + .hook = ipt_route_hook, .pf = PF_INET, .hooknum = NF_IP_LOCAL_IN, .priority = NF_IP_PRI_MANGLE, diff -urN linux-2.5.66-bk6/net/ipv4/tcp_minisocks.c linux-2.5.66-bk7/net/ipv4/tcp_minisocks.c --- linux-2.5.66-bk6/net/ipv4/tcp_minisocks.c Mon Mar 24 14:01:14 2003 +++ linux-2.5.66-bk7/net/ipv4/tcp_minisocks.c Tue Apr 1 04:40:45 2003 @@ -645,9 +645,7 @@ if(newsk != NULL) { struct tcp_opt *newtp; -#ifdef CONFIG_FILTER struct sk_filter *filter; -#endif memcpy(newsk, sk, sizeof(struct tcp_sock)); newsk->state = TCP_SYN_RECV; @@ -677,10 +675,10 @@ newsk->callback_lock = RW_LOCK_UNLOCKED; skb_queue_head_init(&newsk->error_queue); newsk->write_space = tcp_write_space; -#ifdef CONFIG_FILTER + if ((filter = newsk->filter) != NULL) sk_filter_charge(newsk, filter); -#endif + if (unlikely(xfrm_sk_clone_policy(newsk))) { /* It is still raw copy of parent, so invalidate * destructor and make plain sk_free() */ diff -urN linux-2.5.66-bk6/net/ipv4/udp.c linux-2.5.66-bk7/net/ipv4/udp.c --- linux-2.5.66-bk6/net/ipv4/udp.c Mon Mar 24 14:00:08 2003 +++ linux-2.5.66-bk7/net/ipv4/udp.c Tue Apr 1 04:40:45 2003 @@ -951,7 +951,6 @@ return -1; } -#if defined(CONFIG_FILTER) if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { if (__udp_checksum_complete(skb)) { UDP_INC_STATS_BH(UdpInErrors); @@ -960,7 +959,6 @@ } skb->ip_summed = CHECKSUM_UNNECESSARY; } -#endif if (sock_queue_rcv_skb(sk,skb)<0) { UDP_INC_STATS_BH(UdpInErrors); diff -urN linux-2.5.66-bk6/net/ipv6/af_inet6.c linux-2.5.66-bk7/net/ipv6/af_inet6.c --- linux-2.5.66-bk6/net/ipv6/af_inet6.c Mon Mar 24 14:00:45 2003 +++ linux-2.5.66-bk7/net/ipv6/af_inet6.c Tue Apr 1 04:40:45 2003 @@ -62,14 +62,15 @@ #include #include -#ifdef MODULE +#if 0 /*def MODULE*/ static int unloadable = 0; /* XX: Turn to one when all is ok within the module for allowing unload */ +MODULE_PARM(unloadable, "i"); #endif MODULE_AUTHOR("Cast of dozens"); MODULE_DESCRIPTION("IPv6 protocol stack for Linux"); -MODULE_PARM(unloadable, "i"); +MODULE_LICENSE("GPL"); /* IPv6 procfs goodies... */ @@ -871,4 +872,3 @@ } module_exit(inet6_exit); #endif /* MODULE */ -MODULE_LICENSE("GPL"); diff -urN linux-2.5.66-bk6/net/ipv6/ah6.c linux-2.5.66-bk7/net/ipv6/ah6.c --- linux-2.5.66-bk6/net/ipv6/ah6.c Mon Mar 24 14:00:56 2003 +++ linux-2.5.66-bk7/net/ipv6/ah6.c Tue Apr 1 04:40:45 2003 @@ -199,7 +199,7 @@ } } - nexthdr = ah->nexthdr; + nexthdr = ((struct ipv6hdr*)tmp_hdr)->nexthdr = ah->nexthdr; skb->nh.raw = skb_pull(skb, (ah->hdrlen+2)<<2); memcpy(skb->nh.raw, tmp_hdr, hdr_len); skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); @@ -287,7 +287,7 @@ x->props.header_len = XFRM_ALIGN8(ahp->icv_trunc_len + AH_HLEN_NOICV); if (x->props.mode) - x->props.header_len += 20; + x->props.header_len += 40; x->data = ahp; return 0; @@ -330,6 +330,7 @@ static struct inet6_protocol ah6_protocol = { .handler = xfrm6_rcv, .err_handler = ah6_err, + .no_policy = 1, }; int __init ah6_init(void) diff -urN linux-2.5.66-bk6/net/ipv6/esp6.c linux-2.5.66-bk7/net/ipv6/esp6.c --- linux-2.5.66-bk6/net/ipv6/esp6.c Mon Mar 24 14:00:52 2003 +++ linux-2.5.66-bk7/net/ipv6/esp6.c Tue Apr 1 04:40:45 2003 @@ -108,7 +108,7 @@ struct dst_entry *dst = skb->dst; struct xfrm_state *x = dst->xfrm; struct ipv6hdr *iph = NULL, *top_iph; - struct ip_esp_hdr *esph; + struct ipv6_esp_hdr *esph; struct crypto_tfm *tfm; struct esp_data *esp; struct sk_buff *trailer; @@ -154,7 +154,7 @@ esp = x->data; alen = esp->auth.icv_trunc_len; tfm = esp->conf.tfm; - blksize = crypto_tfm_alg_blocksize(tfm); + blksize = (crypto_tfm_alg_blocksize(tfm) + 3) & ~3; clen = (clen + 2 + blksize-1)&~(blksize-1); if (esp->conf.padlen) clen = (clen + esp->conf.padlen-1)&~(esp->conf.padlen-1); @@ -176,7 +176,7 @@ if (x->props.mode) { iph = skb->nh.ipv6h; top_iph = (struct ipv6hdr*)skb_push(skb, x->props.header_len); - esph = (struct ip_esp_hdr*)(top_iph+1); + esph = (struct ipv6_esp_hdr*)(top_iph+1); *(u8*)(trailer->tail - 1) = IPPROTO_IPV6; top_iph->version = 6; top_iph->priority = iph->priority; @@ -184,13 +184,13 @@ top_iph->flow_lbl[1] = iph->flow_lbl[1]; top_iph->flow_lbl[2] = iph->flow_lbl[2]; top_iph->nexthdr = IPPROTO_ESP; - top_iph->payload_len = htons(skb->len + alen); + top_iph->payload_len = htons(skb->len + alen - sizeof(struct ipv6hdr)); top_iph->hop_limit = iph->hop_limit; - memcpy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr, sizeof(struct ipv6hdr)); - memcpy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr, sizeof(struct ipv6hdr)); + memcpy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr, sizeof(struct in6_addr)); + memcpy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr, sizeof(struct in6_addr)); } else { /* XXX exthdr */ - esph = (struct ip_esp_hdr*)skb_push(skb, x->props.header_len); + esph = (struct ipv6_esp_hdr*)skb_push(skb, x->props.header_len); skb->h.raw = (unsigned char*)esph; top_iph = (struct ipv6hdr*)skb_push(skb, hdr_len); memcpy(top_iph, iph, hdr_len); @@ -257,7 +257,7 @@ int esp6_input(struct xfrm_state *x, struct sk_buff *skb) { struct ipv6hdr *iph; - struct ip_esp_hdr *esph; + struct ipv6_esp_hdr *esph; struct esp_data *esp = x->data; struct sk_buff *trailer; int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm); @@ -269,7 +269,7 @@ u8 ret_nexthdr = 0; unsigned char *tmp_hdr = NULL; - if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) + if (!pskb_may_pull(skb, sizeof(struct ipv6_esp_hdr))) goto out; if (elen <= 0 || (elen & (blksize-1))) @@ -301,7 +301,7 @@ skb->ip_summed = CHECKSUM_NONE; - esph = (struct ip_esp_hdr*)skb->data; + esph = (struct ipv6_esp_hdr*)skb->data; iph = skb->nh.ipv6h; /* Get ivec. This can be wrong, check against another impls. */ @@ -336,7 +336,7 @@ } /* ... check padding bits here. Silly. :-) */ - ret_nexthdr = nexthdr[1]; + ret_nexthdr = ((struct ipv6hdr*)tmp_hdr)->nexthdr = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); skb->h.raw = skb_pull(skb, 8 + esp->conf.ivlen); skb->nh.raw += 8 + esp->conf.ivlen; @@ -370,7 +370,7 @@ int type, int code, int offset, __u32 info) { struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; - struct ip_esp_hdr *esph = (struct ip_esp_hdr*)(skb->data+offset); + struct ipv6_esp_hdr *esph = (struct ipv6_esp_hdr*)(skb->data+offset); struct xfrm_state *x; if (type != ICMPV6_DEST_UNREACH || @@ -416,7 +416,7 @@ if (x->aalg->alg_key_len == 0 || x->aalg->alg_key_len > 512) goto error; } - if (x->ealg == NULL || x->ealg->alg_key_len == 0) + if (x->ealg == NULL) goto error; esp = kmalloc(sizeof(*esp), GFP_KERNEL); @@ -499,6 +499,7 @@ static struct inet6_protocol esp6_protocol = { .handler = xfrm6_rcv, .err_handler = esp6_err, + .no_policy = 1, }; int __init esp6_init(void) diff -urN linux-2.5.66-bk6/net/ipv6/ip6_input.c linux-2.5.66-bk7/net/ipv6/ip6_input.c --- linux-2.5.66-bk6/net/ipv6/ip6_input.c Mon Mar 24 14:01:13 2003 +++ linux-2.5.66-bk7/net/ipv6/ip6_input.c Tue Apr 1 04:40:45 2003 @@ -43,6 +43,7 @@ #include #include #include +#include @@ -149,7 +150,14 @@ hash = nexthdr & (MAX_INET_PROTOS - 1); if ((ipprot = inet6_protos[hash]) != NULL) { - int ret = ipprot->handler(&skb); + int ret; + + if (!ipprot->no_policy && + !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { + kfree_skb(skb); + return 0; + } + ret = ipprot->handler(&skb); if (ret < 0) { nexthdr = -ret; goto resubmit; @@ -157,9 +165,11 @@ IP6_INC_STATS_BH(Ip6InDelivers); } else { if (!raw_sk) { - IP6_INC_STATS_BH(Ip6InUnknownProtos); - icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, - offsetof(struct ipv6hdr, nexthdr)); + if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { + IP6_INC_STATS_BH(Ip6InUnknownProtos); + icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, + offsetof(struct ipv6hdr, nexthdr)); + } } else { IP6_INC_STATS_BH(Ip6InDelivers); kfree_skb(skb); diff -urN linux-2.5.66-bk6/net/ipv6/ip6_output.c linux-2.5.66-bk7/net/ipv6/ip6_output.c --- linux-2.5.66-bk6/net/ipv6/ip6_output.c Mon Mar 24 13:59:56 2003 +++ linux-2.5.66-bk7/net/ipv6/ip6_output.c Tue Apr 1 04:40:45 2003 @@ -50,6 +50,7 @@ #include #include #include +#include static __inline__ void ipv6_select_ident(struct sk_buff *skb, struct frag_hdr *fhdr) { @@ -747,6 +748,9 @@ if (ipv6_devconf.forwarding == 0) goto error; + if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) + goto drop; + skb->ip_summed = CHECKSUM_NONE; /* @@ -781,6 +785,9 @@ return -ETIMEDOUT; } + if (!xfrm6_route_forward(skb)) + goto drop; + /* IPv6 specs say nothing about it, but it is clear that we cannot send redirects to source routed frames. */ diff -urN linux-2.5.66-bk6/net/ipv6/raw.c linux-2.5.66-bk7/net/ipv6/raw.c --- linux-2.5.66-bk6/net/ipv6/raw.c Mon Mar 24 14:00:19 2003 +++ linux-2.5.66-bk7/net/ipv6/raw.c Tue Apr 1 04:40:45 2003 @@ -273,7 +273,6 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) { -#if defined(CONFIG_FILTER) if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) { /* FIXME: increment a raw6 drops counter here */ @@ -282,7 +281,7 @@ } skb->ip_summed = CHECKSUM_UNNECESSARY; } -#endif + /* Charge it to the socket. */ if (sock_queue_rcv_skb(sk,skb)<0) { /* FIXME: increment a raw6 drops counter here */ diff -urN linux-2.5.66-bk6/net/ipv6/tcp_ipv6.c linux-2.5.66-bk7/net/ipv6/tcp_ipv6.c --- linux-2.5.66-bk6/net/ipv6/tcp_ipv6.c Mon Mar 24 14:00:45 2003 +++ linux-2.5.66-bk7/net/ipv6/tcp_ipv6.c Tue Apr 1 04:40:45 2003 @@ -2193,6 +2193,7 @@ static struct inet6_protocol tcpv6_protocol = { .handler = tcp_v6_rcv, .err_handler = tcp_v6_err, + .no_policy = 1, }; extern struct proto_ops inet6_stream_ops; diff -urN linux-2.5.66-bk6/net/ipv6/udp.c linux-2.5.66-bk7/net/ipv6/udp.c --- linux-2.5.66-bk6/net/ipv6/udp.c Tue Apr 1 04:40:33 2003 +++ linux-2.5.66-bk7/net/ipv6/udp.c Tue Apr 1 04:40:45 2003 @@ -547,7 +547,6 @@ return -1; } -#if defined(CONFIG_FILTER) if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) { UDP6_INC_STATS_BH(UdpInErrors); @@ -556,7 +555,7 @@ } skb->ip_summed = CHECKSUM_UNNECESSARY; } -#endif + if (sock_queue_rcv_skb(sk,skb)<0) { UDP6_INC_STATS_BH(UdpInErrors); kfree_skb(skb); @@ -955,6 +954,7 @@ static struct inet6_protocol udpv6_protocol = { .handler = udpv6_rcv, .err_handler = udpv6_err, + .no_policy = 1, }; #define LINE_LEN 190 diff -urN linux-2.5.66-bk6/net/ipv6/xfrm6_input.c linux-2.5.66-bk7/net/ipv6/xfrm6_input.c --- linux-2.5.66-bk6/net/ipv6/xfrm6_input.c Mon Mar 24 14:01:52 2003 +++ linux-2.5.66-bk7/net/ipv6/xfrm6_input.c Tue Apr 1 04:40:45 2003 @@ -186,6 +186,8 @@ xfrm_vec[xfrm_nr++] = x; + iph = skb->nh.ipv6h; + if (x->props.mode) { /* XXX */ if (iph->nexthdr != IPPROTO_IPV6) goto drop; @@ -199,9 +201,11 @@ goto drop; } while (!err); - memcpy(skb->nh.raw, tmp_hdr, hdr_len); - skb->nh.raw[nh_offset] = nexthdr; - skb->nh.ipv6h->payload_len = htons(hdr_len + skb->len - sizeof(struct ipv6hdr)); + if (!decaps) { + memcpy(skb->nh.raw, tmp_hdr, hdr_len); + skb->nh.raw[nh_offset] = nexthdr; + skb->nh.ipv6h->payload_len = htons(hdr_len + skb->len - sizeof(struct ipv6hdr)); + } /* Allocate new secpath or COW existing one. */ if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { diff -urN linux-2.5.66-bk6/net/netsyms.c linux-2.5.66-bk7/net/netsyms.c --- linux-2.5.66-bk6/net/netsyms.c Tue Apr 1 04:40:34 2003 +++ linux-2.5.66-bk7/net/netsyms.c Tue Apr 1 04:40:45 2003 @@ -171,10 +171,8 @@ EXPORT_SYMBOL(sock_map_fd); EXPORT_SYMBOL(sockfd_lookup); -#ifdef CONFIG_FILTER EXPORT_SYMBOL(sk_run_filter); EXPORT_SYMBOL(sk_chk_filter); -#endif EXPORT_SYMBOL(neigh_table_init); EXPORT_SYMBOL(neigh_table_clear); diff -urN linux-2.5.66-bk6/net/packet/af_packet.c linux-2.5.66-bk7/net/packet/af_packet.c --- linux-2.5.66-bk6/net/packet/af_packet.c Mon Mar 24 14:00:55 2003 +++ linux-2.5.66-bk7/net/packet/af_packet.c Tue Apr 1 04:40:45 2003 @@ -401,9 +401,7 @@ struct packet_opt *po; u8 * skb_head = skb->data; int skb_len = skb->len; -#ifdef CONFIG_FILTER unsigned snaplen; -#endif if (skb->pkt_type == PACKET_LOOPBACK) goto drop; @@ -429,7 +427,6 @@ } } -#ifdef CONFIG_FILTER snaplen = skb->len; if (sk->filter) { @@ -446,7 +443,6 @@ if (snaplen > res) snaplen = res; } -#endif /* CONFIG_FILTER */ if (atomic_read(&sk->rmem_alloc) + skb->truesize >= (unsigned)sk->rcvbuf) goto drop_n_acct; @@ -475,10 +471,8 @@ if (dev->hard_header_parse) sll->sll_halen = dev->hard_header_parse(skb, sll->sll_addr); -#ifdef CONFIG_FILTER if (pskb_trim(skb, snaplen)) goto drop_n_acct; -#endif skb_set_owner_r(skb, sk); skb->dev = NULL; @@ -494,9 +488,7 @@ po->stats.tp_drops++; spin_unlock(&sk->receive_queue.lock); -#ifdef CONFIG_FILTER drop_n_restore: -#endif if (skb_head != skb->data && skb_shared(skb)) { skb->data = skb_head; skb->len = skb_len; @@ -539,7 +531,6 @@ snaplen = skb->len; -#ifdef CONFIG_FILTER if (sk->filter) { unsigned res = snaplen; struct sk_filter *filter; @@ -554,7 +545,6 @@ if (snaplen > res) snaplen = res; } -#endif if (sk->type == SOCK_DGRAM) { macoff = netoff = TPACKET_ALIGN(TPACKET_HDRLEN) + 16; diff -urN linux-2.5.66-bk6/net/sctp/ipv6.c linux-2.5.66-bk7/net/sctp/ipv6.c --- linux-2.5.66-bk6/net/sctp/ipv6.c Mon Mar 24 14:00:49 2003 +++ linux-2.5.66-bk7/net/sctp/ipv6.c Tue Apr 1 04:40:46 2003 @@ -680,6 +680,7 @@ static struct inet6_protocol sctpv6_protocol = { .handler = sctp6_rcv, .err_handler = sctp_v6_err, + .no_policy = 1, }; static struct sctp_af sctp_ipv6_specific = { diff -urN linux-2.5.66-bk6/net/sctp/protocol.c linux-2.5.66-bk7/net/sctp/protocol.c --- linux-2.5.66-bk6/net/sctp/protocol.c Mon Mar 24 14:00:49 2003 +++ linux-2.5.66-bk7/net/sctp/protocol.c Tue Apr 1 04:40:46 2003 @@ -776,6 +776,7 @@ static struct inet_protocol sctp_protocol = { .handler = sctp_rcv, .err_handler = sctp_v4_err, + .no_policy = 1, }; /* IPv4 address related functions. */ diff -urN linux-2.5.66-bk6/net/socket.c linux-2.5.66-bk7/net/socket.c --- linux-2.5.66-bk6/net/socket.c Tue Apr 1 04:40:34 2003 +++ linux-2.5.66-bk7/net/socket.c Tue Apr 1 04:40:46 2003 @@ -1692,6 +1692,8 @@ cmsg_ptr = (unsigned long)msg_sys.msg_control; msg_sys.msg_flags = 0; + if (MSG_CMSG_COMPAT & flags) + msg_sys.msg_flags = MSG_CMSG_COMPAT; if (sock->file->f_flags & O_NONBLOCK) flags |= MSG_DONTWAIT; @@ -1709,7 +1711,8 @@ if (err) goto out_freeiov; if (MSG_CMSG_COMPAT & flags) - err = put_compat_msg_controllen(&msg_sys, msg_compat, cmsg_ptr); + err = __put_user((unsigned long)msg_sys.msg_control-cmsg_ptr, + &msg_compat->msg_controllen); else err = __put_user((unsigned long)msg_sys.msg_control-cmsg_ptr, &msg->msg_controllen);