├── doc ├── ip46nat-users-guide.odt └── ip46nat-users-guide.pdf ├── ip46nat-module ├── CHANGELOG ├── Makefile └── ip46nat.c ├── README ├── kernel-patch ├── ip46nat-2.6.32.27-misc.patch └── ip46nat-2.6.32.27-module.patch ├── openwrt-patches └── openwrt-backfire-r24521-ip46nat.patch └── kernel-configs └── config-2.6.32.27 /doc/ip46nat-users-guide.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomaszmrugalski/ip46nat/HEAD/doc/ip46nat-users-guide.odt -------------------------------------------------------------------------------- /doc/ip46nat-users-guide.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomaszmrugalski/ip46nat/HEAD/doc/ip46nat-users-guide.pdf -------------------------------------------------------------------------------- /ip46nat-module/CHANGELOG: -------------------------------------------------------------------------------- 1 | 2011-10-14 2 | - Added parameter for v6prefixlen and changed default IPv6 Prefix length 3 | value to 128 4 | 2011-09-11 5 | - Fixed performance issue. Debug messages are no longer printed. 6 | Result: bandwidth increased from 60kb/s to 1,5MB/s 7 | 2011-03-12 8 | - User's Guide updated 9 | - Various improvements in ip46nat.c 10 | 11 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ip46nat 2 | ======= 3 | 4 | Goal of this project was to provide robust, fast, completely stateless IPv4-IPv6 translation. 5 | It provides a Linux kernel module for the best efficiency. 6 | 7 | Author: 8 | Tomek Mrugalski 9 | 10 | Homepage: 11 | http://klub.com.pl/ip46nat/ 12 | 13 | Status: 14 | Project concluded. Please contact author if you'd like to resume development of this work. 15 | 16 | License: 17 | GNU GPL v2 (this is only a small patch for old Linux kernel) 18 | -------------------------------------------------------------------------------- /ip46nat-module/Makefile: -------------------------------------------------------------------------------- 1 | # to compile this module (as a separate module, not integrated to 2 | # kernel tree), use fololwing command: 3 | # make -C /path/to/your/linux/source SUBDIRS=$PWD modules 4 | # 5 | # e.g. 6 | # make -C /usr/src/linux-2.6.23 SUBDIRS=$PWD modules 7 | # 8 | 9 | build-and-copy: 10 | $(MAKE) -C /usr/src/linux-source-2.6.25 SUBDIRS=$(PWD) modules 11 | cp -f ip46nat.ko /usr/src/modules/ 12 | 13 | clean: 14 | rm -f *.mod.c *.ko *.o Module.symvers modules.order 15 | 16 | DIR=`basename $(PWD)` 17 | 18 | snapshot: clean 19 | rm -f ip46nat-`date +%Y%m%d`.tar.gz 20 | cd ..; tar czf ip46nat.tar.gz $(DIR) 21 | mv ../ip46nat.tar.gz ip46nat-`date +%Y%m%d`.tar.gz 22 | echo "Snapshot has been stored in the ip46nat-`date +%Y%m%d`.tar.gz file." 23 | 24 | openwrt: 25 | cp ip46nat.c /home/thomson/devel/openwrt/kamikaze-12386/build_dir/linux-brcm47xx/linux-2.6.25.16/net/ipv6/ 26 | make -C /home/thomson/devel/openwrt/kamikaze-12386/ V=99 27 | 28 | obj-m := ip46nat.o 29 | 30 | .PHONY: clean build-and-copy snapshot 31 | -------------------------------------------------------------------------------- /kernel-patch/ip46nat-2.6.32.27-misc.patch: -------------------------------------------------------------------------------- 1 | diff -r -u linux-2.6.32.27-org/net/ipv4/ip_forward.c linux-2.6.32.27/net/ipv4/ip_forward.c 2 | --- linux-2.6.32.27-org/net/ipv4/ip_forward.c 2010-12-09 22:29:45.000000000 +0100 3 | +++ linux-2.6.32.27/net/ipv4/ip_forward.c 2010-12-12 22:40:30.000000000 +0100 4 | @@ -129,3 +129,5 @@ 5 | kfree_skb(skb); 6 | return NET_RX_DROP; 7 | } 8 | + 9 | +EXPORT_SYMBOL(ip_forward); 10 | diff -r -u linux-2.6.32.27-org/net/ipv6/ip6_output.c linux-2.6.32.27/net/ipv6/ip6_output.c 11 | --- linux-2.6.32.27-org/net/ipv6/ip6_output.c 2010-12-09 22:29:45.000000000 +0100 12 | +++ linux-2.6.32.27/net/ipv6/ip6_output.c 2010-12-12 22:41:29.000000000 +0100 13 | @@ -1545,3 +1545,5 @@ 14 | 15 | ip6_cork_release(inet_sk(sk), inet6_sk(sk)); 16 | } 17 | + 18 | +EXPORT_SYMBOL(ip6_forward); 19 | diff -r -u linux-2.6.32.27-org/net/ipv6/Kconfig linux-2.6.32.27/net/ipv6/Kconfig 20 | --- linux-2.6.32.27-org/net/ipv6/Kconfig 2010-12-09 22:29:45.000000000 +0100 21 | +++ linux-2.6.32.27/net/ipv6/Kconfig 2010-12-12 22:46:51.000000000 +0100 22 | @@ -182,6 +182,22 @@ 23 | 24 | If unsure, say N. 25 | 26 | +config IP46_NAT 27 | + tristate "IPv4-IPv6 NAT translator" 28 | + ---help--- 29 | + Performs IPv4-IPv6 NAT. See http://klub.com.pl/ip46nat/ for details. 30 | + Before using this module, make sure that you have IPv4 and IPv6 routing 31 | + configured properly, that both IPv4 and IPv6 forwarding is enabled. 32 | + Then load module using following command: 33 | + 34 | + modprobe ip46nat v6prefixm=2000:: v6prefixp=3000:: v4addr=192.168.1.0 35 | + It will then NAT all IPv4 packets coming from 192.168.1.0/24 to 36 | + IPv6 packets. Expanded (IPv4 to IPv6) address will be in form: 37 | + src=v6prefixp+IPv4.src dst=v6prefixm+IPv4.dst 38 | + Symmetrical reverse traffic (IPv6->IPv4) will also be supported. 39 | + 40 | + If you don't understand this, say N. 41 | + 42 | config IPV6_MULTIPLE_TABLES 43 | bool "IPv6: Multiple Routing Tables" 44 | depends on EXPERIMENTAL 45 | diff -r -u linux-2.6.32.27-org/net/ipv6/Makefile linux-2.6.32.27/net/ipv6/Makefile 46 | --- linux-2.6.32.27-org/net/ipv6/Makefile 2010-12-09 22:29:45.000000000 +0100 47 | +++ linux-2.6.32.27/net/ipv6/Makefile 2010-12-12 22:47:54.000000000 +0100 48 | @@ -40,3 +40,5 @@ 49 | obj-y += addrconf_core.o exthdrs_core.o 50 | 51 | obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o 52 | + 53 | +obj-$(CONFIG_IP46_NAT) += ip46nat.o 54 | diff -r -u linux-2.6.32.27-org/net/ipv6/route.c linux-2.6.32.27/net/ipv6/route.c 55 | --- linux-2.6.32.27-org/net/ipv6/route.c 2010-12-09 22:29:45.000000000 +0100 56 | +++ linux-2.6.32.27/net/ipv6/route.c 2010-12-12 22:42:54.000000000 +0100 57 | @@ -803,6 +803,8 @@ 58 | skb_dst_set(skb, fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input)); 59 | } 60 | 61 | +EXPORT_SYMBOL(ip_route_input); 62 | + 63 | static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table, 64 | struct flowi *fl, int flags) 65 | { 66 | -------------------------------------------------------------------------------- /openwrt-patches/openwrt-backfire-r24521-ip46nat.patch: -------------------------------------------------------------------------------- 1 | Index: target/linux/brcm47xx/config-2.6.32 2 | =================================================================== 3 | --- target/linux/brcm47xx/config-2.6.32 (wersja 24521) 4 | +++ target/linux/brcm47xx/config-2.6.32 (kopia robocza) 5 | @@ -1,7 +1,6 @@ 6 | - 7 | CONFIG_32BIT=y 8 | # CONFIG_64BIT is not set 9 | -# CONFIG_ALCHEMY_GPIO_INDIRECT is not set 10 | +# CONFIG_ALCHEMY_GPIO_INDIRECT is not set 11 | # CONFIG_AR7 is not set 12 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set 13 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set 14 | @@ -11,33 +10,31 @@ 15 | CONFIG_ARCH_SUPPORTS_OPROFILE=y 16 | CONFIG_ARCH_SUSPEND_POSSIBLE=y 17 | # CONFIG_ARPD is not set 18 | -CONFIG_B44_PCI_AUTOSELECT=y 19 | -CONFIG_B44_PCICORE_AUTOSELECT=y 20 | -CONFIG_B44_PCI=y 21 | CONFIG_B44=y 22 | -CONFIG_BCM47XX_WDT=y 23 | +CONFIG_B44_PCI=y 24 | +CONFIG_B44_PCICORE_AUTOSELECT=y 25 | +CONFIG_B44_PCI_AUTOSELECT=y 26 | CONFIG_BCM47XX=y 27 | +CONFIG_BCM47XX_WDT=y 28 | # CONFIG_BCM63XX is not set 29 | -# CONFIG_BINARY_PRINTF is not set 30 | CONFIG_BITREVERSE=y 31 | # CONFIG_BSD_PROCESS_ACCT is not set 32 | # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set 33 | # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set 34 | -CONFIG_CEVT_R4K_LIB=y 35 | CONFIG_CEVT_R4K=y 36 | +CONFIG_CEVT_R4K_LIB=y 37 | CONFIG_CFE=y 38 | +CONFIG_CFG80211_DEFAULT_PS_VALUE=0 39 | CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" 40 | # CONFIG_CPU_BIG_ENDIAN is not set 41 | # CONFIG_CPU_CAVIUM_OCTEON is not set 42 | -CONFIG_CPU_HAS_LLSC=y 43 | CONFIG_CPU_HAS_PREFETCH=y 44 | CONFIG_CPU_HAS_SYNC=y 45 | CONFIG_CPU_LITTLE_ENDIAN=y 46 | # CONFIG_CPU_LOONGSON2E is not set 47 | -# CONFIG_CPU_LOONGSON2 is not set 48 | +CONFIG_CPU_MIPS32=y 49 | CONFIG_CPU_MIPS32_R1=y 50 | # CONFIG_CPU_MIPS32_R2 is not set 51 | -CONFIG_CPU_MIPS32=y 52 | # CONFIG_CPU_MIPS64_R1 is not set 53 | # CONFIG_CPU_MIPS64_R2 is not set 54 | CONFIG_CPU_MIPSR1=y 55 | @@ -59,23 +56,16 @@ 56 | # CONFIG_CPU_TX39XX is not set 57 | # CONFIG_CPU_TX49XX is not set 58 | # CONFIG_CPU_VR41XX is not set 59 | -CONFIG_CRYPTO_AEAD2=y 60 | -CONFIG_CRYPTO_BLKCIPHER2=y 61 | -CONFIG_CRYPTO_HASH2=y 62 | -CONFIG_CRYPTO_MANAGER2=y 63 | -CONFIG_CRYPTO_RNG2=y 64 | -CONFIG_CRYPTO_WORKQUEUE=y 65 | -CONFIG_CSRC_R4K_LIB=y 66 | CONFIG_CSRC_R4K=y 67 | +CONFIG_CSRC_R4K_LIB=y 68 | CONFIG_DECOMPRESS_LZMA=y 69 | CONFIG_DEVPORT=y 70 | -CONFIG_DM_LOG_USERSPACE=n 71 | # CONFIG_DM9000 is not set 72 | CONFIG_DMA_NEED_PCI_MAP_STATE=y 73 | CONFIG_DMA_NONCOHERENT=y 74 | # CONFIG_FSNOTIFY is not set 75 | -CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 76 | CONFIG_GENERIC_CLOCKEVENTS=y 77 | +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 78 | CONFIG_GENERIC_CMOS_UPDATE=y 79 | CONFIG_GENERIC_FIND_LAST_BIT=y 80 | CONFIG_GENERIC_FIND_NEXT_BIT=y 81 | @@ -87,22 +77,24 @@ 82 | CONFIG_HAS_IOMEM=y 83 | CONFIG_HAS_IOPORT=y 84 | CONFIG_HAVE_ARCH_KGDB=y 85 | -# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set 86 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y 87 | CONFIG_HAVE_IDE=y 88 | -CONFIG_HAVE_MLOCK=y 89 | CONFIG_HAVE_OPROFILE=y 90 | CONFIG_HW_HAS_PCI=y 91 | CONFIG_HW_RANDOM=y 92 | -# CONFIG_HZ_100 is not set 93 | CONFIG_HZ=250 94 | +# CONFIG_HZ_100 is not set 95 | CONFIG_HZ_250=y 96 | +CONFIG_INET6_TUNNEL=m 97 | +CONFIG_INET_TUNNEL=m 98 | CONFIG_INITRAMFS_SOURCE="" 99 | +CONFIG_IPV6=m 100 | +CONFIG_IPV6_SIT=m 101 | +CONFIG_IPV6_TUNNEL=m 102 | # CONFIG_IP_ROUTE_VERBOSE is not set 103 | CONFIG_IRQ_CPU=y 104 | CONFIG_KALLSYMS=y 105 | CONFIG_LEDS_GPIO=y 106 | -# CONFIG_LEMOTE_FULONG is not set 107 | # CONFIG_MACH_ALCHEMY is not set 108 | # CONFIG_MACH_DECSTATION is not set 109 | # CONFIG_MACH_JAZZ is not set 110 | @@ -111,6 +103,7 @@ 111 | # CONFIG_MACH_TX49XX is not set 112 | # CONFIG_MACH_VR41XX is not set 113 | # CONFIG_MIKROTIK_RB532 is not set 114 | +CONFIG_MIPS=y 115 | # CONFIG_MIPS_COBALT is not set 116 | CONFIG_MIPS_L1_CACHE_SHIFT=5 117 | # CONFIG_MIPS_MACHINE is not set 118 | @@ -119,7 +112,6 @@ 119 | # CONFIG_MIPS_MT_SMP is not set 120 | # CONFIG_MIPS_MT_SMTC is not set 121 | # CONFIG_MIPS_SIM is not set 122 | -CONFIG_MIPS=y 123 | CONFIG_MTD_BCM47XX=y 124 | # CONFIG_NO_IOPORT is not set 125 | # CONFIG_NXP_STB220 is not set 126 | @@ -132,7 +124,6 @@ 127 | # CONFIG_PMC_YOSEMITE is not set 128 | # CONFIG_PNX8550_JBS is not set 129 | # CONFIG_PNX8550_STB810 is not set 130 | -# CONFIG_PROBE_INITRD_HEADER is not set 131 | # CONFIG_PROC_KCORE is not set 132 | CONFIG_SCHED_OMIT_FRAME_POINTER=y 133 | # CONFIG_SCSI_DMA is not set 134 | @@ -153,32 +144,29 @@ 135 | # CONFIG_SIBYTE_RHONE is not set 136 | # CONFIG_SIBYTE_SENTOSA is not set 137 | # CONFIG_SIBYTE_SWARM is not set 138 | -# CONFIG_SLOW_WORK is not set 139 | +CONFIG_SSB=y 140 | CONFIG_SSB_B43_PCI_BRIDGE=y 141 | +CONFIG_SSB_BLOCKIO=y 142 | CONFIG_SSB_DEBUG=y 143 | CONFIG_SSB_DRIVER_EXTIF=y 144 | CONFIG_SSB_DRIVER_GIGE=y 145 | CONFIG_SSB_DRIVER_MIPS=y 146 | -CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y 147 | CONFIG_SSB_DRIVER_PCICORE=y 148 | +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y 149 | CONFIG_SSB_EMBEDDED=y 150 | CONFIG_SSB_PCICORE_HOSTMODE=y 151 | -CONFIG_SSB_PCIHOST_POSSIBLE=y 152 | CONFIG_SSB_PCIHOST=y 153 | +CONFIG_SSB_PCIHOST_POSSIBLE=y 154 | CONFIG_SSB_SERIAL=y 155 | CONFIG_SSB_SPROM=y 156 | -CONFIG_SSB=y 157 | CONFIG_SYS_HAS_CPU_MIPS32_R1=y 158 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y 159 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y 160 | CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y 161 | # CONFIG_TC35815 is not set 162 | -CONFIG_TRACING_SUPPORT=y 163 | CONFIG_TRAD_SIGNALS=y 164 | # CONFIG_TREE_PREEMPT_RCU is not set 165 | CONFIG_TREE_RCU=y 166 | -CONFIG_USB_EHCI_HCD_SSB=y 167 | -CONFIG_USB_OHCI_HCD_SSB=y 168 | CONFIG_USB_SUPPORT=y 169 | CONFIG_WATCHDOG_NOWAYOUT=y 170 | CONFIG_ZONE_DMA_FLAG=0 171 | Index: package/kernel/modules/netsupport.mk 172 | =================================================================== 173 | --- package/kernel/modules/netsupport.mk (wersja 24521) 174 | +++ package/kernel/modules/netsupport.mk (kopia robocza) 175 | @@ -661,3 +661,16 @@ 176 | 177 | $(eval $(call KernelPackage,pktgen)) 178 | 179 | +define KernelPackage/ip46nat 180 | + SUBMENU:=$(NETWORK_SUPPORT_MENU) 181 | + TITLE:=IPv4-IPv6 translator 182 | + DEPENDS:= @LINUX_2_6 183 | + KCONFIG:= CONFIG_IP46_NAT 184 | + FILES:= $(LINUX_DIR)/net/ipv6/ip46nat.$(LINUX_KMOD_SUFFIX) 185 | +endef 186 | + 187 | +define KernelPackage/ip46nat/description 188 | + Kernel modules for IPv4-IPv6 NAT 189 | +endef 190 | + 191 | +$(eval $(call KernelPackage,ip46nat)) 192 | -------------------------------------------------------------------------------- /kernel-patch/ip46nat-2.6.32.27-module.patch: -------------------------------------------------------------------------------- 1 | --- linux-2.6.32.27-org/net/ipv6/ip46nat.c 1970-01-01 01:00:00.000000000 +0100 2 | +++ linux-2.6.32.27/net/ipv6/ip46nat.c 2010-12-13 02:07:38.000000000 +0100 3 | @@ -0,0 +1,728 @@ 4 | +/* 5 | + * ip46nat.c - kernel module for performing IPv4-IPv6 NAT 6 | + * 7 | + * author: Tomasz Mrugalski 8 | + * 9 | + * released under GNU GPLv2 license. 10 | + * 11 | + */ 12 | + 13 | +#include 14 | +#include 15 | +#include 16 | +#include 17 | +#include 18 | +#include 19 | +#include 20 | +#include 21 | +#include 22 | +#include 23 | +#include 24 | + 25 | +#include 26 | +#include 27 | +#include 28 | + 29 | +#include 30 | + 31 | +MODULE_LICENSE("GPL"); 32 | +MODULE_AUTHOR("Tomasz Mrugalski"); 33 | +MODULE_DESCRIPTION("IPv4-IPv6 translator"); 34 | +#define MODULE_VERS "2010-12-12" 35 | +#define MODULE_NAME "ip46nat" 36 | + 37 | +#define V6PREFIX_MAX_LEN 64 38 | +#define V4ADDR_MAX_LEN 32 39 | + 40 | +static char v6prefixp_str[V6PREFIX_MAX_LEN]; 41 | +static char v6prefixm_str[V6PREFIX_MAX_LEN]; 42 | +static char v4addr_str[V4ADDR_MAX_LEN]; 43 | + 44 | +/* used as a src/dst "filler" during IPv4->IPv6 address expansion */ 45 | +static char v6prefixp[16]; /* source prefix */ 46 | +static char v6prefixm[16]; /* dst prefix */ 47 | +static int v6prefix_length = 64; 48 | + 49 | +/* used to match source address in incoming IPv4 packets */ 50 | +__u32 v4addr; 51 | +static int v4prefix_length = 24; 52 | + 53 | +struct cfg_t { 54 | + char v6prefixp[16]; /* src prefix */ 55 | + char v6prefixm[16]; /* dst prefix */ 56 | + int v6prefix_length; 57 | + 58 | + __u32 v4addr; /* v4 prefix */ 59 | + int v4prefix_length; 60 | +}; 61 | + 62 | +struct cfg_t cfg; 63 | + 64 | +module_param_string(v6prefixp, v6prefixp_str, V6PREFIX_MAX_LEN, 0); 65 | +module_param_string(v6prefixm, v6prefixm_str, V6PREFIX_MAX_LEN, 0); 66 | +module_param_string(v4addr, v4addr_str, V4ADDR_MAX_LEN, 0); 67 | + 68 | +struct packet_type ipv4_pkt; 69 | +struct packet_type ipv6_pkt; 70 | + 71 | +__u32 v4mask; 72 | + 73 | + 74 | +/* procfs data */ 75 | +static struct proc_dir_entry *procfs_dir, *procfs_stats_file, *procfs_params_file; 76 | +static struct cfg_t cfg_data; 77 | + 78 | +/* stats */ 79 | +static int cnt4to6 = 0; /* IPv4 to IPv6 nated */ 80 | +static int cnt6to4 = 0; /* IPv6 to IPv4 nated */ 81 | +static int cnt4rcv = 0; /* IPv4 received */ 82 | +static int cnt4snd = 0; /* IPv4 sent */ 83 | +static int cnt6rcv = 0; /* IPv6 received */ 84 | +static int cnt6snd = 0; /* IPv6 sent */ 85 | +static int cnt4drop_mtu = 0; /* IPv4 dropped due to too big size */ 86 | +static int cnt4drop_route = 0; /* IPv4 dropped due to missing route */ 87 | +static int cnt6drop_route = 0; /* IPv6 dropped due to missing route */ 88 | +static int cnt4xmit_errors = 0; /* IPv4 transmission errors */ 89 | +static int cnt6xmit_errors = 0; /* IPv6 transmission errors */ 90 | + 91 | +static int procfs_init(void); 92 | +static void procfs_exit(void); 93 | + 94 | + 95 | +/* ******************************************************************************** */ 96 | +/* *** utility functions ********************************************************** */ 97 | +/* ******************************************************************************** */ 98 | + 99 | +void in4_ntop(char * buf, int addr) 100 | +{ 101 | + sprintf(buf, "%d.%d.%d.%d", addr&0xff, (addr>>8)&0xff, (addr>>16)&0xff, (addr>>24)&0xff); 102 | +} 103 | + 104 | +void in6_ntop(char * dst, const unsigned char * src) 105 | +{ 106 | + const int NS_IN6ADDRSZ = 16; 107 | + const int NS_INT16SZ = 2; 108 | + 109 | + char tmp[40], *tp; // 40 - maximum size of expanded (no ::) IPv6 address 110 | + struct { int base, len; } best, cur; 111 | + u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; 112 | + int i; 113 | + 114 | + /* 115 | + * Preprocess: 116 | + * Copy the input (bytewise) array into a wordwise array. 117 | + * Find the longest run of 0x00's in src[] for :: shorthanding. 118 | + */ 119 | + memset(words, '\0', sizeof words); 120 | + for (i = 0; i < NS_IN6ADDRSZ; i += 2) 121 | + words[i / 2] = (src[i] << 8) | src[i + 1]; 122 | + best.base = -1; 123 | + cur.base = -1; 124 | + cur.len = 1; 125 | + best.len = 1; 126 | + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { 127 | + if (words[i] == 0) { 128 | + if (cur.base == -1) 129 | + cur.base = i, cur.len = 1; 130 | + else 131 | + cur.len++; 132 | + } else { 133 | + if (cur.base != -1) { 134 | + if (best.base == -1 || cur.len > best.len) 135 | + best = cur; 136 | + cur.base = -1; 137 | + } 138 | + } 139 | + } 140 | + if (cur.base != -1) { 141 | + if (best.base == -1 || cur.len > best.len) 142 | + best = cur; 143 | + } 144 | + if (best.base != -1 && best.len < 2) 145 | + best.base = -1; 146 | + 147 | + /* 148 | + * Format the result. 149 | + */ 150 | + tp = tmp; 151 | + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { 152 | + /* Are we inside the best run of 0x00's? */ 153 | + if (best.base != -1 && i >= best.base && 154 | + i < (best.base + best.len)) { 155 | + if (i == best.base) 156 | + *tp++ = ':'; 157 | + continue; 158 | + } 159 | + /* Are we following an initial run of 0x00s or any real hex? */ 160 | + if (i != 0) 161 | + *tp++ = ':'; 162 | + tp += sprintf(tp, "%x", words[i]); 163 | + } 164 | + /* Was it a trailing run of 0x00's? */ 165 | + if (best.base != -1 && (best.base + best.len) == 166 | + (NS_IN6ADDRSZ / NS_INT16SZ)) 167 | + *tp++ = ':'; 168 | + *tp++ = '\0'; 169 | + strcpy(dst, tmp); 170 | +} 171 | + 172 | +void in6_ntop2(char * buf, const struct in6_addr * addr) 173 | +{ 174 | + in6_ntop(buf, (char *)&addr->s6_addr); 175 | +} 176 | + 177 | +/* ******************************************************************************** */ 178 | +/* *** IPv4 -> IPv6 functions ***************************************************** */ 179 | +/* ******************************************************************************** */ 180 | +void ip6_update_csum(struct sk_buff * skb, struct ipv6hdr * ip6hdr) 181 | +{ 182 | + __wsum sum1=0; 183 | + __sum16 sum2=0; 184 | + __sum16 oldsum = 0; 185 | + 186 | + switch (ip6hdr->nexthdr) 187 | + { 188 | + case IPPROTO_TCP: 189 | + { 190 | + struct tcphdr *th = tcp_hdr(skb); 191 | + unsigned tcplen = 0; 192 | + oldsum = th->check; 193 | + tcplen = ntohs(ip6hdr->payload_len); /* TCP header + payload */ 194 | + 195 | + th->check = 0; 196 | + sum1 = csum_partial((char*)th, tcplen, 0); /* calculate checksum for TCP hdr+payload */ 197 | + sum2 = csum_ipv6_magic(&ip6hdr->saddr, &ip6hdr->daddr, tcplen, ip6hdr->nexthdr, sum1); /* add pseudoheader */ 198 | + 199 | + printk(KERN_ALERT " Updating TCP (over IPv6) checksum to %x (old=%x)\n", htons(sum2), htons(oldsum) ); 200 | + th->check = sum2; 201 | + break; 202 | + } 203 | + case IPPROTO_UDP: 204 | + { 205 | + struct udphdr *udp = udp_hdr(skb); 206 | + unsigned udplen = ntohs(ip6hdr->payload_len); /* UDP hdr + payload */ 207 | + 208 | + oldsum = udp->check; 209 | + udp->check = 0; 210 | + 211 | + sum1 = csum_partial((char*)udp, udplen, 0); /* calculate checksum for UDP hdr+payload */ 212 | + sum2 = csum_ipv6_magic(&ip6hdr->saddr, &ip6hdr->daddr, udplen, ip6hdr->nexthdr, sum1); /* add pseudoheader */ 213 | + 214 | + printk(KERN_ALERT " Updating UDP (over IPv6) checksum to %x (old=%x)\n", htons(sum2), htons(oldsum) ); 215 | + udp->check = sum2; 216 | + 217 | + break; 218 | + } 219 | + 220 | + case IPPROTO_ICMP: 221 | + break; 222 | + } 223 | +} 224 | + 225 | +static int ipv4_send_as_ipv6(struct sk_buff * skb) 226 | +{ 227 | + char buf1[32], buf2[32], buf3[64], buf4[64]; 228 | + char v6saddr[16], v6daddr[16]; 229 | + int err = -1; 230 | + int tclass = 0; 231 | + int flowlabel = 0; 232 | + int len; 233 | + 234 | + struct ipv6hdr * hdr6; 235 | + struct iphdr * hdr4 = ip_hdr(skb); 236 | + struct sk_buff * copy = 0; 237 | + in4_ntop(buf1, hdr4->saddr); 238 | + in4_ntop(buf2, hdr4->daddr); 239 | + 240 | + memcpy(v6saddr, v6prefixp, 16); 241 | + memcpy(v6daddr, v6prefixm, 16); 242 | + memcpy(v6saddr+12, &hdr4->saddr, 4); 243 | + memcpy(v6daddr+12, &hdr4->daddr, 4); 244 | + in6_ntop(buf3, v6saddr); 245 | + in6_ntop(buf4, v6daddr); 246 | + 247 | + printk(KERN_ALERT " IPv4(src=%s, dst=%s)->IPv6(src=%s,dst=%s)\n", buf1, buf2,buf3,buf4); 248 | + 249 | + if (ntohs(hdr4->tot_len) > 1480) { 250 | + printk(KERN_ALERT "#Too large IPv4 (len=%d) received, dropped. %d such errors so far.\n", 251 | + ntohs(hdr4->tot_len), ++cnt4drop_mtu); 252 | + return -1; 253 | + } 254 | + 255 | + len = skb->tail - skb->data; 256 | + 257 | + /* create new skb */ 258 | + copy = skb_copy(skb, GFP_ATOMIC); // other possible option: GFP_ATOMIC 259 | + 260 | + /* Remove any debris in the socket control block */ 261 | + memset(IPCB(copy), 0, sizeof(struct inet_skb_parm)); 262 | + 263 | + /* expand header (add 20 extra bytes at the beginning of sk_buff) */ 264 | + pskb_expand_head(copy, 20, 0, GFP_ATOMIC); 265 | + 266 | + skb_push(copy, sizeof(struct ipv6hdr) - sizeof(struct iphdr)); /* push boundary by extra 20 bytes */ 267 | + 268 | + skb_reset_network_header(copy); 269 | + skb_set_transport_header(copy,40); /* transport (TCP/UDP/ICMP/...) header starts after 40 bytes */ 270 | + 271 | + /* printk(KERN_ALERT "#### skb->len=%d len=%d copy->len=%d\n", skb->len, len, copy->len); */ 272 | + 273 | + hdr6 = ipv6_hdr(copy); 274 | + 275 | + /* build IPv6 header */ 276 | + tclass = 0; /* traffic class */ 277 | + *(__be32 *)hdr6 = htonl(0x60000000 | (tclass << 20)) | flowlabel; /* version, priority, flowlabel */ 278 | + hdr6->payload_len = htons(ntohs(hdr4->tot_len) - sizeof(struct iphdr)); /* IPv6 length is a payload length, IPv4 is hdr+payload */ 279 | + hdr6->nexthdr = hdr4->protocol; 280 | + hdr6->hop_limit = hdr4->ttl; 281 | + memcpy(&hdr6->saddr, v6saddr, 16); 282 | + memcpy(&hdr6->daddr, v6daddr, 16); 283 | + 284 | + copy->priority = skb->priority; 285 | + copy->mark = skb->mark; 286 | + copy->protocol = htons(ETH_P_IPV6); 287 | + 288 | + ip6_update_csum(copy, hdr6); 289 | + 290 | + ip6_route_input(copy); 291 | + if (skb_dst(copy) == NULL) { 292 | + printk(KERN_ALERT "#Unable to find route, IPv6 packet not sent (%d IPv6 route errors so far)\n", ++cnt6drop_route); 293 | + return -1; 294 | + } 295 | + 296 | + if (dst_mtu(skb_dst(copy))==0) { 297 | + printk(KERN_ALERT "#Route with mtu=0 found, IPv6 packet not sent (%d IPv6 route errors so far).\n", ++cnt6drop_route); 298 | + return -1; 299 | + } 300 | + 301 | + err = ip6_forward(copy); 302 | + if (err==0) { 303 | + /* packet sent successfully */ 304 | + cnt6snd++; 305 | + cnt4to6++; 306 | + } else { 307 | + printk(KERN_ALERT "#IPv4->IPv6: Packet transmission (ip6_forward()) failed. Errors so far: %d\n", ++cnt6xmit_errors); 308 | + } 309 | + 310 | + /* tbd: should skb be released here? */ 311 | + 312 | + return 0; 313 | +} 314 | + 315 | +static int ipv4_handler(struct sk_buff *skb,struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) 316 | +{ 317 | + struct iphdr * hdr = ip_hdr(skb); 318 | + static char buf1[32], buf2[32], buf3[32]; 319 | + 320 | + int process = 0; 321 | + int mcast = 0; 322 | + 323 | + cnt4rcv++; 324 | + 325 | + in4_ntop(buf1, hdr->saddr); 326 | + in4_ntop(buf2, hdr->daddr); 327 | + in4_ntop(buf3, (v4addr & v4mask) ); 328 | + 329 | + /* IPv4 address pattern checking */ 330 | + if ( (hdr->saddr & v4mask) == (v4addr & v4mask) ) 331 | + process = 1; 332 | + 333 | + if ((hdr->daddr >> 24) >= 224) 334 | + mcast = 1; /* that's multicast */ 335 | + 336 | + printk(KERN_ALERT "#IPv4 rcvd (rcvd so far: %d) [src=%s, dst=%s,looking for %s/%d]%s\n", cnt4rcv, buf1, buf2, 337 | + buf3, v4prefix_length, process?(mcast?"M":"*"):""); 338 | + 339 | + if (process && !mcast) 340 | + ipv4_send_as_ipv6(skb); 341 | + 342 | + kfree_skb(skb); 343 | + return 1; 344 | +} 345 | + 346 | +/* ******************************************************************************** */ 347 | +/* *** IPv6 -> IPv4 functions ***************************************************** */ 348 | +/* ******************************************************************************** */ 349 | +void ipv4_update_csum(struct sk_buff * skb, struct iphdr *iph) 350 | +{ 351 | + __wsum sum1=0; 352 | + __sum16 sum2=0; 353 | + __sum16 oldsum=0; 354 | + 355 | + int iphdrlen = ip_hdrlen(skb); 356 | + 357 | + switch (iph->protocol) 358 | + { 359 | + case IPPROTO_TCP: 360 | + { 361 | + /* ripped from tcp_v4_send_check fro tcp_ipv4.c */ 362 | + struct tcphdr *th = tcp_hdr(skb); 363 | + unsigned tcplen = 0; 364 | + 365 | + /* printk(KERN_ALERT "iph=%p th=%p copy->len=%d, th->check=%x iphdrlen=%d thlen=%d\n", 366 | + iph, th, skb->len, ntohs(th->check), iphdrlen, thlen); */ 367 | + 368 | + skb->csum = 0; 369 | + skb->ip_summed = CHECKSUM_COMPLETE; 370 | + 371 | + // calculate payload 372 | + oldsum = th->check; 373 | + th->check = 0; 374 | + tcplen = ntohs(iph->tot_len) - iphdrlen; /* skb->len - iphdrlen; (may cause trouble due to padding) */ 375 | + sum1 = csum_partial((char*)th, tcplen, 0); /* calculate checksum for TCP hdr+payload */ 376 | + sum2 = csum_tcpudp_magic(iph->saddr, iph->daddr, tcplen, iph->protocol, sum1); /* add pseudoheader */ 377 | + printk(KERN_ALERT " Updating TCP (over IPv4) checksum to %04x (oldsum=%04x)\n", htons(sum2), htons(oldsum)); 378 | + 379 | + th->check = sum2; 380 | + 381 | + break; 382 | + } 383 | + case IPPROTO_UDP: 384 | + { 385 | + struct udphdr *udp = udp_hdr(skb); 386 | + unsigned udplen = 0; 387 | + 388 | + 389 | + oldsum = udp->check; 390 | + udp->check = 0; 391 | + udplen = ntohs(iph->tot_len) - iphdrlen; 392 | + 393 | + sum1 = csum_partial((char*)udp, udplen, 0); 394 | + sum2 = csum_tcpudp_magic(iph->saddr, iph->daddr, udplen, iph->protocol, sum1); 395 | + udp->check = sum2; 396 | + printk(KERN_ALERT " Updating UDP (over IPv4) checksum to %04x (oldsum=%04x)\n", htons(sum2), htons(oldsum) ); 397 | + 398 | + break; 399 | + } 400 | + case IPPROTO_ICMP: 401 | + { 402 | + /* do nothing here. ICMP does not use pseudoheaders for checksum calculation. */ 403 | + break; 404 | + } 405 | + default: 406 | + break; 407 | + } 408 | +} 409 | + 410 | +static int ipv6_send_as_ipv4(struct sk_buff * skb) 411 | +{ 412 | + struct ipv6hdr * hdr = ipv6_hdr(skb); 413 | + struct iphdr * iph; 414 | + char buf1[64], buf2[64], buf3[64], buf4[64]; 415 | + __u32 v4saddr, v4daddr; 416 | + struct sk_buff * copy = 0; 417 | + int err = -1; 418 | + int truncSize = 0; 419 | + 420 | + in6_ntop2(buf1,&hdr->saddr); 421 | + in6_ntop2(buf2,&hdr->daddr); 422 | + 423 | + v4saddr = *( (__u32*)&(hdr->saddr.s6_addr[12]) ); 424 | + v4daddr = *( (__u32*)&(hdr->daddr.s6_addr[12]) ); 425 | + 426 | + in4_ntop(buf3, v4saddr); 427 | + in4_ntop(buf4, v4daddr); 428 | + 429 | + printk(KERN_ALERT " IPv6(src=%s,dst=%s)->IPv4(src=%s,dst=%s)\n", buf1, buf2, buf3, buf4); 430 | + 431 | + copy = skb_copy(skb, GFP_ATOMIC); // other possible option: GFP_ATOMIC 432 | + 433 | + /* Remove any debris in the socket control block */ 434 | + memset(IPCB(copy), 0, sizeof(struct inet_skb_parm)); 435 | + 436 | + /* modify packet: actual IPv6->IPv4 transformation */ 437 | + truncSize = sizeof(struct ipv6hdr) - sizeof(struct iphdr); /* chop first 20 bytes */ 438 | + skb_pull(copy, truncSize); 439 | + skb_reset_network_header(copy); 440 | + skb_set_transport_header(copy,20); /* transport (TCP/UDP/ICMP/...) header starts after 20 bytes */ 441 | + 442 | + /* build IPv4 header */ 443 | + iph = ip_hdr(copy); 444 | + iph->ttl = hdr->hop_limit; 445 | + iph->saddr = v4saddr; 446 | + iph->daddr = v4daddr; 447 | + iph->protocol = hdr->nexthdr; 448 | + *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (0x00/*tos*/ & 0xff)); 449 | + iph->frag_off = htons(IP_DF); 450 | + /* iph->tot_len = htons(copy->len); // almost good, but it may cause troubles with sizeof(IPv6 pkt)<64 (padding issue) */ 451 | + iph->tot_len = htons( ntohs(hdr->payload_len)+ 20 /*sizeof(ipv4hdr)*/ ); 452 | + iph->check = 0; 453 | + iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); 454 | + copy->protocol = htons(ETH_P_IP); 455 | + 456 | + ipv4_update_csum(copy, iph); /* update L4 (TCP/UDP/ICMP) checksum */ 457 | + 458 | + /* try to find route for this packet */ 459 | + err = ip_route_input(copy, v4daddr, v4saddr, 0, copy->dev); 460 | + 461 | + if (err==0) { 462 | + err = ip_forward(copy); 463 | + if (err == 0) { 464 | + cnt6to4++; 465 | + cnt4snd++; 466 | + } else { 467 | + printk(KERN_ALERT "#IPv6->IPv4: Unable to send packet (ip_forward failed). %d such errors so far.\n", ++cnt4xmit_errors); 468 | + } 469 | + } else { 470 | + printk(KERN_ALERT "# Unable to find route, packet dropped. (%d failed routes for IPv4 so far)\n", ++cnt4drop_route); 471 | + } 472 | + 473 | + /* TBD: should copy be released here? */ 474 | + 475 | + return 1; 476 | +} 477 | + 478 | +static int ipv6_handler(struct sk_buff *skb,struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) 479 | +{ 480 | + struct ipv6hdr * hdr = ipv6_hdr(skb); 481 | + char buf1[64], buf2[64], buf3[64], buf4[64]; 482 | + int process = 0; 483 | + 484 | + cnt6rcv++; 485 | + 486 | + in6_ntop2(buf1, &hdr->saddr); /* received src */ 487 | + in6_ntop2(buf2, &hdr->daddr); /* received dst */ 488 | + in6_ntop(buf3, v6prefixm); /* expected src */ 489 | + in6_ntop(buf4, v6prefixp); /* expected dst */ 490 | + 491 | + if (!memcmp(v6prefixm, hdr->saddr.s6_addr, v6prefix_length/8) && 492 | + !memcmp(v6prefixp, hdr->daddr.s6_addr, v6prefix_length/8) ) 493 | + { 494 | + process = 1; 495 | + } 496 | + 497 | + printk(KERN_ALERT "#IPv6 rcvd (rcvd so far: %d) [src=%s dst=%s, looking for %s/%d->%s/%d] %s\n", 498 | + cnt6rcv, buf1, buf2, buf3, v6prefix_length, buf4, v6prefix_length, process?"*":""); 499 | + 500 | + if (process) { 501 | + ipv6_send_as_ipv4(skb); 502 | + } 503 | + 504 | + kfree_skb(skb); 505 | + return 1; 506 | +} 507 | + 508 | + 509 | +/* ******************************************************************************** */ 510 | +/* *** kernel interface functions ************************************************* */ 511 | +/* ******************************************************************************** */ 512 | + 513 | +int check_init_params(void) 514 | +{ 515 | + const char * end; 516 | + int status = 0; 517 | + 518 | + if (!in6_pton(v6prefixp_str, V6PREFIX_MAX_LEN, v6prefixp, '\0', &end)) { 519 | + printk(KERN_ALERT "Unable to process v6prefixp parameter. Please define v6prefix (e.g. v6prefix=2000::123)\n"); 520 | + status = -1; // initialization failed 521 | + } 522 | + 523 | + if (!in6_pton(v6prefixm_str, V6PREFIX_MAX_LEN, v6prefixm, '\0', &end)) { 524 | + printk(KERN_ALERT "Unable to process v6prefixm parameter. Please define v6prefix (e.g. v6prefix=2000::123)\n"); 525 | + status = -1; // initialization failed 526 | + } 527 | + 528 | + if (!in4_pton(v4addr_str, V4ADDR_MAX_LEN, (u8 *)&v4addr, '\0', &end)) { 529 | + printk(KERN_ALERT "Unable to process v4addr parameter. Please define v4addr (e.g. v4addr=1.2.3.4).\n"); 530 | + status = -1; 531 | + } 532 | + 533 | + /* TODO: use cfg structure */ 534 | + cfg.v4addr = v4addr; 535 | + 536 | + return status; 537 | +} 538 | + 539 | +void register_handlers(void) 540 | +{ 541 | + memset(&ipv4_pkt, sizeof(ipv4_pkt), 0); 542 | + memset(&ipv6_pkt, sizeof(ipv6_pkt), 0); 543 | + 544 | + /* register IPv4 packet handler */ 545 | + ipv4_pkt.type = htons(ETH_P_IP); 546 | + ipv4_pkt.dev = NULL; 547 | + ipv4_pkt.func = ipv4_handler; 548 | + dev_add_pack(&ipv4_pkt); 549 | + 550 | + /* register IPv6 packet handler */ 551 | + ipv6_pkt.type = htons(ETH_P_IPV6); 552 | + ipv6_pkt.dev = NULL; 553 | + ipv6_pkt.func = ipv6_handler; 554 | + dev_add_pack(&ipv6_pkt); 555 | + printk("Handlers for IPv4 and IPv6 installed.\n"); 556 | +} 557 | + 558 | +void unregister_handlers(void) 559 | +{ 560 | + dev_remove_pack(&ipv4_pkt); 561 | + dev_remove_pack(&ipv6_pkt); 562 | + printk("Handlers for IPv4 and IPv6 removed.\n"); 563 | +} 564 | + 565 | +/* 566 | + * hello_init the init function, called when the module is loaded. 567 | + * Returns zero if successfully loaded, nonzero otherwise. 568 | + */ 569 | +static int __init hello_init(void) 570 | +{ 571 | + int err = 0; 572 | + printk("ip46nat module: version %s\n", MODULE_VERS); 573 | + 574 | + if (check_init_params() < 0 ) { 575 | + printk(KERN_ALERT "Invalid parameters specified (v6prefix and v4addr is required).\n"); 576 | + err = -1; 577 | + } 578 | + 579 | + if (err < 0) { 580 | + printk(KERN_ALERT "IPv4-IPv6 NAT module loading failed.\n"); 581 | + return -1; 582 | + } 583 | + 584 | + printk(KERN_ALERT "IPv4-IPv6 NAT module loaded: v6prefixp: %s/%d, v6prefixm: %s/%d, v4addr: %s/%d\n", 585 | + v6prefixp_str, v6prefix_length, v6prefixm_str, v6prefix_length, v4addr_str, v4prefix_length); 586 | + 587 | + register_handlers(); 588 | + err = procfs_init(); 589 | + if (err) 590 | + { 591 | + printk(KERN_ALERT "Unable to create /proc entries.\n"); 592 | + return err; 593 | + } 594 | + 595 | + switch (v4prefix_length) { 596 | + case 32: 597 | + { 598 | + v4mask = 0xffffffff; /* v4 addrs are stored in network byte order */ 599 | + break; 600 | + } 601 | + case 24: 602 | + { 603 | + v4mask = 0x00ffffff; 604 | + break; 605 | + } 606 | + case 16: 607 | + { 608 | + v4mask = 0x0000ffff; 609 | + break; 610 | + } 611 | + case 8: 612 | + { 613 | + v4mask = 0x000000ff; 614 | + break; 615 | + } 616 | + default: 617 | + printk(KERN_ALERT "Unsupposted mask length: %d. Module loading failed.\n", v4prefix_length); 618 | + return -1; 619 | + } 620 | + 621 | + return 0; 622 | +} 623 | + 624 | +/* 625 | + * hello_exit the exit function, called when the module is removed. 626 | + */ 627 | +static void __exit hello_exit(void) 628 | +{ 629 | + unregister_handlers(); 630 | + procfs_exit(); 631 | + 632 | + printk(KERN_ALERT "---IPv4-IPv6 NAT statistics-------------------\n"); 633 | + printk(KERN_ALERT "IPv4-to-IPv6 packets: %d\n", cnt4to6); 634 | + printk(KERN_ALERT "IPv6-to-IPv4 packets: %d\n", cnt6to4); 635 | + printk(KERN_ALERT "IPv4 rcvd: %d, sent: %d\n", cnt4rcv, cnt4snd); 636 | + printk(KERN_ALERT "IPv6 rcvd: %d, sent: %d\n", cnt6rcv, cnt6snd); 637 | + printk(KERN_ALERT "IPv4 dropped (too large): %d\n", cnt4drop_mtu); 638 | + printk(KERN_ALERT "IPv4 dropped (no route): %d\n", cnt4drop_route); 639 | + printk(KERN_ALERT "IPv6 dropped (no route): %d\n", cnt6drop_route); 640 | + printk(KERN_ALERT "IPv4 dropped (transmission failed): %d\n", cnt4xmit_errors); 641 | + printk(KERN_ALERT "IPv6 dropped (transmission failed): %d\n", cnt6xmit_errors); 642 | + printk(KERN_ALERT "----------------------------------------------\n"); 643 | + printk(KERN_ALERT "IPv4-IPv6 NAT module unloaded.\n"); 644 | +} 645 | + 646 | +static int procfs_read_stats(char *page, char **start, 647 | + off_t off, int count, 648 | + int *eof, void *data) 649 | +{ 650 | + int len; 651 | + 652 | + len = sprintf(page, "IPv4 received = %d, sent = %d\n", cnt4rcv, cnt4snd); 653 | + len += sprintf(page+len, "IPv6 received = %d, sent = %d\n", cnt6rcv, cnt6snd); 654 | + return len; 655 | +} 656 | + 657 | +static int procfs_read_params(char *page, char **start, 658 | + off_t off, int count, 659 | + int *eof, void *data) 660 | +{ 661 | + int len; 662 | + struct cfg_t *cfg = (struct cfg_t *)data; 663 | + 664 | + len = sprintf(page, "v4addr = %x\n", cfg->v4addr); 665 | + return len; 666 | +} 667 | + 668 | +static int procfs_write_params(struct file *file, 669 | + const char *buffer, 670 | + unsigned long count, 671 | + void *data) 672 | +{ 673 | + int len; 674 | + struct cfg_t *cfg = (struct cfg_t *)data; 675 | + 676 | + /* TODO: Implement parameter modification */ 677 | + /* if(copy_from_user(cfg->value, buffer, len)) 678 | + return -EFAULT; */ 679 | + 680 | + return len; 681 | +} 682 | + 683 | +static int procfs_init(void) 684 | +{ 685 | + procfs_dir = proc_mkdir(MODULE_NAME, NULL); 686 | + if (!procfs_dir) 687 | + { 688 | + printk (KERN_ERR "Cannot create /proc/%s\n", MODULE_NAME); 689 | + return -ENOMEM; 690 | + } 691 | + 692 | + procfs_stats_file = create_proc_read_entry("stats", 693 | + 0444, procfs_dir, 694 | + procfs_read_stats, 695 | + NULL); 696 | + if (!procfs_stats_file) 697 | + { 698 | + printk (KERN_ERR "cannot create /proc/%s/stats\n",MODULE_NAME); 699 | + remove_proc_entry(MODULE_NAME, 0); 700 | + return -ENOMEM; 701 | + } 702 | + 703 | + procfs_params_file = create_proc_entry("params", 0644, procfs_dir); 704 | + if(procfs_params_file == NULL) { 705 | + remove_proc_entry(MODULE_NAME, 0); 706 | + return -ENOMEM; 707 | + } 708 | + procfs_params_file->data = &cfg; 709 | + procfs_params_file->read_proc = procfs_read_params; 710 | + procfs_params_file->write_proc = procfs_write_params; 711 | + 712 | + return 0; 713 | +} 714 | + 715 | +static void procfs_exit(void) 716 | +{ 717 | + remove_proc_entry("softwire/smtu", 0); 718 | + remove_proc_entry("softwire/overridesmtu", 0); 719 | + remove_proc_entry("softwire/ipv6smtu", 0); 720 | + remove_proc_entry("softwire/overrideipv6smtu", 0); 721 | + remove_proc_entry("softwire/toggle", 0); 722 | + remove_proc_entry("softwire/l2tpsmtu", 0); 723 | + remove_proc_entry("softwire/l2tpoverridesmtu", 0); 724 | + remove_proc_entry("softwire/devicename", 0); 725 | + remove_proc_entry("softwire", 0); 726 | +} 727 | + 728 | + 729 | +module_init(hello_init); 730 | +module_exit(hello_exit); 731 | + 732 | -------------------------------------------------------------------------------- /ip46nat-module/ip46nat.c: -------------------------------------------------------------------------------- 1 | /* 2 | * ip46nat.c - kernel module for performing IPv4-IPv6 NAT 3 | * 4 | * author: Tomasz Mrugalski 5 | * 6 | * released under GNU GPLv2 license. 7 | * 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | #include 27 | 28 | MODULE_LICENSE("GPL"); 29 | MODULE_AUTHOR("Tomasz Mrugalski"); 30 | MODULE_DESCRIPTION("IPv4-IPv6 translator"); 31 | #define MODULE_VERS "2011-10-14" 32 | #define MODULE_NAME "ip46nat" 33 | 34 | #define V6PREFIX_MAX_LEN 64 35 | #define V4ADDR_MAX_LEN 32 36 | 37 | #define DEBUG_NONE 0 38 | #define DEBUG_MATCHED 1 39 | #define DEBUG_ALL 2 40 | 41 | static char prefixlan_str[V6PREFIX_MAX_LEN]; 42 | static char prefixwan_str[V6PREFIX_MAX_LEN]; 43 | static char v4addr_str[V4ADDR_MAX_LEN]; 44 | 45 | /* used as a src/dst "filler" during IPv4->IPv6 address expansion */ 46 | // static char prefixlan[16]; /* src prefix for outgoing traffic */ 47 | // static char prefixwan[16]; /* dst prefix for outgoing traffic */ 48 | // static int v6prefix_length = 64; 49 | 50 | /* used to match source address in incoming IPv4 packets */ 51 | // __u32 v4addr; 52 | //static int v4masklen; 53 | 54 | /* module parameters */ 55 | static char cfg_prefixlan[16]; /* src prefix */ 56 | static char cfg_prefixwan[16]; /* dst prefix */ 57 | static int cfg_v6prefix_length = 128; 58 | 59 | static short cfg_v4offset = 96; /* specified in bits */ 60 | static __u32 cfg_v4addr; /* v4 prefix */ 61 | static short cfg_v4masklen = 24; 62 | 63 | static short cfg_debug = DEBUG_NONE; 64 | 65 | static int cfg_offset; /* not set directly, but calculated based on offset (specified in bytes) */ 66 | static __u32 cfg_v4mask; /* not set directly, but calculated based on v4masklen */ 67 | 68 | /* end of module parameters */ 69 | 70 | module_param_string(prefixlan, prefixlan_str, V6PREFIX_MAX_LEN, 0); 71 | module_param_string(prefixwan, prefixwan_str, V6PREFIX_MAX_LEN, 0); 72 | module_param_string(v4addr, v4addr_str, V4ADDR_MAX_LEN, 0); 73 | module_param_named(v4offset, cfg_v4offset, short, 0); 74 | module_param_named(debug, cfg_debug, short, 0); 75 | module_param_named(v4masklen, cfg_v4masklen, short, 0); 76 | module_param_named(v6prefixlen, cfg_v6prefix_length, short, 0); 77 | 78 | struct packet_type ipv4_pkt; 79 | struct packet_type ipv6_pkt; 80 | 81 | /* procfs data */ 82 | static struct proc_dir_entry *procfs_dir, *procfs_stats_file, *procfs_params_file; 83 | 84 | /* stats */ 85 | static int cnt4to6 = 0; /* IPv4 to IPv6 nated */ 86 | static int cnt6to4 = 0; /* IPv6 to IPv4 nated */ 87 | static int cnt4rcv = 0; /* IPv4 received */ 88 | static int cnt4snd = 0; /* IPv4 sent */ 89 | static int cnt6rcv = 0; /* IPv6 received */ 90 | static int cnt6snd = 0; /* IPv6 sent */ 91 | static int cnt4drop_mtu = 0; /* IPv4 dropped due to too big size */ 92 | static int cnt4drop_route = 0; /* IPv4 dropped due to missing route */ 93 | static int cnt6drop_route = 0; /* IPv6 dropped due to missing route */ 94 | static int cnt4xmit_errors = 0; /* IPv4 transmission errors */ 95 | static int cnt6xmit_errors = 0; /* IPv6 transmission errors */ 96 | 97 | static int procfs_init(void); 98 | static void procfs_exit(void); 99 | 100 | 101 | /* ******************************************************************************** */ 102 | /* *** utility functions ********************************************************** */ 103 | /* ******************************************************************************** */ 104 | 105 | void in4_ntop(char * buf, int addr) 106 | { 107 | sprintf(buf, "%d.%d.%d.%d", addr&0xff, (addr>>8)&0xff, (addr>>16)&0xff, (addr>>24)&0xff); 108 | } 109 | 110 | void in6_ntop(char * dst, const unsigned char * src) 111 | { 112 | const int NS_IN6ADDRSZ = 16; 113 | const int NS_INT16SZ = 2; 114 | 115 | char tmp[40], *tp; // 40 - maximum size of expanded (no ::) IPv6 address 116 | struct { int base, len; } best, cur; 117 | u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; 118 | int i; 119 | 120 | /* 121 | * Preprocess: 122 | * Copy the input (bytewise) array into a wordwise array. 123 | * Find the longest run of 0x00's in src[] for :: shorthanding. 124 | */ 125 | memset(words, '\0', sizeof words); 126 | for (i = 0; i < NS_IN6ADDRSZ; i += 2) 127 | words[i / 2] = (src[i] << 8) | src[i + 1]; 128 | best.base = -1; 129 | cur.base = -1; 130 | cur.len = 1; 131 | best.len = 1; 132 | for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { 133 | if (words[i] == 0) { 134 | if (cur.base == -1) 135 | cur.base = i, cur.len = 1; 136 | else 137 | cur.len++; 138 | } else { 139 | if (cur.base != -1) { 140 | if (best.base == -1 || cur.len > best.len) 141 | best = cur; 142 | cur.base = -1; 143 | } 144 | } 145 | } 146 | if (cur.base != -1) { 147 | if (best.base == -1 || cur.len > best.len) 148 | best = cur; 149 | } 150 | if (best.base != -1 && best.len < 2) 151 | best.base = -1; 152 | 153 | /* 154 | * Format the result. 155 | */ 156 | tp = tmp; 157 | for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { 158 | /* Are we inside the best run of 0x00's? */ 159 | if (best.base != -1 && i >= best.base && 160 | i < (best.base + best.len)) { 161 | if (i == best.base) 162 | *tp++ = ':'; 163 | continue; 164 | } 165 | /* Are we following an initial run of 0x00s or any real hex? */ 166 | if (i != 0) 167 | *tp++ = ':'; 168 | tp += sprintf(tp, "%x", words[i]); 169 | } 170 | /* Was it a trailing run of 0x00's? */ 171 | if (best.base != -1 && (best.base + best.len) == 172 | (NS_IN6ADDRSZ / NS_INT16SZ)) 173 | *tp++ = ':'; 174 | *tp++ = '\0'; 175 | strcpy(dst, tmp); 176 | } 177 | 178 | void in6_ntop2(char * buf, const struct in6_addr * addr) 179 | { 180 | in6_ntop(buf, (char *)&addr->s6_addr); 181 | } 182 | 183 | /* ******************************************************************************** */ 184 | /* *** IPv4 -> IPv6 functions ***************************************************** */ 185 | /* ******************************************************************************** */ 186 | void ip6_update_csum(struct sk_buff * skb, struct ipv6hdr * ip6hdr) 187 | { 188 | __wsum sum1=0; 189 | __sum16 sum2=0; 190 | __sum16 oldsum = 0; 191 | 192 | switch (ip6hdr->nexthdr) 193 | { 194 | case IPPROTO_TCP: 195 | { 196 | struct tcphdr *th = tcp_hdr(skb); 197 | unsigned tcplen = 0; 198 | oldsum = th->check; 199 | tcplen = ntohs(ip6hdr->payload_len); /* TCP header + payload */ 200 | 201 | th->check = 0; 202 | sum1 = csum_partial((char*)th, tcplen, 0); /* calculate checksum for TCP hdr+payload */ 203 | sum2 = csum_ipv6_magic(&ip6hdr->saddr, &ip6hdr->daddr, tcplen, ip6hdr->nexthdr, sum1); /* add pseudoheader */ 204 | 205 | if (cfg_debug>=DEBUG_MATCHED) 206 | printk(KERN_ALERT " Updating TCP (over IPv6) checksum to %x (old=%x)\n", htons(sum2), htons(oldsum) ); 207 | th->check = sum2; 208 | break; 209 | } 210 | case IPPROTO_UDP: 211 | { 212 | struct udphdr *udp = udp_hdr(skb); 213 | unsigned udplen = ntohs(ip6hdr->payload_len); /* UDP hdr + payload */ 214 | 215 | oldsum = udp->check; 216 | udp->check = 0; 217 | 218 | sum1 = csum_partial((char*)udp, udplen, 0); /* calculate checksum for UDP hdr+payload */ 219 | sum2 = csum_ipv6_magic(&ip6hdr->saddr, &ip6hdr->daddr, udplen, ip6hdr->nexthdr, sum1); /* add pseudoheader */ 220 | 221 | if (cfg_debug>=DEBUG_MATCHED) 222 | printk(KERN_ALERT " Updating UDP (over IPv6) checksum to %x (old=%x)\n", htons(sum2), htons(oldsum) ); 223 | udp->check = sum2; 224 | 225 | break; 226 | } 227 | 228 | case IPPROTO_ICMP: 229 | break; 230 | } 231 | } 232 | 233 | static int ipv4_send_as_ipv6(struct sk_buff * skb) 234 | { 235 | char buf1[32], buf2[32], buf3[64], buf4[64]; 236 | char v6saddr[16], v6daddr[16]; 237 | int err = -1; 238 | int tclass = 0; 239 | int flowlabel = 0; 240 | int len; 241 | 242 | struct ipv6hdr * hdr6; 243 | struct iphdr * hdr4 = ip_hdr(skb); 244 | struct sk_buff * copy = 0; 245 | 246 | memcpy(v6saddr, cfg_prefixlan, 16); 247 | memcpy(v6daddr, cfg_prefixwan, 16); 248 | memcpy(v6saddr+cfg_offset, &hdr4->saddr, 4); 249 | memcpy(v6daddr+cfg_offset, &hdr4->daddr, 4); 250 | 251 | if (cfg_debug>=DEBUG_MATCHED) 252 | { 253 | in4_ntop(buf1, hdr4->saddr); 254 | in4_ntop(buf2, hdr4->daddr); 255 | in6_ntop(buf3, v6saddr); 256 | in6_ntop(buf4, v6daddr); 257 | 258 | printk(KERN_ALERT " IPv4(src=%s, dst=%s)->IPv6(src=%s,dst=%s)\n", buf1, buf2,buf3,buf4); 259 | } 260 | 261 | if (ntohs(hdr4->tot_len) > 1480) { 262 | if (cfg_debug>DEBUG_NONE) 263 | printk(KERN_ALERT "#Too large IPv4 (len=%d) received, dropped. %d such errors so far.\n", 264 | ntohs(hdr4->tot_len), ++cnt4drop_mtu); 265 | return -1; 266 | } 267 | 268 | len = skb->tail - skb->data; 269 | 270 | /* create new skb */ 271 | copy = skb_copy(skb, GFP_ATOMIC); // other possible option: GFP_ATOMIC 272 | 273 | /* Remove any debris in the socket control block */ 274 | memset(IPCB(copy), 0, sizeof(struct inet_skb_parm)); 275 | 276 | /* expand header (add 20 extra bytes at the beginning of sk_buff) */ 277 | pskb_expand_head(copy, 20, 0, GFP_ATOMIC); 278 | 279 | skb_push(copy, sizeof(struct ipv6hdr) - sizeof(struct iphdr)); /* push boundary by extra 20 bytes */ 280 | 281 | skb_reset_network_header(copy); 282 | skb_set_transport_header(copy,40); /* transport (TCP/UDP/ICMP/...) header starts after 40 bytes */ 283 | 284 | /* printk(KERN_ALERT "#### skb->len=%d len=%d copy->len=%d\n", skb->len, len, copy->len); */ 285 | 286 | hdr6 = ipv6_hdr(copy); 287 | 288 | /* build IPv6 header */ 289 | tclass = 0; /* traffic class */ 290 | *(__be32 *)hdr6 = htonl(0x60000000 | (tclass << 20)) | flowlabel; /* version, priority, flowlabel */ 291 | hdr6->payload_len = htons(ntohs(hdr4->tot_len) 292 | - sizeof(struct iphdr)); /* IPv6 length is a payload length, IPv4 is hdr+payload */ 293 | hdr6->nexthdr = hdr4->protocol; 294 | hdr6->hop_limit = hdr4->ttl; 295 | memcpy(&hdr6->saddr, v6saddr, 16); 296 | memcpy(&hdr6->daddr, v6daddr, 16); 297 | 298 | copy->priority = skb->priority; 299 | copy->mark = skb->mark; 300 | copy->protocol = htons(ETH_P_IPV6); 301 | 302 | ip6_update_csum(copy, hdr6); 303 | 304 | ip6_route_input(copy); 305 | if (skb_dst(copy) == NULL) { 306 | if (cfg_debug>=DEBUG_MATCHED) 307 | printk(KERN_ALERT "#Unable to find route, IPv6 packet not sent (%d IPv6 route errors so far)\n", 308 | ++cnt6drop_route); 309 | return -1; 310 | } 311 | 312 | if (dst_mtu(skb_dst(copy))==0) { 313 | if (cfg_debug>=DEBUG_MATCHED) 314 | printk(KERN_ALERT "#Route with mtu=0 found, IPv6 packet not sent (%d IPv6 route errors so far).\n", 315 | ++cnt6drop_route); 316 | return -1; 317 | } 318 | 319 | err = ip6_forward(copy); 320 | if (err==0) { 321 | /* packet sent successfully */ 322 | cnt6snd++; 323 | cnt4to6++; 324 | } else { 325 | if (cfg_debug>=DEBUG_MATCHED) 326 | printk(KERN_ALERT "#IPv4->IPv6: Packet transmission (ip6_forward()) failed. Errors so far: %d\n", 327 | ++cnt6xmit_errors); 328 | } 329 | 330 | /* should skb be released here? No, it shouldn't */ 331 | 332 | return 0; 333 | } 334 | 335 | static int ipv4_handler(struct sk_buff *skb,struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) 336 | { 337 | struct iphdr * hdr = ip_hdr(skb); 338 | static char buf1[32], buf2[32], buf3[32]; 339 | 340 | int process = 0; 341 | int mcast = 0; 342 | 343 | cnt4rcv++; 344 | 345 | in4_ntop(buf1, hdr->saddr); 346 | in4_ntop(buf2, hdr->daddr); 347 | in4_ntop(buf3, (cfg_v4addr & cfg_v4mask) ); 348 | 349 | /* IPv4 address pattern checking */ 350 | if ( (hdr->saddr & cfg_v4mask) == (cfg_v4addr & cfg_v4mask) ) 351 | process = 1; 352 | 353 | if ((hdr->daddr >> 24) >= 224) 354 | mcast = 1; /* that's multicast */ 355 | 356 | if ( (process && (cfg_debug>=DEBUG_MATCHED)) || (cfg_debug>=DEBUG_ALL) ) { 357 | printk(KERN_ALERT "#IPv4 rcvd (rcvd so far: %d) [src=%s, dst=%s,looking for %s/%d]%s\n", cnt4rcv, buf1, buf2, 358 | buf3, cfg_v4masklen, process?(mcast?"M":"*"):""); 359 | } 360 | 361 | if (process && !mcast) 362 | ipv4_send_as_ipv6(skb); 363 | 364 | kfree_skb(skb); 365 | return 1; 366 | } 367 | 368 | /* ******************************************************************************** */ 369 | /* *** IPv6 -> IPv4 functions ***************************************************** */ 370 | /* ******************************************************************************** */ 371 | void ipv4_update_csum(struct sk_buff * skb, struct iphdr *iph) 372 | { 373 | __wsum sum1=0; 374 | __sum16 sum2=0; 375 | __sum16 oldsum=0; 376 | 377 | int iphdrlen = ip_hdrlen(skb); 378 | 379 | switch (iph->protocol) 380 | { 381 | case IPPROTO_TCP: 382 | { 383 | /* ripped from tcp_v4_send_check fro tcp_ipv4.c */ 384 | struct tcphdr *th = tcp_hdr(skb); 385 | unsigned tcplen = 0; 386 | 387 | /* printk(KERN_ALERT "iph=%p th=%p copy->len=%d, th->check=%x iphdrlen=%d thlen=%d\n", 388 | iph, th, skb->len, ntohs(th->check), iphdrlen, thlen); */ 389 | 390 | skb->csum = 0; 391 | skb->ip_summed = CHECKSUM_COMPLETE; 392 | 393 | // calculate payload 394 | oldsum = th->check; 395 | th->check = 0; 396 | tcplen = ntohs(iph->tot_len) - iphdrlen; /* skb->len - iphdrlen; (may cause trouble due to padding) */ 397 | sum1 = csum_partial((char*)th, tcplen, 0); /* calculate checksum for TCP hdr+payload */ 398 | sum2 = csum_tcpudp_magic(iph->saddr, iph->daddr, tcplen, iph->protocol, sum1); /* add pseudoheader */ 399 | if (cfg_debug>=DEBUG_MATCHED) 400 | printk(KERN_ALERT " Updating TCP (over IPv4) checksum to %04x (oldsum=%04x)\n", htons(sum2), htons(oldsum)); 401 | 402 | th->check = sum2; 403 | 404 | break; 405 | } 406 | case IPPROTO_UDP: 407 | { 408 | struct udphdr *udp = udp_hdr(skb); 409 | unsigned udplen = 0; 410 | 411 | 412 | oldsum = udp->check; 413 | udp->check = 0; 414 | udplen = ntohs(iph->tot_len) - iphdrlen; 415 | 416 | sum1 = csum_partial((char*)udp, udplen, 0); 417 | sum2 = csum_tcpudp_magic(iph->saddr, iph->daddr, udplen, iph->protocol, sum1); 418 | udp->check = sum2; 419 | printk(KERN_ALERT " Updating UDP (over IPv4) checksum to %04x (oldsum=%04x)\n", htons(sum2), htons(oldsum) ); 420 | 421 | break; 422 | } 423 | case IPPROTO_ICMP: 424 | { 425 | /* do nothing here. ICMP does not use pseudoheaders for checksum calculation. */ 426 | break; 427 | } 428 | default: 429 | break; 430 | } 431 | } 432 | 433 | static int ipv6_send_as_ipv4(struct sk_buff * skb) 434 | { 435 | struct ipv6hdr * hdr = ipv6_hdr(skb); 436 | struct iphdr * iph; 437 | char buf1[64], buf2[64], buf3[64], buf4[64]; 438 | __u32 v4saddr, v4daddr; 439 | struct sk_buff * copy = 0; 440 | int err = -1; 441 | int truncSize = 0; 442 | 443 | 444 | v4saddr = *( (__u32*)&(hdr->saddr.s6_addr[cfg_offset]) ); 445 | v4daddr = *( (__u32*)&(hdr->daddr.s6_addr[cfg_offset]) ); 446 | 447 | if (cfg_debug>DEBUG_NONE) 448 | { 449 | in6_ntop2(buf1,&hdr->saddr); 450 | in6_ntop2(buf2,&hdr->daddr); 451 | in4_ntop(buf3, v4saddr); 452 | in4_ntop(buf4, v4daddr); 453 | 454 | printk(KERN_ALERT " IPv6(src=%s,dst=%s)->IPv4(src=%s,dst=%s)\n", buf1, buf2, buf3, buf4); 455 | } 456 | 457 | copy = skb_copy(skb, GFP_ATOMIC); // other possible option: GFP_ATOMIC 458 | 459 | /* Remove any debris in the socket control block */ 460 | memset(IPCB(copy), 0, sizeof(struct inet_skb_parm)); 461 | 462 | /* modify packet: actual IPv6->IPv4 transformation */ 463 | truncSize = sizeof(struct ipv6hdr) - sizeof(struct iphdr); /* chop first 20 bytes */ 464 | skb_pull(copy, truncSize); 465 | skb_reset_network_header(copy); 466 | skb_set_transport_header(copy,20); /* transport (TCP/UDP/ICMP/...) header starts after 20 bytes */ 467 | 468 | /* build IPv4 header */ 469 | iph = ip_hdr(copy); 470 | iph->ttl = hdr->hop_limit; 471 | iph->saddr = v4saddr; 472 | iph->daddr = v4daddr; 473 | iph->protocol = hdr->nexthdr; 474 | *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (0x00/*tos*/ & 0xff)); 475 | iph->frag_off = htons(IP_DF); 476 | /* iph->tot_len = htons(copy->len); // almost good, but it may cause troubles with sizeof(IPv6 pkt)<64 (padding issue) */ 477 | iph->tot_len = htons( ntohs(hdr->payload_len)+ 20 /*sizeof(ipv4hdr)*/ ); 478 | iph->check = 0; 479 | iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); 480 | copy->protocol = htons(ETH_P_IP); 481 | 482 | ipv4_update_csum(copy, iph); /* update L4 (TCP/UDP/ICMP) checksum */ 483 | 484 | /* try to find route for this packet */ 485 | err = ip_route_input(copy, v4daddr, v4saddr, 0, copy->dev); 486 | 487 | if (err==0) { 488 | err = ip_forward(copy); 489 | if (err == 0) { 490 | cnt6to4++; 491 | cnt4snd++; 492 | } else { 493 | printk(KERN_ALERT "#IPv6->IPv4: Unable to send packet (ip_forward failed). %d such errors so far.\n", ++cnt4xmit_errors); 494 | } 495 | } else { 496 | printk(KERN_ALERT "# Unable to find route, packet dropped. (%d failed routes for IPv4 so far)\n", ++cnt4drop_route); 497 | } 498 | 499 | /* TBD: should copy be released here? */ 500 | 501 | return 1; 502 | } 503 | 504 | static int ipv6_handler(struct sk_buff *skb,struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) 505 | { 506 | struct ipv6hdr * hdr = ipv6_hdr(skb); 507 | char buf1[64], buf2[64], buf3[64], buf4[64]; 508 | int process = 0; 509 | 510 | cnt6rcv++; 511 | 512 | if (!memcmp(cfg_prefixwan, hdr->saddr.s6_addr, cfg_v6prefix_length/8) && 513 | !memcmp(cfg_prefixlan, hdr->daddr.s6_addr, cfg_v6prefix_length/8) ) 514 | { 515 | process = 1; 516 | } 517 | 518 | if ( (cfg_debug>=DEBUG_ALL) || ( process && (cfg_debug>=DEBUG_MATCHED) ) ) 519 | { 520 | in6_ntop2(buf1, &hdr->saddr); /* received src */ 521 | in6_ntop2(buf2, &hdr->daddr); /* received dst */ 522 | in6_ntop(buf3, cfg_prefixwan); /* expected src */ 523 | in6_ntop(buf4, cfg_prefixlan); /* expected dst */ 524 | printk(KERN_ALERT "#IPv6 rcvd (rcvd so far: %d) [src=%s dst=%s, looking for %s/%d->%s/%d] %s\n", 525 | cnt6rcv, buf1, buf2, buf3, cfg_v6prefix_length, buf4, cfg_v6prefix_length, process?"*":""); 526 | } 527 | 528 | if (process) { 529 | ipv6_send_as_ipv4(skb); 530 | } 531 | 532 | kfree_skb(skb); 533 | return 1; 534 | } 535 | 536 | 537 | /* ******************************************************************************** */ 538 | /* *** kernel interface functions ************************************************* */ 539 | /* ******************************************************************************** */ 540 | 541 | int check_init_params(void) 542 | { 543 | const char * end; 544 | int status = 0; 545 | 546 | if (!in6_pton(prefixlan_str, V6PREFIX_MAX_LEN, cfg_prefixlan, '\0', &end)) { 547 | printk(KERN_ALERT "Unable to process prefixlan parameter(%s). Please define v6prefix (e.g. prefixlan=2000::123)\n", prefixlan_str); 548 | status = -1; // initialization failed 549 | } 550 | 551 | if (!in6_pton(prefixwan_str, V6PREFIX_MAX_LEN, cfg_prefixwan, '\0', &end)) { 552 | printk(KERN_ALERT "Unable to process prefixwan parameter (%s). Please define v6prefix (e.g. prefixwan=2000::123)\n", prefixwan_str); 553 | status = -1; // initialization failed 554 | } 555 | 556 | if (!in4_pton(v4addr_str, V4ADDR_MAX_LEN, (u8 *)&(cfg_v4addr), '\0', &end)) { 557 | printk(KERN_ALERT "Unable to process v4addr parameter(%s). Please define v4addr (e.g. v4addr=1.2.3.4).\n", v4addr_str); 558 | status = -1; 559 | } 560 | 561 | if (cfg_v4offset < 0 || cfg_v4offset > 96) { 562 | printk(KERN_ALERT "Invalid IPv4 offset. Values expected: [0..95>\n"); 563 | status = -1; 564 | } 565 | 566 | cfg_offset = cfg_v4offset / 8; /* bit -> byte conversion */ 567 | 568 | return status; 569 | } 570 | 571 | void register_handlers(void) 572 | { 573 | memset(&ipv4_pkt, sizeof(ipv4_pkt), 0); 574 | memset(&ipv6_pkt, sizeof(ipv6_pkt), 0); 575 | 576 | /* register IPv4 packet handler */ 577 | ipv4_pkt.type = htons(ETH_P_IP); 578 | ipv4_pkt.dev = NULL; 579 | ipv4_pkt.func = ipv4_handler; 580 | dev_add_pack(&ipv4_pkt); 581 | 582 | /* register IPv6 packet handler */ 583 | ipv6_pkt.type = htons(ETH_P_IPV6); 584 | ipv6_pkt.dev = NULL; 585 | ipv6_pkt.func = ipv6_handler; 586 | dev_add_pack(&ipv6_pkt); 587 | printk("Handlers for IPv4 and IPv6 installed.\n"); 588 | } 589 | 590 | void unregister_handlers(void) 591 | { 592 | dev_remove_pack(&ipv4_pkt); 593 | dev_remove_pack(&ipv6_pkt); 594 | printk("Handlers for IPv4 and IPv6 removed.\n"); 595 | } 596 | 597 | /* 598 | * hello_init the init function, called when the module is loaded. 599 | * Returns zero if successfully loaded, nonzero otherwise. 600 | */ 601 | static int __init hello_init(void) 602 | { 603 | int err = 0; 604 | printk("ip46nat module: version %s\n", MODULE_VERS); 605 | 606 | if (check_init_params() < 0 ) { 607 | printk(KERN_ALERT "Invalid parameters specified (prefixlan, prefixwan and v4addr is required).\n"); 608 | err = -1; 609 | } 610 | 611 | if (err < 0) { 612 | printk(KERN_ALERT "IPv4-IPv6 NAT module loading failed.\n"); 613 | return -1; 614 | } 615 | 616 | printk(KERN_ALERT "IPv4-IPv6 NAT module loaded: prefixlan: %s/%d, prefixwan: %s/%d, v4addr: %s/%d\n", 617 | prefixlan_str, cfg_v6prefix_length, prefixwan_str, cfg_v6prefix_length, v4addr_str, cfg_v4masklen); 618 | printk(KERN_ALERT "IPv4-IPv6 NAT module loaded: offset: %d debug: %d\n", 619 | cfg_offset, cfg_debug); 620 | 621 | register_handlers(); 622 | err = procfs_init(); 623 | if (err) 624 | { 625 | printk(KERN_ALERT "Unable to create /proc entries.\n"); 626 | return err; 627 | } 628 | 629 | switch (cfg_v4masklen) { 630 | case 32: 631 | { 632 | cfg_v4mask = 0xffffffff; /* v4 addrs are stored in network byte order */ 633 | break; 634 | } 635 | case 24: 636 | { 637 | cfg_v4mask = 0x00ffffff; 638 | break; 639 | } 640 | case 16: 641 | { 642 | cfg_v4mask = 0x0000ffff; 643 | break; 644 | } 645 | case 8: 646 | { 647 | cfg_v4mask = 0x000000ff; 648 | break; 649 | } 650 | default: 651 | printk(KERN_ALERT "Unsupposted mask length: %d. Module loading failed.\n", cfg_v4masklen); 652 | return -1; 653 | } 654 | 655 | return 0; 656 | } 657 | 658 | /* 659 | * hello_exit the exit function, called when the module is removed. 660 | */ 661 | static void __exit hello_exit(void) 662 | { 663 | unregister_handlers(); 664 | procfs_exit(); 665 | 666 | printk(KERN_ALERT "---IPv4-IPv6 NAT statistics-------------------\n"); 667 | printk(KERN_ALERT "IPv4-to-IPv6 packets: %d\n", cnt4to6); 668 | printk(KERN_ALERT "IPv6-to-IPv4 packets: %d\n", cnt6to4); 669 | printk(KERN_ALERT "IPv4 rcvd: %d, sent: %d\n", cnt4rcv, cnt4snd); 670 | printk(KERN_ALERT "IPv6 rcvd: %d, sent: %d\n", cnt6rcv, cnt6snd); 671 | printk(KERN_ALERT "IPv4 dropped (too large): %d\n", cnt4drop_mtu); 672 | printk(KERN_ALERT "IPv4 dropped (no route): %d\n", cnt4drop_route); 673 | printk(KERN_ALERT "IPv6 dropped (no route): %d\n", cnt6drop_route); 674 | printk(KERN_ALERT "IPv4 dropped (transmission failed): %d\n", cnt4xmit_errors); 675 | printk(KERN_ALERT "IPv6 dropped (transmission failed): %d\n", cnt6xmit_errors); 676 | printk(KERN_ALERT "----------------------------------------------\n"); 677 | printk(KERN_ALERT "IPv4-IPv6 NAT module unloaded.\n"); 678 | } 679 | 680 | static int procfs_read_stats(char *page, char **start, 681 | off_t off, int count, 682 | int *eof, void *data) 683 | { 684 | int len; 685 | 686 | len = sprintf(page, "IPv4 received = %d, sent = %d\n", cnt4rcv, cnt4snd); 687 | len += sprintf(page+len, "IPv6 received = %d, sent = %d\n", cnt6rcv, cnt6snd); 688 | len += sprintf(page+len, "IPv4-to-IPv6 packets= %d\n", cnt4to6); 689 | len += sprintf(page+len, "IPv6-to-IPv4 packets: %d\n", cnt6to4); 690 | len += sprintf(page+len, "IPv4 dropped (too large): %d\n", cnt4drop_mtu); 691 | len += sprintf(page+len, "IPv4 dropped (no route): %d\n", cnt4drop_route); 692 | len += sprintf(page+len, "IPv6 dropped (no route): %d\n", cnt6drop_route); 693 | len += sprintf(page+len, "IPv4 dropped (transmission failed): %d\n", cnt4xmit_errors); 694 | len += sprintf(page+len, "IPv6 dropped (transmission failed): %d\n", cnt6xmit_errors); 695 | 696 | return len; 697 | } 698 | 699 | static int procfs_read_params(char *page, char **start, 700 | off_t off, int count, 701 | int *eof, void *data) 702 | { 703 | int len; 704 | 705 | char plain_lan[32], plain_wan[32], plain_v4[64]; 706 | in6_ntop(plain_lan, cfg_prefixlan); 707 | in6_ntop(plain_wan, cfg_prefixwan); 708 | in4_ntop(plain_v4, cfg_v4addr); 709 | 710 | len = sprintf(page, "prefixlan= %s\n", plain_lan); 711 | len += sprintf(page+len, "prefixwan= %s\n", plain_wan); 712 | len += sprintf(page+len, "v6prefix_length= %d\n", cfg_v6prefix_length); 713 | len += sprintf(page+len,"\n"); 714 | len += sprintf(page+len, "v4addr= %s\n", plain_v4); 715 | len += sprintf(page+len, "v4masklen = %d\n", cfg_v4masklen); 716 | len += sprintf(page+len, "v4offset = %d bits (%d bytes)\n", cfg_v4offset, cfg_offset); 717 | len += sprintf(page+len, "\n"); 718 | len += sprintf(page+len, "debug=%d", (cfg_debug?1:0) ); 719 | 720 | return len; 721 | } 722 | 723 | static int procfs_write_params(struct file *file, 724 | const char *buffer, 725 | unsigned long count, 726 | void *data) 727 | { 728 | int len = 0; 729 | // struct cfg_t *cfg = (struct cfg_t *)data; 730 | 731 | /* TODO: Implement parameter modification */ 732 | /* if(copy_from_user(cfg->value, buffer, len)) 733 | return -EFAULT; */ 734 | 735 | return len; 736 | } 737 | 738 | static int procfs_init(void) 739 | { 740 | procfs_dir = proc_mkdir(MODULE_NAME, NULL); 741 | if (!procfs_dir) 742 | { 743 | printk (KERN_ERR "Cannot create /proc/%s\n", MODULE_NAME); 744 | return -ENOMEM; 745 | } 746 | 747 | procfs_stats_file = create_proc_read_entry("stats", 748 | 0444, procfs_dir, 749 | procfs_read_stats, 750 | NULL); 751 | if (!procfs_stats_file) 752 | { 753 | printk (KERN_ERR "cannot create /proc/%s/stats\n",MODULE_NAME); 754 | remove_proc_entry(MODULE_NAME, 0); 755 | return -ENOMEM; 756 | } 757 | 758 | procfs_params_file = create_proc_entry("params", 0644, procfs_dir); 759 | if(procfs_params_file == NULL) { 760 | remove_proc_entry(MODULE_NAME, 0); 761 | return -ENOMEM; 762 | } 763 | procfs_params_file->data = 0; // &cfg; 764 | procfs_params_file->read_proc = procfs_read_params; 765 | procfs_params_file->write_proc = procfs_write_params; 766 | 767 | return 0; 768 | } 769 | 770 | static void procfs_exit(void) 771 | { 772 | remove_proc_entry("params", procfs_dir); 773 | remove_proc_entry("stats", procfs_dir); 774 | remove_proc_entry(MODULE_NAME, NULL); 775 | } 776 | 777 | module_init(hello_init); 778 | module_exit(hello_exit); 779 | -------------------------------------------------------------------------------- /kernel-configs/config-2.6.32.27: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated make config: don't edit 3 | # Linux kernel version: 2.6.32.27 4 | # Thu Mar 3 09:30:05 2011 5 | # 6 | CONFIG_MIPS=y 7 | 8 | # 9 | # Machine selection 10 | # 11 | # CONFIG_MACH_ALCHEMY is not set 12 | # CONFIG_AR7 is not set 13 | # CONFIG_BASLER_EXCITE is not set 14 | CONFIG_BCM47XX=y 15 | # CONFIG_BCM63XX is not set 16 | # CONFIG_MIPS_COBALT is not set 17 | # CONFIG_MACH_DECSTATION is not set 18 | # CONFIG_MACH_JAZZ is not set 19 | # CONFIG_LASAT is not set 20 | # CONFIG_MACH_LOONGSON is not set 21 | # CONFIG_MIPS_MALTA is not set 22 | # CONFIG_MIPS_SIM is not set 23 | # CONFIG_NEC_MARKEINS is not set 24 | # CONFIG_MACH_VR41XX is not set 25 | # CONFIG_NXP_STB220 is not set 26 | # CONFIG_NXP_STB225 is not set 27 | # CONFIG_PNX8550_JBS is not set 28 | # CONFIG_PNX8550_STB810 is not set 29 | # CONFIG_PMC_MSP is not set 30 | # CONFIG_PMC_YOSEMITE is not set 31 | # CONFIG_SGI_IP22 is not set 32 | # CONFIG_SGI_IP27 is not set 33 | # CONFIG_SGI_IP28 is not set 34 | # CONFIG_SGI_IP32 is not set 35 | # CONFIG_SIBYTE_CRHINE is not set 36 | # CONFIG_SIBYTE_CARMEL is not set 37 | # CONFIG_SIBYTE_CRHONE is not set 38 | # CONFIG_SIBYTE_RHONE is not set 39 | # CONFIG_SIBYTE_SWARM is not set 40 | # CONFIG_SIBYTE_LITTLESUR is not set 41 | # CONFIG_SIBYTE_SENTOSA is not set 42 | # CONFIG_SIBYTE_BIGSUR is not set 43 | # CONFIG_SNI_RM is not set 44 | # CONFIG_MACH_TX39XX is not set 45 | # CONFIG_MACH_TX49XX is not set 46 | # CONFIG_MIKROTIK_RB532 is not set 47 | # CONFIG_WR_PPMC is not set 48 | # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set 49 | # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set 50 | # CONFIG_ALCHEMY_GPIO_INDIRECT is not set 51 | CONFIG_RWSEM_GENERIC_SPINLOCK=y 52 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set 53 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set 54 | CONFIG_ARCH_SUPPORTS_OPROFILE=y 55 | CONFIG_GENERIC_FIND_NEXT_BIT=y 56 | CONFIG_GENERIC_HWEIGHT=y 57 | CONFIG_GENERIC_CALIBRATE_DELAY=y 58 | CONFIG_GENERIC_CLOCKEVENTS=y 59 | CONFIG_GENERIC_TIME=y 60 | CONFIG_GENERIC_CMOS_UPDATE=y 61 | CONFIG_SCHED_OMIT_FRAME_POINTER=y 62 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y 63 | CONFIG_CEVT_R4K_LIB=y 64 | CONFIG_CEVT_R4K=y 65 | CONFIG_CSRC_R4K_LIB=y 66 | CONFIG_CSRC_R4K=y 67 | CONFIG_CFE=y 68 | CONFIG_DMA_NONCOHERENT=y 69 | CONFIG_DMA_NEED_PCI_MAP_STATE=y 70 | # CONFIG_MIPS_FPU_EMU is not set 71 | # CONFIG_MIPS_MACHINE is not set 72 | # CONFIG_IMAGE_CMDLINE_HACK is not set 73 | # CONFIG_NO_IOPORT is not set 74 | CONFIG_GENERIC_GPIO=y 75 | # CONFIG_CPU_BIG_ENDIAN is not set 76 | CONFIG_CPU_LITTLE_ENDIAN=y 77 | CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y 78 | CONFIG_IRQ_CPU=y 79 | CONFIG_MIPS_L1_CACHE_SHIFT=5 80 | 81 | # 82 | # CPU selection 83 | # 84 | # CONFIG_CPU_LOONGSON2E is not set 85 | CONFIG_CPU_MIPS32_R1=y 86 | # CONFIG_CPU_MIPS32_R2 is not set 87 | # CONFIG_CPU_MIPS64_R1 is not set 88 | # CONFIG_CPU_MIPS64_R2 is not set 89 | # CONFIG_CPU_R3000 is not set 90 | # CONFIG_CPU_TX39XX is not set 91 | # CONFIG_CPU_VR41XX is not set 92 | # CONFIG_CPU_R4300 is not set 93 | # CONFIG_CPU_R4X00 is not set 94 | # CONFIG_CPU_TX49XX is not set 95 | # CONFIG_CPU_R5000 is not set 96 | # CONFIG_CPU_R5432 is not set 97 | # CONFIG_CPU_R5500 is not set 98 | # CONFIG_CPU_R6000 is not set 99 | # CONFIG_CPU_NEVADA is not set 100 | # CONFIG_CPU_R8000 is not set 101 | # CONFIG_CPU_R10000 is not set 102 | # CONFIG_CPU_RM7000 is not set 103 | # CONFIG_CPU_RM9000 is not set 104 | # CONFIG_CPU_SB1 is not set 105 | # CONFIG_CPU_CAVIUM_OCTEON is not set 106 | CONFIG_SYS_HAS_CPU_MIPS32_R1=y 107 | CONFIG_CPU_MIPS32=y 108 | CONFIG_CPU_MIPSR1=y 109 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y 110 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y 111 | CONFIG_HARDWARE_WATCHPOINTS=y 112 | 113 | # 114 | # Kernel type 115 | # 116 | CONFIG_32BIT=y 117 | # CONFIG_64BIT is not set 118 | CONFIG_PAGE_SIZE_4KB=y 119 | # CONFIG_PAGE_SIZE_8KB is not set 120 | # CONFIG_PAGE_SIZE_16KB is not set 121 | # CONFIG_PAGE_SIZE_32KB is not set 122 | # CONFIG_PAGE_SIZE_64KB is not set 123 | CONFIG_CPU_HAS_PREFETCH=y 124 | CONFIG_MIPS_MT_DISABLED=y 125 | # CONFIG_MIPS_MT_SMP is not set 126 | # CONFIG_MIPS_MT_SMTC is not set 127 | CONFIG_CPU_HAS_SYNC=y 128 | CONFIG_GENERIC_HARDIRQS=y 129 | CONFIG_GENERIC_IRQ_PROBE=y 130 | CONFIG_CPU_SUPPORTS_HIGHMEM=y 131 | CONFIG_ARCH_FLATMEM_ENABLE=y 132 | CONFIG_ARCH_POPULATES_NODE_MAP=y 133 | CONFIG_SELECT_MEMORY_MODEL=y 134 | CONFIG_FLATMEM_MANUAL=y 135 | # CONFIG_DISCONTIGMEM_MANUAL is not set 136 | # CONFIG_SPARSEMEM_MANUAL is not set 137 | CONFIG_FLATMEM=y 138 | CONFIG_FLAT_NODE_MEM_MAP=y 139 | CONFIG_PAGEFLAGS_EXTENDED=y 140 | CONFIG_SPLIT_PTLOCK_CPUS=4 141 | # CONFIG_PHYS_ADDR_T_64BIT is not set 142 | CONFIG_ZONE_DMA_FLAG=0 143 | CONFIG_VIRT_TO_BUS=y 144 | CONFIG_HAVE_MLOCK=y 145 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y 146 | # CONFIG_KSM is not set 147 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 148 | CONFIG_TICK_ONESHOT=y 149 | # CONFIG_NO_HZ is not set 150 | CONFIG_HIGH_RES_TIMERS=y 151 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 152 | # CONFIG_HZ_48 is not set 153 | # CONFIG_HZ_100 is not set 154 | # CONFIG_HZ_128 is not set 155 | CONFIG_HZ_250=y 156 | # CONFIG_HZ_256 is not set 157 | # CONFIG_HZ_1000 is not set 158 | # CONFIG_HZ_1024 is not set 159 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y 160 | CONFIG_HZ=250 161 | CONFIG_PREEMPT_NONE=y 162 | # CONFIG_PREEMPT_VOLUNTARY is not set 163 | # CONFIG_PREEMPT is not set 164 | # CONFIG_KEXEC is not set 165 | # CONFIG_SECCOMP is not set 166 | CONFIG_LOCKDEP_SUPPORT=y 167 | CONFIG_STACKTRACE_SUPPORT=y 168 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" 169 | CONFIG_CONSTRUCTORS=y 170 | 171 | # 172 | # General setup 173 | # 174 | CONFIG_EXPERIMENTAL=y 175 | CONFIG_BROKEN_ON_SMP=y 176 | CONFIG_INIT_ENV_ARG_LIMIT=32 177 | CONFIG_LOCALVERSION="" 178 | # CONFIG_LOCALVERSION_AUTO is not set 179 | CONFIG_SWAP=y 180 | CONFIG_SYSVIPC=y 181 | CONFIG_SYSVIPC_SYSCTL=y 182 | # CONFIG_POSIX_MQUEUE is not set 183 | # CONFIG_BSD_PROCESS_ACCT is not set 184 | # CONFIG_TASKSTATS is not set 185 | # CONFIG_AUDIT is not set 186 | 187 | # 188 | # RCU Subsystem 189 | # 190 | CONFIG_TREE_RCU=y 191 | # CONFIG_TREE_PREEMPT_RCU is not set 192 | # CONFIG_RCU_TRACE is not set 193 | CONFIG_RCU_FANOUT=32 194 | # CONFIG_RCU_FANOUT_EXACT is not set 195 | # CONFIG_TREE_RCU_TRACE is not set 196 | # CONFIG_IKCONFIG is not set 197 | CONFIG_LOG_BUF_SHIFT=14 198 | # CONFIG_GROUP_SCHED is not set 199 | # CONFIG_CGROUPS is not set 200 | # CONFIG_SYSFS_DEPRECATED_V2 is not set 201 | # CONFIG_RELAY is not set 202 | # CONFIG_NAMESPACES is not set 203 | CONFIG_CRASHLOG=y 204 | CONFIG_BLK_DEV_INITRD=y 205 | CONFIG_INITRAMFS_SOURCE="" 206 | # CONFIG_RD_GZIP is not set 207 | # CONFIG_RD_BZIP2 is not set 208 | CONFIG_RD_LZMA=y 209 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set 210 | CONFIG_SYSCTL=y 211 | CONFIG_ANON_INODES=y 212 | CONFIG_EMBEDDED=y 213 | CONFIG_SYSCTL_SYSCALL=y 214 | # CONFIG_KALLSYMS is not set 215 | CONFIG_HOTPLUG=y 216 | CONFIG_PRINTK=y 217 | CONFIG_BUG=y 218 | # CONFIG_ELF_CORE is not set 219 | # CONFIG_PCSPKR_PLATFORM is not set 220 | CONFIG_BASE_FULL=y 221 | CONFIG_FUTEX=y 222 | CONFIG_EPOLL=y 223 | CONFIG_SIGNALFD=y 224 | CONFIG_TIMERFD=y 225 | CONFIG_EVENTFD=y 226 | CONFIG_SHMEM=y 227 | CONFIG_AIO=y 228 | 229 | # 230 | # Kernel Performance Events And Counters 231 | # 232 | # CONFIG_VM_EVENT_COUNTERS is not set 233 | CONFIG_PCI_QUIRKS=y 234 | # CONFIG_COMPAT_BRK is not set 235 | CONFIG_SLAB=y 236 | # CONFIG_SLUB is not set 237 | # CONFIG_SLOB is not set 238 | # CONFIG_PROFILING is not set 239 | CONFIG_HAVE_OPROFILE=y 240 | 241 | # 242 | # GCOV-based kernel profiling 243 | # 244 | # CONFIG_SLOW_WORK is not set 245 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y 246 | CONFIG_SLABINFO=y 247 | CONFIG_RT_MUTEXES=y 248 | CONFIG_BASE_SMALL=0 249 | CONFIG_MODULES=y 250 | # CONFIG_MODULE_FORCE_LOAD is not set 251 | CONFIG_MODULE_UNLOAD=y 252 | # CONFIG_MODULE_FORCE_UNLOAD is not set 253 | # CONFIG_MODVERSIONS is not set 254 | # CONFIG_MODULE_SRCVERSION_ALL is not set 255 | CONFIG_BLOCK=y 256 | CONFIG_LBDAF=y 257 | # CONFIG_BLK_DEV_BSG is not set 258 | # CONFIG_BLK_DEV_INTEGRITY is not set 259 | 260 | # 261 | # IO Schedulers 262 | # 263 | CONFIG_IOSCHED_NOOP=y 264 | # CONFIG_IOSCHED_AS is not set 265 | CONFIG_IOSCHED_DEADLINE=y 266 | # CONFIG_IOSCHED_CFQ is not set 267 | # CONFIG_DEFAULT_AS is not set 268 | CONFIG_DEFAULT_DEADLINE=y 269 | # CONFIG_DEFAULT_CFQ is not set 270 | # CONFIG_DEFAULT_NOOP is not set 271 | CONFIG_DEFAULT_IOSCHED="deadline" 272 | # CONFIG_PROBE_INITRD_HEADER is not set 273 | # CONFIG_FREEZER is not set 274 | 275 | # 276 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) 277 | # 278 | CONFIG_HW_HAS_PCI=y 279 | CONFIG_PCI=y 280 | CONFIG_PCI_DOMAINS=y 281 | # CONFIG_ARCH_SUPPORTS_MSI is not set 282 | # CONFIG_PCI_LEGACY is not set 283 | # CONFIG_PCI_STUB is not set 284 | # CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set 285 | # CONFIG_PCI_IOV is not set 286 | CONFIG_MMU=y 287 | # CONFIG_PCCARD is not set 288 | # CONFIG_HOTPLUG_PCI is not set 289 | 290 | # 291 | # Executable file formats 292 | # 293 | CONFIG_BINFMT_ELF=y 294 | # CONFIG_HAVE_AOUT is not set 295 | # CONFIG_BINFMT_MISC is not set 296 | CONFIG_TRAD_SIGNALS=y 297 | 298 | # 299 | # Power management options 300 | # 301 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y 302 | CONFIG_ARCH_SUSPEND_POSSIBLE=y 303 | # CONFIG_PM is not set 304 | CONFIG_NET=y 305 | 306 | # 307 | # Networking options 308 | # 309 | CONFIG_PACKET=y 310 | CONFIG_PACKET_MMAP=y 311 | CONFIG_UNIX=y 312 | # CONFIG_NET_KEY is not set 313 | CONFIG_INET=y 314 | CONFIG_IP_MULTICAST=y 315 | CONFIG_IP_ADVANCED_ROUTER=y 316 | CONFIG_ASK_IP_FIB_HASH=y 317 | # CONFIG_IP_FIB_TRIE is not set 318 | CONFIG_IP_FIB_HASH=y 319 | CONFIG_IP_MULTIPLE_TABLES=y 320 | CONFIG_IP_ROUTE_MULTIPATH=y 321 | # CONFIG_IP_ROUTE_VERBOSE is not set 322 | # CONFIG_IP_PNP is not set 323 | CONFIG_NET_IPIP=m 324 | # CONFIG_NET_IPGRE is not set 325 | CONFIG_IP_MROUTE=y 326 | # CONFIG_IP_PIMSM_V1 is not set 327 | # CONFIG_IP_PIMSM_V2 is not set 328 | # CONFIG_ARPD is not set 329 | CONFIG_SYN_COOKIES=y 330 | # CONFIG_INET_AH is not set 331 | # CONFIG_INET_ESP is not set 332 | # CONFIG_INET_IPCOMP is not set 333 | # CONFIG_INET_XFRM_TUNNEL is not set 334 | CONFIG_INET_TUNNEL=m 335 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set 336 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set 337 | # CONFIG_INET_XFRM_MODE_BEET is not set 338 | # CONFIG_INET_LRO is not set 339 | # CONFIG_INET_DIAG is not set 340 | CONFIG_TCP_CONG_ADVANCED=y 341 | # CONFIG_TCP_CONG_BIC is not set 342 | # CONFIG_TCP_CONG_CUBIC is not set 343 | CONFIG_TCP_CONG_WESTWOOD=y 344 | # CONFIG_TCP_CONG_HTCP is not set 345 | # CONFIG_TCP_CONG_HSTCP is not set 346 | # CONFIG_TCP_CONG_HYBLA is not set 347 | # CONFIG_TCP_CONG_VEGAS is not set 348 | # CONFIG_TCP_CONG_SCALABLE is not set 349 | # CONFIG_TCP_CONG_LP is not set 350 | # CONFIG_TCP_CONG_VENO is not set 351 | # CONFIG_TCP_CONG_YEAH is not set 352 | # CONFIG_TCP_CONG_ILLINOIS is not set 353 | # CONFIG_DEFAULT_BIC is not set 354 | # CONFIG_DEFAULT_CUBIC is not set 355 | # CONFIG_DEFAULT_HTCP is not set 356 | # CONFIG_DEFAULT_VEGAS is not set 357 | CONFIG_DEFAULT_WESTWOOD=y 358 | # CONFIG_DEFAULT_RENO is not set 359 | CONFIG_DEFAULT_TCP_CONG="westwood" 360 | # CONFIG_TCP_MD5SIG is not set 361 | CONFIG_IPV6=m 362 | CONFIG_IPV6_PRIVACY=y 363 | # CONFIG_IPV6_ROUTER_PREF is not set 364 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set 365 | # CONFIG_INET6_AH is not set 366 | # CONFIG_INET6_ESP is not set 367 | # CONFIG_INET6_IPCOMP is not set 368 | # CONFIG_IPV6_MIP6 is not set 369 | # CONFIG_INET6_XFRM_TUNNEL is not set 370 | CONFIG_INET6_TUNNEL=m 371 | # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set 372 | # CONFIG_INET6_XFRM_MODE_TUNNEL is not set 373 | # CONFIG_INET6_XFRM_MODE_BEET is not set 374 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set 375 | CONFIG_IPV6_SIT=m 376 | CONFIG_IPV6_NDISC_NODETYPE=y 377 | CONFIG_IPV6_TUNNEL=m 378 | CONFIG_IP46_NAT=m 379 | CONFIG_IPV6_MULTIPLE_TABLES=y 380 | CONFIG_IPV6_SUBTREES=y 381 | CONFIG_IPV6_MROUTE=y 382 | # CONFIG_IPV6_PIMSM_V2 is not set 383 | # CONFIG_NETWORK_SECMARK is not set 384 | CONFIG_NETFILTER=y 385 | # CONFIG_NETFILTER_DEBUG is not set 386 | CONFIG_NETFILTER_ADVANCED=y 387 | # CONFIG_BRIDGE_NETFILTER is not set 388 | 389 | # 390 | # Core Netfilter Configuration 391 | # 392 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set 393 | # CONFIG_NETFILTER_NETLINK_LOG is not set 394 | CONFIG_NF_CONNTRACK=m 395 | # CONFIG_NF_CT_ACCT is not set 396 | CONFIG_NF_CONNTRACK_MARK=y 397 | # CONFIG_NF_CONNTRACK_EVENTS is not set 398 | # CONFIG_NF_CT_PROTO_DCCP is not set 399 | # CONFIG_NF_CT_PROTO_SCTP is not set 400 | # CONFIG_NF_CT_PROTO_UDPLITE is not set 401 | # CONFIG_NF_CONNTRACK_AMANDA is not set 402 | CONFIG_NF_CONNTRACK_FTP=m 403 | # CONFIG_NF_CONNTRACK_H323 is not set 404 | CONFIG_NF_CONNTRACK_IRC=m 405 | # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set 406 | # CONFIG_NF_CONNTRACK_PPTP is not set 407 | # CONFIG_NF_CONNTRACK_SANE is not set 408 | # CONFIG_NF_CONNTRACK_SIP is not set 409 | CONFIG_NF_CONNTRACK_TFTP=m 410 | # CONFIG_NF_CONNTRACK_RTSP is not set 411 | # CONFIG_NF_CT_NETLINK is not set 412 | # CONFIG_NETFILTER_TPROXY is not set 413 | CONFIG_NETFILTER_XTABLES=m 414 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set 415 | # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set 416 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set 417 | # CONFIG_NETFILTER_XT_TARGET_HL is not set 418 | # CONFIG_NETFILTER_XT_TARGET_LED is not set 419 | # CONFIG_NETFILTER_XT_TARGET_IMQ is not set 420 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set 421 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set 422 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set 423 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m 424 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set 425 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set 426 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m 427 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set 428 | # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set 429 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m 430 | # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set 431 | # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set 432 | # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set 433 | # CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set 434 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set 435 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set 436 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set 437 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set 438 | # CONFIG_NETFILTER_XT_MATCH_HELPER is not set 439 | # CONFIG_NETFILTER_XT_MATCH_HL is not set 440 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set 441 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set 442 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m 443 | CONFIG_NETFILTER_XT_MATCH_MAC=m 444 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set 445 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m 446 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set 447 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set 448 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set 449 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set 450 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set 451 | # CONFIG_NETFILTER_XT_MATCH_RECENT is not set 452 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set 453 | CONFIG_NETFILTER_XT_MATCH_STATE=m 454 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set 455 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set 456 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set 457 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set 458 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set 459 | # CONFIG_IP_VS is not set 460 | 461 | # 462 | # IP: Netfilter Configuration 463 | # 464 | CONFIG_NF_DEFRAG_IPV4=m 465 | CONFIG_NF_CONNTRACK_IPV4=m 466 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y 467 | # CONFIG_IP_NF_QUEUE is not set 468 | CONFIG_IP_NF_IPTABLES=m 469 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set 470 | # CONFIG_IP_NF_MATCH_AH is not set 471 | # CONFIG_IP_NF_MATCH_ECN is not set 472 | # CONFIG_IP_NF_MATCH_TTL is not set 473 | CONFIG_IP_NF_FILTER=m 474 | CONFIG_IP_NF_TARGET_REJECT=m 475 | CONFIG_IP_NF_TARGET_LOG=m 476 | # CONFIG_IP_NF_TARGET_ULOG is not set 477 | CONFIG_NF_NAT=m 478 | CONFIG_NF_NAT_NEEDED=y 479 | CONFIG_IP_NF_TARGET_MASQUERADE=m 480 | # CONFIG_IP_NF_TARGET_NETMAP is not set 481 | # CONFIG_IP_NF_TARGET_REDIRECT is not set 482 | # CONFIG_NF_NAT_SNMP_BASIC is not set 483 | CONFIG_NF_NAT_FTP=m 484 | CONFIG_NF_NAT_IRC=m 485 | # CONFIG_NF_NAT_RTSP is not set 486 | CONFIG_NF_NAT_TFTP=m 487 | # CONFIG_NF_NAT_AMANDA is not set 488 | # CONFIG_NF_NAT_PPTP is not set 489 | # CONFIG_NF_NAT_H323 is not set 490 | # CONFIG_NF_NAT_SIP is not set 491 | CONFIG_IP_NF_MANGLE=m 492 | # CONFIG_IP_NF_TARGET_CLUSTERIP is not set 493 | # CONFIG_IP_NF_TARGET_ECN is not set 494 | # CONFIG_IP_NF_TARGET_TTL is not set 495 | CONFIG_IP_NF_RAW=m 496 | # CONFIG_IP_NF_ARPTABLES is not set 497 | 498 | # 499 | # IPv6: Netfilter Configuration 500 | # 501 | CONFIG_NF_CONNTRACK_IPV6=m 502 | CONFIG_IP6_NF_QUEUE=m 503 | CONFIG_IP6_NF_IPTABLES=m 504 | CONFIG_IP6_NF_MATCH_AH=m 505 | CONFIG_IP6_NF_MATCH_EUI64=m 506 | CONFIG_IP6_NF_MATCH_FRAG=m 507 | CONFIG_IP6_NF_MATCH_OPTS=m 508 | # CONFIG_IP6_NF_MATCH_HL is not set 509 | CONFIG_IP6_NF_MATCH_IPV6HEADER=m 510 | CONFIG_IP6_NF_MATCH_MH=m 511 | CONFIG_IP6_NF_MATCH_RT=m 512 | # CONFIG_IP6_NF_TARGET_HL is not set 513 | CONFIG_IP6_NF_TARGET_LOG=m 514 | CONFIG_IP6_NF_FILTER=m 515 | CONFIG_IP6_NF_TARGET_REJECT=m 516 | CONFIG_IP6_NF_MANGLE=m 517 | CONFIG_IP6_NF_RAW=m 518 | # CONFIG_IP_DCCP is not set 519 | # CONFIG_IP_SCTP is not set 520 | # CONFIG_RDS is not set 521 | # CONFIG_TIPC is not set 522 | # CONFIG_ATM is not set 523 | CONFIG_STP=y 524 | CONFIG_BRIDGE=y 525 | # CONFIG_NET_DSA is not set 526 | CONFIG_VLAN_8021Q=y 527 | # CONFIG_VLAN_8021Q_GVRP is not set 528 | # CONFIG_DECNET is not set 529 | CONFIG_LLC=y 530 | # CONFIG_LLC2 is not set 531 | # CONFIG_IPX is not set 532 | # CONFIG_ATALK is not set 533 | # CONFIG_X25 is not set 534 | # CONFIG_LAPB is not set 535 | # CONFIG_ECONET is not set 536 | # CONFIG_WAN_ROUTER is not set 537 | # CONFIG_PHONET is not set 538 | # CONFIG_IEEE802154 is not set 539 | CONFIG_NET_SCHED=y 540 | 541 | # 542 | # Queueing/Scheduling 543 | # 544 | # CONFIG_NET_SCH_CBQ is not set 545 | # CONFIG_NET_SCH_HTB is not set 546 | # CONFIG_NET_SCH_HFSC is not set 547 | # CONFIG_NET_SCH_PRIO is not set 548 | # CONFIG_NET_SCH_MULTIQ is not set 549 | # CONFIG_NET_SCH_RED is not set 550 | # CONFIG_NET_SCH_SFQ is not set 551 | # CONFIG_NET_SCH_ESFQ is not set 552 | # CONFIG_NET_SCH_TEQL is not set 553 | # CONFIG_NET_SCH_TBF is not set 554 | # CONFIG_NET_SCH_GRED is not set 555 | # CONFIG_NET_SCH_DSMARK is not set 556 | # CONFIG_NET_SCH_NETEM is not set 557 | # CONFIG_NET_SCH_DRR is not set 558 | # CONFIG_NET_SCH_INGRESS is not set 559 | 560 | # 561 | # Classification 562 | # 563 | CONFIG_NET_CLS=y 564 | CONFIG_NET_CLS_BASIC=y 565 | # CONFIG_NET_CLS_TCINDEX is not set 566 | # CONFIG_NET_CLS_ROUTE4 is not set 567 | # CONFIG_NET_CLS_FW is not set 568 | # CONFIG_NET_CLS_U32 is not set 569 | # CONFIG_NET_CLS_RSVP is not set 570 | # CONFIG_NET_CLS_RSVP6 is not set 571 | # CONFIG_NET_CLS_FLOW is not set 572 | # CONFIG_NET_EMATCH is not set 573 | CONFIG_NET_CLS_ACT=y 574 | # CONFIG_NET_ACT_POLICE is not set 575 | # CONFIG_NET_ACT_GACT is not set 576 | # CONFIG_NET_ACT_MIRRED is not set 577 | # CONFIG_NET_ACT_IPT is not set 578 | # CONFIG_NET_ACT_NAT is not set 579 | # CONFIG_NET_ACT_PEDIT is not set 580 | # CONFIG_NET_ACT_SIMP is not set 581 | CONFIG_NET_ACT_SKBEDIT=y 582 | CONFIG_NET_SCH_FIFO=y 583 | # CONFIG_DCB is not set 584 | 585 | # 586 | # Network testing 587 | # 588 | # CONFIG_NET_PKTGEN is not set 589 | # CONFIG_HAMRADIO is not set 590 | # CONFIG_CAN is not set 591 | # CONFIG_IRDA is not set 592 | # CONFIG_BT is not set 593 | # CONFIG_AF_RXRPC is not set 594 | CONFIG_FIB_RULES=y 595 | CONFIG_WIRELESS=y 596 | # CONFIG_CFG80211 is not set 597 | CONFIG_CFG80211_DEFAULT_PS_VALUE=0 598 | CONFIG_WIRELESS_OLD_REGULATORY=y 599 | CONFIG_WIRELESS_EXT=y 600 | CONFIG_WIRELESS_EXT_SYSFS=y 601 | # CONFIG_LIB80211 is not set 602 | # CONFIG_LIB80211_CRYPT_WEP is not set 603 | # CONFIG_LIB80211_CRYPT_CCMP is not set 604 | # CONFIG_LIB80211_CRYPT_TKIP is not set 605 | 606 | # 607 | # CFG80211 needs to be enabled for MAC80211 608 | # 609 | 610 | # 611 | # Some wireless drivers require a rate control algorithm 612 | # 613 | # CONFIG_WIMAX is not set 614 | # CONFIG_RFKILL is not set 615 | # CONFIG_NET_9P is not set 616 | 617 | # 618 | # Device Drivers 619 | # 620 | 621 | # 622 | # Generic Driver Options 623 | # 624 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 625 | # CONFIG_DEVTMPFS is not set 626 | CONFIG_STANDALONE=y 627 | CONFIG_PREVENT_FIRMWARE_BUILD=y 628 | CONFIG_FW_LOADER=y 629 | # CONFIG_FIRMWARE_IN_KERNEL is not set 630 | CONFIG_EXTRA_FIRMWARE="" 631 | # CONFIG_SYS_HYPERVISOR is not set 632 | # CONFIG_CONNECTOR is not set 633 | CONFIG_MTD=y 634 | # CONFIG_MTD_DEBUG is not set 635 | # CONFIG_MTD_TESTS is not set 636 | # CONFIG_MTD_CONCAT is not set 637 | CONFIG_MTD_PARTITIONS=y 638 | CONFIG_MTD_ROOTFS_ROOT_DEV=y 639 | CONFIG_MTD_ROOTFS_SPLIT=y 640 | # CONFIG_MTD_REDBOOT_PARTS is not set 641 | # CONFIG_MTD_CMDLINE_PARTS is not set 642 | # CONFIG_MTD_AR7_PARTS is not set 643 | 644 | # 645 | # User Modules And Translation Layers 646 | # 647 | CONFIG_MTD_CHAR=y 648 | CONFIG_MTD_BLKDEVS=y 649 | CONFIG_MTD_BLOCK=y 650 | # CONFIG_FTL is not set 651 | # CONFIG_NFTL is not set 652 | # CONFIG_INFTL is not set 653 | # CONFIG_RFD_FTL is not set 654 | # CONFIG_SSFDC is not set 655 | # CONFIG_MTD_OOPS is not set 656 | 657 | # 658 | # RAM/ROM/Flash chip drivers 659 | # 660 | CONFIG_MTD_CFI=y 661 | # CONFIG_MTD_JEDECPROBE is not set 662 | CONFIG_MTD_GEN_PROBE=y 663 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set 664 | CONFIG_MTD_MAP_BANK_WIDTH_1=y 665 | CONFIG_MTD_MAP_BANK_WIDTH_2=y 666 | CONFIG_MTD_MAP_BANK_WIDTH_4=y 667 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set 668 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set 669 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set 670 | CONFIG_MTD_CFI_I1=y 671 | CONFIG_MTD_CFI_I2=y 672 | # CONFIG_MTD_CFI_I4 is not set 673 | # CONFIG_MTD_CFI_I8 is not set 674 | CONFIG_MTD_CFI_INTELEXT=y 675 | CONFIG_MTD_CFI_AMDSTD=y 676 | # CONFIG_MTD_CFI_STAA is not set 677 | CONFIG_MTD_CFI_UTIL=y 678 | # CONFIG_MTD_RAM is not set 679 | # CONFIG_MTD_ROM is not set 680 | # CONFIG_MTD_ABSENT is not set 681 | 682 | # 683 | # Mapping drivers for chip access 684 | # 685 | CONFIG_MTD_COMPLEX_MAPPINGS=y 686 | # CONFIG_MTD_PHYSMAP is not set 687 | CONFIG_MTD_BCM47XX=y 688 | # CONFIG_MTD_PCI is not set 689 | # CONFIG_MTD_GPIO_ADDR is not set 690 | # CONFIG_MTD_INTEL_VR_NOR is not set 691 | # CONFIG_MTD_PLATRAM is not set 692 | 693 | # 694 | # Self-contained MTD device drivers 695 | # 696 | # CONFIG_MTD_PMC551 is not set 697 | # CONFIG_MTD_SLRAM is not set 698 | # CONFIG_MTD_PHRAM is not set 699 | # CONFIG_MTD_MTDRAM is not set 700 | # CONFIG_MTD_BLOCK2MTD is not set 701 | 702 | # 703 | # Disk-On-Chip Device Drivers 704 | # 705 | # CONFIG_MTD_DOC2000 is not set 706 | # CONFIG_MTD_DOC2001 is not set 707 | # CONFIG_MTD_DOC2001PLUS is not set 708 | # CONFIG_MTD_NAND is not set 709 | # CONFIG_MTD_ONENAND is not set 710 | 711 | # 712 | # LPDDR flash memory drivers 713 | # 714 | # CONFIG_MTD_LPDDR is not set 715 | 716 | # 717 | # UBI - Unsorted block images 718 | # 719 | # CONFIG_MTD_UBI is not set 720 | # CONFIG_PARPORT is not set 721 | CONFIG_BLK_DEV=y 722 | # CONFIG_BLK_CPQ_DA is not set 723 | # CONFIG_BLK_CPQ_CISS_DA is not set 724 | # CONFIG_BLK_DEV_DAC960 is not set 725 | # CONFIG_BLK_DEV_UMEM is not set 726 | # CONFIG_BLK_DEV_COW_COMMON is not set 727 | # CONFIG_BLK_DEV_LOOP is not set 728 | # CONFIG_BLK_DEV_NBD is not set 729 | # CONFIG_BLK_DEV_SX8 is not set 730 | # CONFIG_BLK_DEV_RAM is not set 731 | # CONFIG_CDROM_PKTCDVD is not set 732 | # CONFIG_ATA_OVER_ETH is not set 733 | # CONFIG_BLK_DEV_HD is not set 734 | CONFIG_MISC_DEVICES=y 735 | # CONFIG_PHANTOM is not set 736 | # CONFIG_SGI_IOC4 is not set 737 | # CONFIG_TIFM_CORE is not set 738 | # CONFIG_ENCLOSURE_SERVICES is not set 739 | # CONFIG_HP_ILO is not set 740 | # CONFIG_C2PORT is not set 741 | 742 | # 743 | # EEPROM support 744 | # 745 | # CONFIG_EEPROM_93CX6 is not set 746 | # CONFIG_CB710_CORE is not set 747 | CONFIG_HAVE_IDE=y 748 | # CONFIG_IDE is not set 749 | 750 | # 751 | # SCSI device support 752 | # 753 | # CONFIG_RAID_ATTRS is not set 754 | # CONFIG_SCSI is not set 755 | # CONFIG_SCSI_DMA is not set 756 | # CONFIG_SCSI_NETLINK is not set 757 | # CONFIG_ATA is not set 758 | # CONFIG_MD is not set 759 | # CONFIG_FUSION is not set 760 | 761 | # 762 | # IEEE 1394 (FireWire) support 763 | # 764 | 765 | # 766 | # You can enable one or both FireWire driver stacks. 767 | # 768 | 769 | # 770 | # See the help texts for more information. 771 | # 772 | # CONFIG_FIREWIRE is not set 773 | # CONFIG_IEEE1394 is not set 774 | # CONFIG_I2O is not set 775 | CONFIG_NETDEVICES=y 776 | # CONFIG_IFB is not set 777 | # CONFIG_DUMMY is not set 778 | # CONFIG_BONDING is not set 779 | # CONFIG_MACVLAN is not set 780 | # CONFIG_EQUALIZER is not set 781 | # CONFIG_IMQ is not set 782 | # CONFIG_TUN is not set 783 | # CONFIG_VETH is not set 784 | # CONFIG_ARCNET is not set 785 | CONFIG_PHYLIB=y 786 | # CONFIG_SWCONFIG is not set 787 | 788 | # 789 | # MII PHY device drivers 790 | # 791 | # CONFIG_MARVELL_PHY is not set 792 | # CONFIG_DAVICOM_PHY is not set 793 | # CONFIG_QSEMI_PHY is not set 794 | # CONFIG_LXT_PHY is not set 795 | # CONFIG_CICADA_PHY is not set 796 | # CONFIG_VITESSE_PHY is not set 797 | # CONFIG_SMSC_PHY is not set 798 | # CONFIG_BROADCOM_PHY is not set 799 | # CONFIG_ICPLUS_PHY is not set 800 | # CONFIG_REALTEK_PHY is not set 801 | # CONFIG_NATIONAL_PHY is not set 802 | # CONFIG_STE10XP is not set 803 | # CONFIG_LSI_ET1011C_PHY is not set 804 | # CONFIG_ADM6996_PHY is not set 805 | # CONFIG_MVSWITCH_PHY is not set 806 | # CONFIG_IP17XX_PHY is not set 807 | # CONFIG_AR8216_PHY is not set 808 | # CONFIG_RTL8306_PHY is not set 809 | # CONFIG_FIXED_PHY is not set 810 | # CONFIG_MDIO_BITBANG is not set 811 | # CONFIG_RTL8366_SMI is not set 812 | CONFIG_NET_ETHERNET=y 813 | CONFIG_MII=y 814 | # CONFIG_AX88796 is not set 815 | # CONFIG_HAPPYMEAL is not set 816 | # CONFIG_SUNGEM is not set 817 | # CONFIG_CASSINI is not set 818 | # CONFIG_NET_VENDOR_3COM is not set 819 | # CONFIG_SMC91X is not set 820 | # CONFIG_DM9000 is not set 821 | # CONFIG_ETHOC is not set 822 | # CONFIG_DNET is not set 823 | # CONFIG_NET_TULIP is not set 824 | # CONFIG_HP100 is not set 825 | # CONFIG_IBM_NEW_EMAC_ZMII is not set 826 | # CONFIG_IBM_NEW_EMAC_RGMII is not set 827 | # CONFIG_IBM_NEW_EMAC_TAH is not set 828 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set 829 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set 830 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set 831 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set 832 | CONFIG_NET_PCI=y 833 | # CONFIG_PCNET32 is not set 834 | # CONFIG_AMD8111_ETH is not set 835 | # CONFIG_ADAPTEC_STARFIRE is not set 836 | CONFIG_B44=y 837 | CONFIG_B44_PCI_AUTOSELECT=y 838 | CONFIG_B44_PCICORE_AUTOSELECT=y 839 | CONFIG_B44_PCI=y 840 | # CONFIG_FORCEDETH is not set 841 | # CONFIG_TC35815 is not set 842 | # CONFIG_E100 is not set 843 | # CONFIG_FEALNX is not set 844 | # CONFIG_NATSEMI is not set 845 | # CONFIG_NE2K_PCI is not set 846 | # CONFIG_8139CP is not set 847 | # CONFIG_8139TOO is not set 848 | # CONFIG_R6040 is not set 849 | # CONFIG_SIS900 is not set 850 | # CONFIG_EPIC100 is not set 851 | # CONFIG_SMSC9420 is not set 852 | # CONFIG_SUNDANCE is not set 853 | # CONFIG_TLAN is not set 854 | # CONFIG_KS8842 is not set 855 | # CONFIG_KS8851_MLL is not set 856 | # CONFIG_VIA_RHINE is not set 857 | # CONFIG_SC92031 is not set 858 | # CONFIG_ATL2 is not set 859 | CONFIG_NETDEV_1000=y 860 | # CONFIG_ACENIC is not set 861 | # CONFIG_DL2K is not set 862 | # CONFIG_E1000 is not set 863 | # CONFIG_E1000E is not set 864 | # CONFIG_IP1000 is not set 865 | # CONFIG_IGB is not set 866 | # CONFIG_IGBVF is not set 867 | # CONFIG_NS83820 is not set 868 | # CONFIG_HAMACHI is not set 869 | # CONFIG_YELLOWFIN is not set 870 | # CONFIG_R8169 is not set 871 | # CONFIG_SIS190 is not set 872 | # CONFIG_SKGE is not set 873 | # CONFIG_SKY2 is not set 874 | # CONFIG_VIA_VELOCITY is not set 875 | # CONFIG_TIGON3 is not set 876 | # CONFIG_BNX2 is not set 877 | # CONFIG_CNIC is not set 878 | # CONFIG_QLA3XXX is not set 879 | # CONFIG_ATL1 is not set 880 | # CONFIG_ATL1E is not set 881 | # CONFIG_ATL1C is not set 882 | # CONFIG_JME is not set 883 | # CONFIG_NETDEV_10000 is not set 884 | # CONFIG_TR is not set 885 | CONFIG_WLAN=y 886 | # CONFIG_WLAN_PRE80211 is not set 887 | CONFIG_WLAN_80211=y 888 | # CONFIG_LIBERTAS is not set 889 | # CONFIG_ATMEL is not set 890 | # CONFIG_PRISM54 is not set 891 | # CONFIG_HOSTAP is not set 892 | 893 | # 894 | # Enable WiMAX (Networking options) to see the WiMAX drivers 895 | # 896 | # CONFIG_WAN is not set 897 | # CONFIG_FDDI is not set 898 | # CONFIG_HIPPI is not set 899 | # CONFIG_PPP is not set 900 | # CONFIG_SLIP is not set 901 | # CONFIG_NETCONSOLE is not set 902 | # CONFIG_NETPOLL is not set 903 | # CONFIG_NET_POLL_CONTROLLER is not set 904 | CONFIG_ISDN=y 905 | # CONFIG_ISDN_I4L is not set 906 | # CONFIG_MISDN is not set 907 | # CONFIG_ISDN_CAPI is not set 908 | # CONFIG_PHONE is not set 909 | 910 | # 911 | # Input device support 912 | # 913 | # CONFIG_INPUT is not set 914 | 915 | # 916 | # Hardware I/O ports 917 | # 918 | # CONFIG_SERIO is not set 919 | # CONFIG_GAMEPORT is not set 920 | 921 | # 922 | # Character devices 923 | # 924 | # CONFIG_VT is not set 925 | # CONFIG_DEVKMEM is not set 926 | # CONFIG_SERIAL_NONSTANDARD is not set 927 | # CONFIG_NOZOMI is not set 928 | 929 | # 930 | # Serial drivers 931 | # 932 | CONFIG_SERIAL_8250=y 933 | CONFIG_SERIAL_8250_CONSOLE=y 934 | # CONFIG_SERIAL_8250_PCI is not set 935 | CONFIG_SERIAL_8250_NR_UARTS=2 936 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 937 | CONFIG_SERIAL_8250_EXTENDED=y 938 | # CONFIG_SERIAL_8250_MANY_PORTS is not set 939 | CONFIG_SERIAL_8250_SHARE_IRQ=y 940 | # CONFIG_SERIAL_8250_DETECT_IRQ is not set 941 | # CONFIG_SERIAL_8250_RSA is not set 942 | 943 | # 944 | # Non-8250 serial port support 945 | # 946 | CONFIG_SERIAL_CORE=y 947 | CONFIG_SERIAL_CORE_CONSOLE=y 948 | # CONFIG_SERIAL_JSM is not set 949 | CONFIG_UNIX98_PTYS=y 950 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set 951 | # CONFIG_LEGACY_PTYS is not set 952 | # CONFIG_IPMI_HANDLER is not set 953 | CONFIG_HW_RANDOM=y 954 | # CONFIG_HW_RANDOM_TIMERIOMEM is not set 955 | # CONFIG_R3964 is not set 956 | # CONFIG_APPLICOM is not set 957 | # CONFIG_GPIO_DEVICE is not set 958 | # CONFIG_RAW_DRIVER is not set 959 | # CONFIG_TCG_TPM is not set 960 | CONFIG_DEVPORT=y 961 | # CONFIG_I2C is not set 962 | # CONFIG_SPI is not set 963 | 964 | # 965 | # PPS support 966 | # 967 | # CONFIG_PPS is not set 968 | # CONFIG_W1 is not set 969 | # CONFIG_POWER_SUPPLY is not set 970 | # CONFIG_HWMON is not set 971 | # CONFIG_THERMAL is not set 972 | CONFIG_WATCHDOG=y 973 | CONFIG_WATCHDOG_NOWAYOUT=y 974 | 975 | # 976 | # Watchdog Device Drivers 977 | # 978 | # CONFIG_SOFT_WATCHDOG is not set 979 | # CONFIG_ALIM7101_WDT is not set 980 | CONFIG_BCM47XX_WDT=y 981 | 982 | # 983 | # PCI-based Watchdog Cards 984 | # 985 | # CONFIG_PCIPCWATCHDOG is not set 986 | # CONFIG_WDTPCI is not set 987 | CONFIG_SSB_POSSIBLE=y 988 | 989 | # 990 | # Sonics Silicon Backplane 991 | # 992 | CONFIG_SSB=y 993 | CONFIG_SSB_SPROM=y 994 | CONFIG_SSB_BLOCKIO=y 995 | CONFIG_SSB_PCIHOST_POSSIBLE=y 996 | CONFIG_SSB_PCIHOST=y 997 | CONFIG_SSB_B43_PCI_BRIDGE=y 998 | # CONFIG_SSB_SILENT is not set 999 | CONFIG_SSB_DEBUG=y 1000 | CONFIG_SSB_SERIAL=y 1001 | CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y 1002 | CONFIG_SSB_DRIVER_PCICORE=y 1003 | CONFIG_SSB_PCICORE_HOSTMODE=y 1004 | CONFIG_SSB_DRIVER_MIPS=y 1005 | CONFIG_SSB_EMBEDDED=y 1006 | CONFIG_SSB_DRIVER_EXTIF=y 1007 | CONFIG_SSB_DRIVER_GIGE=y 1008 | 1009 | # 1010 | # Multifunction device drivers 1011 | # 1012 | # CONFIG_MFD_CORE is not set 1013 | # CONFIG_MFD_SM501 is not set 1014 | # CONFIG_HTC_PASIC3 is not set 1015 | # CONFIG_MFD_TMIO is not set 1016 | # CONFIG_REGULATOR is not set 1017 | # CONFIG_MEDIA_SUPPORT is not set 1018 | 1019 | # 1020 | # Graphics support 1021 | # 1022 | # CONFIG_VGA_ARB is not set 1023 | # CONFIG_DRM is not set 1024 | # CONFIG_VGASTATE is not set 1025 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set 1026 | # CONFIG_FB is not set 1027 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set 1028 | 1029 | # 1030 | # Display device support 1031 | # 1032 | # CONFIG_DISPLAY_SUPPORT is not set 1033 | # CONFIG_SOUND is not set 1034 | CONFIG_USB_SUPPORT=y 1035 | CONFIG_USB_ARCH_HAS_HCD=y 1036 | CONFIG_USB_ARCH_HAS_OHCI=y 1037 | CONFIG_USB_ARCH_HAS_EHCI=y 1038 | # CONFIG_USB is not set 1039 | # CONFIG_USB_OTG_WHITELIST is not set 1040 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set 1041 | 1042 | # 1043 | # Enable Host or Gadget support to see Inventra options 1044 | # 1045 | 1046 | # 1047 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may 1048 | # 1049 | # CONFIG_USB_GADGET is not set 1050 | 1051 | # 1052 | # OTG and related infrastructure 1053 | # 1054 | # CONFIG_UWB is not set 1055 | # CONFIG_MMC is not set 1056 | # CONFIG_MEMSTICK is not set 1057 | CONFIG_NEW_LEDS=y 1058 | CONFIG_LEDS_CLASS=y 1059 | 1060 | # 1061 | # LED drivers 1062 | # 1063 | CONFIG_LEDS_GPIO=y 1064 | CONFIG_LEDS_GPIO_PLATFORM=y 1065 | 1066 | # 1067 | # LED Triggers 1068 | # 1069 | CONFIG_LEDS_TRIGGERS=y 1070 | CONFIG_LEDS_TRIGGER_TIMER=y 1071 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y 1072 | # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set 1073 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y 1074 | 1075 | # 1076 | # iptables trigger is under Netfilter config (LED target) 1077 | # 1078 | # CONFIG_LEDS_TRIGGER_MORSE is not set 1079 | CONFIG_LEDS_TRIGGER_NETDEV=y 1080 | # CONFIG_ACCESSIBILITY is not set 1081 | # CONFIG_INFINIBAND is not set 1082 | CONFIG_RTC_LIB=y 1083 | # CONFIG_RTC_CLASS is not set 1084 | # CONFIG_DMADEVICES is not set 1085 | # CONFIG_AUXDISPLAY is not set 1086 | # CONFIG_UIO is not set 1087 | 1088 | # 1089 | # TI VLYNQ 1090 | # 1091 | CONFIG_STAGING=y 1092 | # CONFIG_STAGING_EXCLUDE_BUILD is not set 1093 | # CONFIG_ET131X is not set 1094 | # CONFIG_ECHO is not set 1095 | # CONFIG_COMEDI is not set 1096 | # CONFIG_ALTERA_PCIE_CHDMA is not set 1097 | # CONFIG_RTL8187SE is not set 1098 | # CONFIG_RTL8192SU is not set 1099 | # CONFIG_RTL8192E is not set 1100 | 1101 | # 1102 | # Android 1103 | # 1104 | 1105 | # 1106 | # Qualcomm MSM Camera And Video 1107 | # 1108 | 1109 | # 1110 | # Camera Sensor Selection 1111 | # 1112 | # CONFIG_INPUT_GPIO is not set 1113 | # CONFIG_DST is not set 1114 | # CONFIG_POHMELFS is not set 1115 | # CONFIG_B3DFG is not set 1116 | # CONFIG_PLAN9AUTH is not set 1117 | # CONFIG_VT6655 is not set 1118 | # CONFIG_VME_BUS is not set 1119 | 1120 | # 1121 | # RAR Register Driver 1122 | # 1123 | # CONFIG_RAR_REGISTER is not set 1124 | # CONFIG_IIO is not set 1125 | 1126 | # 1127 | # File systems 1128 | # 1129 | # CONFIG_EXT2_FS is not set 1130 | # CONFIG_EXT3_FS is not set 1131 | # CONFIG_EXT4_FS is not set 1132 | # CONFIG_REISERFS_FS is not set 1133 | # CONFIG_JFS_FS is not set 1134 | # CONFIG_FS_POSIX_ACL is not set 1135 | # CONFIG_XFS_FS is not set 1136 | # CONFIG_GFS2_FS is not set 1137 | # CONFIG_OCFS2_FS is not set 1138 | # CONFIG_BTRFS_FS is not set 1139 | # CONFIG_NILFS2_FS is not set 1140 | # CONFIG_YAFFS_FS is not set 1141 | CONFIG_FILE_LOCKING=y 1142 | # CONFIG_FSNOTIFY is not set 1143 | # CONFIG_DNOTIFY is not set 1144 | # CONFIG_INOTIFY is not set 1145 | # CONFIG_INOTIFY_USER is not set 1146 | # CONFIG_QUOTA is not set 1147 | # CONFIG_AUTOFS_FS is not set 1148 | # CONFIG_AUTOFS4_FS is not set 1149 | # CONFIG_FUSE_FS is not set 1150 | 1151 | # 1152 | # Caches 1153 | # 1154 | # CONFIG_FSCACHE is not set 1155 | 1156 | # 1157 | # CD-ROM/DVD Filesystems 1158 | # 1159 | # CONFIG_ISO9660_FS is not set 1160 | # CONFIG_UDF_FS is not set 1161 | 1162 | # 1163 | # DOS/FAT/NT Filesystems 1164 | # 1165 | # CONFIG_MSDOS_FS is not set 1166 | # CONFIG_VFAT_FS is not set 1167 | # CONFIG_NTFS_FS is not set 1168 | 1169 | # 1170 | # Pseudo filesystems 1171 | # 1172 | CONFIG_PROC_FS=y 1173 | # CONFIG_PROC_KCORE is not set 1174 | CONFIG_PROC_SYSCTL=y 1175 | # CONFIG_PROC_PAGE_MONITOR is not set 1176 | CONFIG_SYSFS=y 1177 | CONFIG_TMPFS=y 1178 | # CONFIG_TMPFS_POSIX_ACL is not set 1179 | # CONFIG_HUGETLB_PAGE is not set 1180 | # CONFIG_CONFIGFS_FS is not set 1181 | CONFIG_MISC_FILESYSTEMS=y 1182 | # CONFIG_ADFS_FS is not set 1183 | # CONFIG_AFFS_FS is not set 1184 | # CONFIG_HFS_FS is not set 1185 | # CONFIG_HFSPLUS_FS is not set 1186 | # CONFIG_BEFS_FS is not set 1187 | # CONFIG_BFS_FS is not set 1188 | # CONFIG_EFS_FS is not set 1189 | CONFIG_JFFS2_FS=y 1190 | CONFIG_JFFS2_FS_DEBUG=0 1191 | CONFIG_JFFS2_FS_WRITEBUFFER=y 1192 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set 1193 | CONFIG_JFFS2_SUMMARY=y 1194 | # CONFIG_JFFS2_FS_XATTR is not set 1195 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y 1196 | CONFIG_JFFS2_ZLIB=y 1197 | # CONFIG_JFFS2_LZO is not set 1198 | CONFIG_JFFS2_RTIME=y 1199 | # CONFIG_JFFS2_RUBIN is not set 1200 | # CONFIG_JFFS2_CMODE_NONE is not set 1201 | CONFIG_JFFS2_CMODE_PRIORITY=y 1202 | # CONFIG_JFFS2_CMODE_SIZE is not set 1203 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set 1204 | # CONFIG_CRAMFS is not set 1205 | CONFIG_SQUASHFS=y 1206 | CONFIG_SQUASHFS_LZMA=y 1207 | # CONFIG_SQUASHFS_EMBEDDED is not set 1208 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 1209 | # CONFIG_VXFS_FS is not set 1210 | CONFIG_MINI_FO=y 1211 | # CONFIG_MINIX_FS is not set 1212 | # CONFIG_OMFS_FS is not set 1213 | # CONFIG_HPFS_FS is not set 1214 | # CONFIG_QNX4FS_FS is not set 1215 | # CONFIG_ROMFS_FS is not set 1216 | # CONFIG_SYSV_FS is not set 1217 | # CONFIG_UFS_FS is not set 1218 | CONFIG_NETWORK_FILESYSTEMS=y 1219 | # CONFIG_NFS_FS is not set 1220 | # CONFIG_NFSD is not set 1221 | # CONFIG_SMB_FS is not set 1222 | # CONFIG_CIFS is not set 1223 | # CONFIG_NCP_FS is not set 1224 | # CONFIG_CODA_FS is not set 1225 | # CONFIG_AFS_FS is not set 1226 | 1227 | # 1228 | # Partition Types 1229 | # 1230 | CONFIG_PARTITION_ADVANCED=y 1231 | # CONFIG_ACORN_PARTITION is not set 1232 | # CONFIG_OSF_PARTITION is not set 1233 | # CONFIG_AMIGA_PARTITION is not set 1234 | # CONFIG_ATARI_PARTITION is not set 1235 | # CONFIG_MAC_PARTITION is not set 1236 | CONFIG_MSDOS_PARTITION=y 1237 | # CONFIG_BSD_DISKLABEL is not set 1238 | # CONFIG_MINIX_SUBPARTITION is not set 1239 | # CONFIG_SOLARIS_X86_PARTITION is not set 1240 | # CONFIG_UNIXWARE_DISKLABEL is not set 1241 | # CONFIG_LDM_PARTITION is not set 1242 | # CONFIG_SGI_PARTITION is not set 1243 | # CONFIG_ULTRIX_PARTITION is not set 1244 | # CONFIG_SUN_PARTITION is not set 1245 | # CONFIG_KARMA_PARTITION is not set 1246 | # CONFIG_EFI_PARTITION is not set 1247 | # CONFIG_SYSV68_PARTITION is not set 1248 | # CONFIG_NLS is not set 1249 | # CONFIG_DLM is not set 1250 | 1251 | # 1252 | # Kernel hacking 1253 | # 1254 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y 1255 | # CONFIG_PRINTK_TIME is not set 1256 | CONFIG_ENABLE_WARN_DEPRECATED=y 1257 | # CONFIG_ENABLE_MUST_CHECK is not set 1258 | CONFIG_FRAME_WARN=1024 1259 | CONFIG_MAGIC_SYSRQ=y 1260 | CONFIG_STRIP_ASM_SYMS=y 1261 | # CONFIG_UNUSED_SYMBOLS is not set 1262 | # CONFIG_DEBUG_FS is not set 1263 | # CONFIG_HEADERS_CHECK is not set 1264 | # CONFIG_DEBUG_KERNEL is not set 1265 | # CONFIG_DEBUG_MEMORY_INIT is not set 1266 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set 1267 | CONFIG_SYSCTL_SYSCALL_CHECK=y 1268 | CONFIG_TRACING_SUPPORT=y 1269 | # CONFIG_FTRACE is not set 1270 | # CONFIG_SAMPLES is not set 1271 | CONFIG_HAVE_ARCH_KGDB=y 1272 | CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200" 1273 | 1274 | # 1275 | # Security options 1276 | # 1277 | # CONFIG_KEYS is not set 1278 | # CONFIG_SECURITY is not set 1279 | # CONFIG_SECURITYFS is not set 1280 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set 1281 | CONFIG_CRYPTO=y 1282 | 1283 | # 1284 | # Crypto core or helper 1285 | # 1286 | CONFIG_CRYPTO_ALGAPI=y 1287 | CONFIG_CRYPTO_ALGAPI2=y 1288 | # CONFIG_CRYPTO_AEAD is not set 1289 | CONFIG_CRYPTO_AEAD2=y 1290 | CONFIG_CRYPTO_BLKCIPHER=m 1291 | CONFIG_CRYPTO_BLKCIPHER2=y 1292 | CONFIG_CRYPTO_HASH=m 1293 | CONFIG_CRYPTO_HASH2=y 1294 | # CONFIG_CRYPTO_RNG is not set 1295 | CONFIG_CRYPTO_RNG2=y 1296 | CONFIG_CRYPTO_PCOMP=y 1297 | CONFIG_CRYPTO_MANAGER=m 1298 | CONFIG_CRYPTO_MANAGER2=y 1299 | CONFIG_CRYPTO_MANAGER_NO_TESTS=y 1300 | # CONFIG_CRYPTO_GF128MUL is not set 1301 | # CONFIG_CRYPTO_NULL is not set 1302 | CONFIG_CRYPTO_WORKQUEUE=y 1303 | # CONFIG_CRYPTO_CRYPTD is not set 1304 | # CONFIG_CRYPTO_AUTHENC is not set 1305 | # CONFIG_CRYPTO_TEST is not set 1306 | 1307 | # 1308 | # Authenticated Encryption with Associated Data 1309 | # 1310 | # CONFIG_CRYPTO_CCM is not set 1311 | # CONFIG_CRYPTO_GCM is not set 1312 | # CONFIG_CRYPTO_SEQIV is not set 1313 | 1314 | # 1315 | # Block modes 1316 | # 1317 | CONFIG_CRYPTO_CBC=m 1318 | # CONFIG_CRYPTO_CTR is not set 1319 | # CONFIG_CRYPTO_CTS is not set 1320 | CONFIG_CRYPTO_ECB=m 1321 | # CONFIG_CRYPTO_LRW is not set 1322 | # CONFIG_CRYPTO_PCBC is not set 1323 | # CONFIG_CRYPTO_XTS is not set 1324 | 1325 | # 1326 | # Hash modes 1327 | # 1328 | CONFIG_CRYPTO_HMAC=m 1329 | # CONFIG_CRYPTO_XCBC is not set 1330 | # CONFIG_CRYPTO_VMAC is not set 1331 | 1332 | # 1333 | # Digest 1334 | # 1335 | # CONFIG_CRYPTO_CRC32C is not set 1336 | # CONFIG_CRYPTO_GHASH is not set 1337 | # CONFIG_CRYPTO_MD4 is not set 1338 | # CONFIG_CRYPTO_MD5 is not set 1339 | # CONFIG_CRYPTO_MICHAEL_MIC is not set 1340 | # CONFIG_CRYPTO_RMD128 is not set 1341 | # CONFIG_CRYPTO_RMD160 is not set 1342 | # CONFIG_CRYPTO_RMD256 is not set 1343 | # CONFIG_CRYPTO_RMD320 is not set 1344 | # CONFIG_CRYPTO_SHA1 is not set 1345 | # CONFIG_CRYPTO_SHA256 is not set 1346 | # CONFIG_CRYPTO_SHA512 is not set 1347 | # CONFIG_CRYPTO_TGR192 is not set 1348 | # CONFIG_CRYPTO_WP512 is not set 1349 | 1350 | # 1351 | # Ciphers 1352 | # 1353 | CONFIG_CRYPTO_AES=m 1354 | # CONFIG_CRYPTO_ANUBIS is not set 1355 | CONFIG_CRYPTO_ARC4=m 1356 | # CONFIG_CRYPTO_BLOWFISH is not set 1357 | # CONFIG_CRYPTO_CAMELLIA is not set 1358 | # CONFIG_CRYPTO_CAST5 is not set 1359 | # CONFIG_CRYPTO_CAST6 is not set 1360 | # CONFIG_CRYPTO_DES is not set 1361 | # CONFIG_CRYPTO_FCRYPT is not set 1362 | # CONFIG_CRYPTO_KHAZAD is not set 1363 | # CONFIG_CRYPTO_SALSA20 is not set 1364 | # CONFIG_CRYPTO_SEED is not set 1365 | # CONFIG_CRYPTO_SERPENT is not set 1366 | # CONFIG_CRYPTO_TEA is not set 1367 | # CONFIG_CRYPTO_TWOFISH is not set 1368 | 1369 | # 1370 | # Compression 1371 | # 1372 | CONFIG_CRYPTO_DEFLATE=m 1373 | CONFIG_CRYPTO_ZLIB=y 1374 | # CONFIG_CRYPTO_LZO is not set 1375 | 1376 | # 1377 | # Random Number Generation 1378 | # 1379 | # CONFIG_CRYPTO_ANSI_CPRNG is not set 1380 | 1381 | # 1382 | # OCF Configuration 1383 | # 1384 | # CONFIG_OCF_OCF is not set 1385 | # CONFIG_CRYPTO_HW is not set 1386 | # CONFIG_BINARY_PRINTF is not set 1387 | 1388 | # 1389 | # Library routines 1390 | # 1391 | CONFIG_BITREVERSE=y 1392 | CONFIG_GENERIC_FIND_LAST_BIT=y 1393 | # CONFIG_CRC_CCITT is not set 1394 | # CONFIG_CRC16 is not set 1395 | # CONFIG_CRC_T10DIF is not set 1396 | # CONFIG_CRC_ITU_T is not set 1397 | CONFIG_CRC32=y 1398 | # CONFIG_CRC7 is not set 1399 | # CONFIG_LIBCRC32C is not set 1400 | CONFIG_ZLIB_INFLATE=y 1401 | CONFIG_ZLIB_DEFLATE=y 1402 | CONFIG_DECOMPRESS_LZMA=y 1403 | CONFIG_DECOMPRESS_LZMA_NEEDED=y 1404 | CONFIG_TEXTSEARCH=y 1405 | # CONFIG_TEXTSEARCH_KMP is not set 1406 | # CONFIG_TEXTSEARCH_BM is not set 1407 | # CONFIG_TEXTSEARCH_FSM is not set 1408 | CONFIG_HAS_IOMEM=y 1409 | CONFIG_HAS_IOPORT=y 1410 | CONFIG_HAS_DMA=y 1411 | CONFIG_NLATTR=y 1412 | --------------------------------------------------------------------------------