| /* |
| * Copyright (c) 2009 Mindspeed Technologies, Inc. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| */ |
| |
| #include "module_ipsec.h" |
| #include "module_hidrv.h" |
| #include "system.h" |
| |
| #define SAGD_4_OUT 0x9020 |
| #define SAGD_4_IN 0x9021 |
| int IPsec_handle_CREATE_SA(U16 *p, U16 Length); |
| int IPsec_handle_SA_SET_KEYS(U16 *p, U16 Length); |
| int IPsec_handle_SA_SET_TUNNEL(U16 *p, U16 Length); |
| int IPsec_handle_SA_SET_STATE(U16 *p, U16 Length); |
| int IPsec_handle_SA_SET_LIFETIME(U16 *p, U16 Length); |
| int IPv4_HandleIP_CONNTRACK(U16 *p, U16 Length); |
| int IPv6_handle_CONNTRACK(U16 *p, U16 Length); |
| |
| int IP_HandleIP_ROUTE_RESOLVE (U16 *p, U16 Length); |
| CommandIPSecCreateSA create_cmd = |
| { |
| SAGD_4_OUT, |
| 0x0, |
| { 0x42020000, /* spi */ |
| IPPROTOCOL_ESP, |
| PROTO_FAMILY_IPV4, |
| 0x0, /* replay_window */ |
| 0x0, /* pad */ |
| {0x2a1eA8C0,0,0,0}, |
| {0,0,0,0}, |
| 1500, /*mtu*/ |
| 1500 |
| } |
| }; |
| |
| CommandIPSecCreateSA create_cmd_v6 = |
| { |
| SAGD_4_OUT, |
| 0x0, |
| { 0x42060000, /* spi */ |
| IPPROTOCOL_ESP, |
| PROTO_FAMILY_IPV6, |
| 0x0, /* replay_window */ |
| 0x0, /* pad */ |
| {0x00000120,0,0,0x02000000}, |
| {0,0,0,0}, |
| 1500, /*mtu*/ |
| 1500 |
| } |
| }; |
| |
| |
| CommandIPSecSetKey setkey_cmd = |
| { |
| SAGD_4_OUT, |
| 0x0, |
| 2 , /* num keys */ |
| 0x0, |
| { |
| { |
| 160, |
| SADB_AALG_SHA1HMAC, |
| 0, |
| {0x59,0x4d,0x1d,0x65,0x98,0x84,0x15,0x0a,0xda,0x9a,0x74,0x19,0x5e,0xac,0xa7,0xcd,0x63,0x58,0xc7,0x20} |
| }, |
| { |
| 192, |
| SADB_EALG_3DESCBC, |
| 1, |
| {0x7a,0xea,0xca,0x3f,0x87,0xd0,0x60,0xa1,0x2f,0x4a,0x44,0x87,0xd5,0xa5,0xc3,0x35,0x59,0x20,0xfa,0xe6,0x9a,0x96,0xc8,0x32} |
| } |
| } |
| }; |
| |
| |
| CommandIPSecCreateSA create_cmd_1 = |
| { |
| SAGD_4_IN, |
| 0x0, |
| { 0x42030000, /* spi */ |
| IPPROTOCOL_ESP, |
| PROTO_FAMILY_IPV4, |
| 0x0, /* replay_window */ |
| 0x0, /* pad */ |
| {0x341eA8C0,0,0,0}, |
| {0,0,0,0}, |
| 1500, /*mtu*/ |
| 1500 |
| } |
| }; |
| |
| CommandIPSecCreateSA create_cmd_1_v6 = |
| { |
| SAGD_4_IN, |
| 0x0, |
| { 0x42070000, /* spi */ |
| IPPROTOCOL_ESP, |
| PROTO_FAMILY_IPV6, |
| 0x0, /* replay_window */ |
| 0x0, /* pad */ |
| {0x00000120,0,0,0x01000000}, |
| {0,0,0,0}, |
| 1500, /*mtu*/ |
| 1500 |
| } |
| }; |
| |
| |
| CommandIPSecSetKey setkey_cmd_1 = |
| { |
| SAGD_4_IN, |
| 0x0, |
| 2 , /* num keys */ |
| 0x0, |
| { |
| { |
| 160, |
| SADB_AALG_SHA1HMAC, |
| 0, |
| {0xb9,0xd6,0xeb,0x8d,0xf8,0xad,0xe9,0xc0,0xff,0x2f,0xe8,0xba,0x40,0xb0,0x2c,0xa1,0x61,0x25,0x0d,0x23} |
| }, |
| { |
| 192, |
| SADB_EALG_3DESCBC, |
| 1, |
| { 0xf6,0xdd,0xb5,0x55,0xac,0xfd,0x9d,0x77,0xb0,0x3e,0xa3,0x84,0x3f,0x26,0x53,0x25,0x5a,0xfe,0x8e,0xb5,0x57,0x39,0x65,0xd2} |
| } |
| } |
| }; |
| |
| u8 wan_if[12] = "eth0"; |
| u8 lan_if[12] = "eth2"; |
| |
| //#ifdef CONFIG_IPV4_TUNNEL |
| #if 1 |
| void ipsec_standalone_init(void) |
| { |
| int rc; |
| union { |
| CommandIPSecSetLifetime setlft_cmd; |
| CommandIPSecSetTunnel settunnel_cmd; |
| CommandIPSecSetState setstate_cmd; |
| } ipscmd; |
| RtCommand rt_cmd; |
| |
| //int i; |
| |
| U16 CtExCmd[32] = {ACTION_REGISTER, //register new Conntrack entry |
| 0x0001, // Conntrack is secure |
| 0xA8C0, //src IP address of querier (192.168.1.111) |
| 0x6F01, //src IP address of querier |
| 0xA8C0, //dst IP address of querier (192.168.2.222) |
| 0xDE02, //dst IP address of querier |
| 0x1122, //src port number of querier () |
| 0x3344, //dst port number of querier () |
| 0xA8C0, //src IP address of replier (192.168.32.222) |
| 0xDE02, //src IP address of replier |
| 0xA8C0, //dst IP address of replier (192.168.31.111) |
| 0x6F01, //dst IP address of replier |
| 0x3344, //src port number of replier () |
| 0x1122, //dst port number of replier () |
| 0x0011, //protocol number (UDP=17) |
| 0x0000, // pad |
| 0x0000, // fwmark |
| 0x0000, // fwmark |
| 0x0011, // routeid |
| 0x0000, // routeid |
| 0x0012, // reply routeid |
| 0x0000, // reply routeid |
| 1, // Sa_nr |
| SAGD_4_IN, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| 1, //sa_reply_nr |
| SAGD_4_OUT, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| }; |
| #ifdef CONTROL_IPSEC_DEBUG |
| printk(KERN_INFO "%s called..\n", __func__); |
| #endif |
| |
| /* First SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd, sizeof(create_cmd)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd, sizeof(setkey_cmd)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_OUT; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV4; |
| ipscmd.settunnel_cmd.h.ipv4h.Version_IHL = 0x45; |
| ipscmd.settunnel_cmd.h.ipv4h.TTL = 0x20; |
| ipscmd.settunnel_cmd.h.ipv4h.SourceAddress = htonl(0xc0a81e34); |
| ipscmd.settunnel_cmd.h.ipv4h.DestinationAddress = htonl(0xc0a81e2a); |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_OUT; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_OUT; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| /* Second SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd_1, sizeof(create_cmd_1)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd_1, sizeof(setkey_cmd_1)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_IN; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV4; |
| ipscmd.settunnel_cmd.h.ipv4h.Version_IHL = 0x45; |
| ipscmd.settunnel_cmd.h.ipv4h.TTL = 0x20; |
| ipscmd.settunnel_cmd.h.ipv4h.SourceAddress = htonl(0xc0a81e2a); |
| ipscmd.settunnel_cmd.h.ipv4h.DestinationAddress = htonl(0xc0a81e34); |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_IN; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_IN; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0xAA; |
| rt_cmd.macAddr[2] = 0xBB; |
| rt_cmd.macAddr[3] = 0xCC; |
| rt_cmd.macAddr[4] = 0xDD; |
| rt_cmd.macAddr[5] = 0xEE; |
| memcpy(rt_cmd.outputDevice , wan_if, 12); |
| rt_cmd.id = 0x11; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[3] = 0xc0a802de; |
| rt_cmd.daddr[0] =0; |
| rt_cmd.daddr[1] = 0; |
| rt_cmd.daddr[2] = 0; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding orig route entry %d\n", rc); |
| return; |
| } |
| |
| printk(KERN_INFO "Originator Route entry added successfully :%d\n",rc); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0x02; |
| rt_cmd.macAddr[2] = 0x03; |
| rt_cmd.macAddr[3] = 0x04; |
| rt_cmd.macAddr[4] = 0x05; |
| rt_cmd.macAddr[5] = 0x06; |
| memcpy(rt_cmd.outputDevice , lan_if, 12); |
| rt_cmd.id = 0x12; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[0] = 0xc0a8016f; |
| rt_cmd.daddr[1] =0; |
| rt_cmd.daddr[2] = 0; |
| rt_cmd.daddr[3] = 0; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding replier route entry %d\n", rc); |
| return; |
| } |
| printk(KERN_INFO "Replier Route entry added successfully :%d\n",rc); |
| |
| rc = IPv4_HandleIP_CONNTRACK(CtExCmd, 32*2); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding conntrack entry %d\n", rc); |
| return; |
| } |
| #if 0 |
| for(i=0;i<4;i++) { |
| IPv4_HandleIP_CONNTRACK(CtExCmd, 28*2); |
| CtExCmd[6] = htons(ntohs(CtExCmd[6]) + 1); |
| CtExCmd[13] = htons(ntohs(CtExCmd[13]) + 1); |
| } |
| #endif |
| |
| } |
| #else |
| |
| |
| void ipsec_standalone_init(void) |
| { |
| int rc; |
| union { |
| CommandIPSecSetLifetime setlft_cmd; |
| CommandIPSecSetTunnel settunnel_cmd; |
| CommandIPSecSetState setstate_cmd; |
| } ipscmd; |
| RtCommand rt_cmd; |
| |
| //int i; |
| |
| U16 CtExCmd[32] = {ACTION_REGISTER, //register new Conntrack entry |
| 0x0001, // Conntrack is secure |
| 0xA8C0, //src IP address of querier (192.168.1.111) |
| 0x6F01, //src IP address of querier |
| 0xA8C0, //dst IP address of querier (192.168.2.222) |
| 0xDE02, //dst IP address of querier |
| 0x1122, //src port number of querier () |
| 0x3344, //dst port number of querier () |
| 0xA8C0, //src IP address of replier (192.168.32.222) |
| 0xDE02, //src IP address of replier |
| 0xA8C0, //dst IP address of replier (192.168.31.111) |
| 0x6F01, //dst IP address of replier |
| 0x3344, //src port number of replier () |
| 0x1122, //dst port number of replier () |
| 0x0011, //protocol number (UDP=17) |
| 0x0000, // pad |
| 0x0000, // fwmark |
| 0x0000, // fwmark |
| 0x0011, // routeid |
| 0x0000, // routeid |
| 0x0012, // reply routeid |
| 0x0000, // reply routeid |
| 1, // Sa_nr |
| SAGD_4_IN, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| 1, //sa_reply_nr |
| SAGD_4_OUT, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| }; |
| #ifdef CONTROL_IPSEC_DEBUG |
| printk(KERN_INFO "%s called..\n", __func__); |
| #endif |
| |
| /* First SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd_v6, sizeof(create_cmd)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd, sizeof(setkey_cmd)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_OUT; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV6; |
| ipscmd.settunnel_cmd.h.ipv6h.Version_TC_FLHi = htons(0x6000); |
| ipscmd.settunnel_cmd.h.ipv6h.FlowLabelLo = 0; |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[1] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[2] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[3] = htonl(0x1); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[1] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[2] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[3] = htonl(0x2); |
| |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_OUT; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_OUT; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| /* Second SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd_1_v6, sizeof(create_cmd_1)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd_1, sizeof(setkey_cmd_1)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_IN; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV6; |
| ipscmd.settunnel_cmd.h.ipv6h.Version_TC_FLHi = htons(0x6000); |
| ipscmd.settunnel_cmd.h.ipv6h.FlowLabelLo = 0; |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[1] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[2] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[3] = htonl(0x2); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[1] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[2] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[3] = htonl(0x1); |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_IN; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_IN; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0x1A; |
| rt_cmd.macAddr[2] = 0xBB; |
| rt_cmd.macAddr[3] = 0x1F; |
| rt_cmd.macAddr[4] = 0xEE; |
| rt_cmd.macAddr[5] = 0xCD; |
| memcpy(rt_cmd.outputDevice , wan_if, 12); |
| rt_cmd.id = 0x11; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[3] = 0xc0a802de; |
| rt_cmd.daddr[0] =0; |
| rt_cmd.daddr[1] = 0; |
| rt_cmd.daddr[2] = 0; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding orig route entry %d\n", rc); |
| return; |
| } |
| |
| printk(KERN_INFO "Originator Route entry added successfully :%d\n",rc); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0x02; |
| rt_cmd.macAddr[2] = 0x03; |
| rt_cmd.macAddr[3] = 0x04; |
| rt_cmd.macAddr[4] = 0x05; |
| rt_cmd.macAddr[5] = 0x06; |
| memcpy(rt_cmd.outputDevice , lan_if, 12); |
| rt_cmd.id = 0x12; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[0] = 0xc0a8016f; |
| rt_cmd.daddr[1] =0; |
| rt_cmd.daddr[2] = 0; |
| rt_cmd.daddr[3] = 0; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding replier route entry %d\n", rc); |
| return; |
| } |
| printk(KERN_INFO "Replier Route entry added successfully :%d\n",rc); |
| |
| rc = IPv4_HandleIP_CONNTRACK(CtExCmd, 32*2); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding conntrack entry %d\n", rc); |
| return; |
| } |
| #if 0 |
| for(i=0;i<4;i++) { |
| IPv4_HandleIP_CONNTRACK(CtExCmd, 28*2); |
| CtExCmd[6] = htons(ntohs(CtExCmd[6]) + 1); |
| CtExCmd[13] = htons(ntohs(CtExCmd[13]) + 1); |
| } |
| #endif |
| |
| } |
| #endif |
| |
| #if 0 |
| void ipsec_standalone_init(void) |
| { |
| int rc; |
| union { |
| CommandIPSecSetLifetime setlft_cmd; |
| CommandIPSecSetTunnel settunnel_cmd; |
| CommandIPSecSetState setstate_cmd; |
| } ipscmd; |
| RtCommand rt_cmd; |
| |
| //int i; |
| |
| U16 CtExCmd[56] = {ACTION_REGISTER, //register new Conntrack entry |
| 0x0001, // Conntrack is secure |
| 0xA8C0, //src IP address of querier (192.168.1.111) |
| 0x6F01, //src IP address of querier |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0xA8C0, //dst IP address of querier (192.168.2.222) |
| 0xDE02, //dst IP address of querier |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x1122, //src port number of querier () |
| 0x3344, //dst port number of querier () |
| 0xA8C0, //src IP address of replier (192.168.32.222) |
| 0xDE02, //src IP address of replier |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0xA8C0, //dst IP address of replier (192.168.31.111) |
| 0x6F01, //dst IP address of replier |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x0, |
| 0x3344, //src port number of replier () |
| 0x1122, //dst port number of replier () |
| 0x0011, //protocol number (UDP=17) |
| 0x0000, // pad |
| 0x0000, // fwmark |
| 0x0000, // fwmark |
| 0x0011, // routeid |
| 0x0000, // routeid |
| 0x0012, // reply routeid |
| 0x0000, // reply routeid |
| 1, // Sa_nr |
| SAGD_4_IN, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| 1, //sa_reply_nr |
| SAGD_4_OUT, // sa_handle |
| 0x0,0x0,0x0, //sa_handle |
| }; |
| #ifdef CONTROL_IPSEC_DEBUG |
| printk(KERN_INFO "%s called..\n", __func__); |
| #endif |
| |
| /* First SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd_v6, sizeof(create_cmd)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd, sizeof(setkey_cmd)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_OUT; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV6; |
| ipscmd.settunnel_cmd.h.ipv6h.Version_TC_FLHi = htons(0x6000); |
| ipscmd.settunnel_cmd.h.ipv6h.FlowLabelLo = 0; |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[1] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[2] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[3] = htonl(0x1); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[1] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[2] = htonl(0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[3] = htonl(0x2); |
| |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_OUT; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_OUT; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| /* Second SA */ |
| IPsec_handle_CREATE_SA((U16*) &create_cmd_1_v6, sizeof(create_cmd_1)); |
| IPsec_handle_SA_SET_KEYS((U16*) &setkey_cmd_1, sizeof(setkey_cmd_1)); |
| memset(&ipscmd.settunnel_cmd,0,sizeof(ipscmd.settunnel_cmd)); |
| ipscmd.settunnel_cmd.sagd=SAGD_4_IN; |
| ipscmd.settunnel_cmd.proto_family=PROTO_FAMILY_IPV6; |
| ipscmd.settunnel_cmd.h.ipv6h.Version_TC_FLHi = htons(0x6000); |
| ipscmd.settunnel_cmd.h.ipv6h.FlowLabelLo = 0; |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[1] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[2] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.SourceAddress[3] = htonl(0x2); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[0] = htonl(0x20010000); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[1] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[2] = htonl(0x0); |
| ipscmd.settunnel_cmd.h.ipv6h.DestinationAddress[3] = htonl(0x1); |
| IPsec_handle_SA_SET_TUNNEL((U16*) &ipscmd.settunnel_cmd, sizeof(ipscmd.settunnel_cmd)); |
| memset(&ipscmd.setlft_cmd,0,sizeof(ipscmd.setlft_cmd)); |
| ipscmd.setlft_cmd.sagd = SAGD_4_IN; |
| IPsec_handle_SA_SET_LIFETIME((U16*) &ipscmd.setlft_cmd, sizeof(ipscmd.setlft_cmd)); |
| memset(&ipscmd.setstate_cmd,0,sizeof(ipscmd.setstate_cmd)); |
| ipscmd.setstate_cmd.sagd = SAGD_4_IN; |
| ipscmd.setstate_cmd.state = XFRM_STATE_VALID; |
| IPsec_handle_SA_SET_STATE((U16*) &ipscmd.setstate_cmd, sizeof(ipscmd.setstate_cmd)); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0x1A; |
| rt_cmd.macAddr[2] = 0xBB; |
| rt_cmd.macAddr[3] = 0x1F; |
| rt_cmd.macAddr[4] = 0xEE; |
| rt_cmd.macAddr[5] = 0xCD; |
| memcpy(rt_cmd.outputDevice , wan_if, 12); |
| rt_cmd.id = 0x11; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[3] = 0x33330000; |
| rt_cmd.daddr[0] =0; |
| rt_cmd.daddr[1] = 0; |
| rt_cmd.daddr[2] = 2; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding orig route entry %d\n", rc); |
| return; |
| } |
| |
| printk(KERN_INFO "Originator Route entry added successfully :%d\n",rc); |
| |
| rt_cmd.action = ACTION_REGISTER; |
| rt_cmd.mtu = 1500; |
| rt_cmd.macAddr[0] = 0x00; |
| rt_cmd.macAddr[1] = 0x02; |
| rt_cmd.macAddr[2] = 0x03; |
| rt_cmd.macAddr[3] = 0x04; |
| rt_cmd.macAddr[4] = 0x05; |
| rt_cmd.macAddr[5] = 0x06; |
| memcpy(rt_cmd.outputDevice , lan_if, 12); |
| rt_cmd.id = 0x12; |
| rt_cmd.flags = 0; |
| rt_cmd.daddr[0] = 0x11110000; |
| rt_cmd.daddr[1] = 0; |
| rt_cmd.daddr[2] = 0; |
| rt_cmd.daddr[3] = 2; |
| |
| rc = IP_HandleIP_ROUTE_RESOLVE((U16*)&rt_cmd, sizeof(rt_cmd)); |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding replier route entry %d\n", rc); |
| return; |
| } |
| printk(KERN_INFO "Replier Route entry added successfully :%d\n",rc); |
| |
| rc = IPv6_handle_CONNTRACK(CtExCmd, 56*2); |
| |
| if (rc != NO_ERR) |
| { |
| printk (KERN_ERR "Error in adding conntrack entry %d\n", rc); |
| return; |
| } |
| #if 0 |
| for(i=0;i<4;i++) { |
| IPv4_HandleIP_CONNTRACK(CtExCmd, 28*2); |
| CtExCmd[6] = htons(ntohs(CtExCmd[6]) + 1); |
| CtExCmd[13] = htons(ntohs(CtExCmd[13]) + 1); |
| } |
| #endif |
| |
| } |
| #endif |
| |
| |