--- zzzz-none-000/linux-3.18.24/net/netfilter/nf_conntrack_standalone.c 2015-10-31 20:39:51.000000000 +0000 +++ rtl96-5690pro-762/linux-3.18.24/net/netfilter/nf_conntrack_standalone.c 2024-08-14 08:36:37.000000000 +0000 @@ -362,7 +362,444 @@ .llseek = seq_lseek, .release = seq_release_net, }; +#if defined(CONFIG_YUEME) && defined(CONFIG_APOLLO_ROMEDRIVER) +#include "rtk_rg_struct.h" +#include "rtk_rg_define.h" +extern const rtk_rg_globalDatabase_t rg_db; +#define IDLE_TIMEOUT 300 +static int proc_rg_nf_conntrack_fops_read(struct seq_file *s, void *v) +{ +#if defined(CONFIG_RG_FLOW_BASED_PLATFORM) + int i; + rtk_rg_table_flowEntry_t *pFlowEntry; + + //IPv4 + for(i=0; ipath1.valid==0) + continue; + if(rg_db.flow[i].idleSecs > IDLE_TIMEOUT) + continue; + pFlowEntry = rg_db.flow[i].pFlowEntry; + switch(pFlowEntry->path1.in_path) + { + case FB_PATH_34: + if(pFlowEntry->path3.in_multiple_act==0 && pFlowEntry->path3.in_ipv4_or_ipv6==0) + { + seq_printf(s, "%-8s %u %-8s %u %ld sip=%d.%d.%d.%d dip=%d.%d.%d.%d sport=%d dport=%d\n" + , "ipv4" + , 2 + , (pFlowEntry->path3.in_l4proto==1) ? "tcp" : "udp" + , (pFlowEntry->path3.in_l4proto==1) ? 6 : 17 + , rg_db.flow[i].idleSecs + , (pFlowEntry->path3.in_src_ipv4_addr>>24)&0xff, (pFlowEntry->path3.in_src_ipv4_addr>>16)&0xff, (pFlowEntry->path3.in_src_ipv4_addr>>8)&0xff, (pFlowEntry->path3.in_src_ipv4_addr)&0xff + , (pFlowEntry->path3.in_dst_ipv4_addr>>24)&0xff, (pFlowEntry->path3.in_dst_ipv4_addr>>16)&0xff, (pFlowEntry->path3.in_dst_ipv4_addr>>8)&0xff, (pFlowEntry->path3.in_dst_ipv4_addr)&0xff + , pFlowEntry->path3.in_l4_src_port + , pFlowEntry->path3.in_l4_dst_port); + } + break; + case FB_PATH_5: + if(pFlowEntry->path5.in_ipv4_or_ipv6==0) + { + unsigned int dst_ipv4_addr = (pFlowEntry->path5.out_l4_act && !pFlowEntry->path5.out_l4_direction) ? rg_db.netif[pFlowEntry->path5.in_intf_idx].rtk_netif.ipAddr : pFlowEntry->path5.in_src_ipv4_addr ; + seq_printf(s, "%-8s %u %-8s %u %ld sip=%d.%d.%d.%d dip=%d.%d.%d.%d sport=%d dport=%d\n" + , "ipv4" + , (pFlowEntry->path5.out_l4_act==0) ? 3 : 4 + , (pFlowEntry->path5.in_l4proto==1) ? "tcp" : "udp" + , (pFlowEntry->path5.in_l4proto==1) ? 6 : 17 + , rg_db.flow[i].idleSecs + , (pFlowEntry->path5.in_src_ipv4_addr>>24)&0xff, (pFlowEntry->path5.in_src_ipv4_addr>>16)&0xff, (pFlowEntry->path5.in_src_ipv4_addr>>8)&0xff, (pFlowEntry->path5.in_src_ipv4_addr)&0xff + , (dst_ipv4_addr>>24)&0xff, (dst_ipv4_addr>>16)&0xff, (dst_ipv4_addr>>8)&0xff, (dst_ipv4_addr)&0xff + , pFlowEntry->path5.in_l4_src_port + , pFlowEntry->path5.in_l4_dst_port); + } + break; + default: + break; + } + } + //IPv6 + for(i=0; ipath1.valid==0) + continue; + if(rg_db.flow[i].idleSecs > IDLE_TIMEOUT) + continue; + pFlowEntry = rg_db.flow[i].pFlowEntry; + switch(pFlowEntry->path1.in_path) + { + case FB_PATH_34: + if(pFlowEntry->path3.in_multiple_act==0 && pFlowEntry->path3.in_ipv4_or_ipv6==1) + { + seq_printf(s, "%-8s %u %-8s %u %ld sipHash=0x%x dipHash=0x%x sport=%d dport=%d\n" + , "ipv6" + , 2 + , (pFlowEntry->path3.in_l4proto==1) ? "tcp" : "udp" + , (pFlowEntry->path3.in_l4proto==1) ? 6 : 17 + , rg_db.flow[i].idleSecs + , pFlowEntry->path3.in_src_ipv6_addr_hash + , pFlowEntry->path3.in_dst_ipv6_addr_hash + , pFlowEntry->path3.in_l4_src_port + , pFlowEntry->path3.in_l4_dst_port); + } + break; + case FB_PATH_5: + if(pFlowEntry->path5.in_ipv4_or_ipv6==1) + { + seq_printf(s, "%-8s %u %-8s %u %ld sipHash=0x%x dipHash=0x%x sport=%d dport=%d\n" + , "ipv6" + , (pFlowEntry->path5.out_l4_act==0) ? 3 : 4 + , (pFlowEntry->path5.in_l4proto==1) ? "tcp" : "udp" + , (pFlowEntry->path5.in_l4proto==1) ? 6 : 17 + , rg_db.flow[i].idleSecs + , pFlowEntry->path5.in_src_ipv6_addr_hash + , pFlowEntry->path5.in_dst_ipv6_addr_hash + , pFlowEntry->path5.in_l4_src_port + , pFlowEntry->path5.in_l4_dst_port); + } + break; + default: + break; + } + } + +#else //1 not CONFIG_RG_FLOW_BASED_PLATFORM + +#if defined(CONFIG_ROME_NAPT_SHORTCUT) || defined(CONFIG_RG_IPV6_SOFTWARE_SHORTCUT_SUPPORT) + int i; +#endif +#if defined(CONFIG_ROME_NAPT_SHORTCUT) + rtk_rg_napt_shortcut_t *pNaptSc; +#endif +#ifdef CONFIG_RG_IPV6_SOFTWARE_SHORTCUT_SUPPORT + rtk_ipv6_addr_t zeroIP={{0}}; + rtk_rg_naptv6_shortcut_t *pV6NaptSc; +#endif +#ifdef CONFIG_ROME_NAPT_SHORTCUT +{ + for(i=0;isip!=0 && pNaptSc->idleSecs <= IDLE_TIMEOUT) + { + seq_printf(s,"%-8s %u %-8s %u %ld sip=%d.%d.%d.%d dip=%d.%d.%d.%d sport=%d dport=%d\n" + ,"ipv4" + ,(pNaptSc->isBridge==1)?2:((pNaptSc->isNapt==1?4:3)) + ,(pNaptSc->isTcp)?"tcp":"udp" + ,(pNaptSc->isTcp)?6:17 + ,pNaptSc->idleSecs + ,(pNaptSc->sip>>24)&0xff,(pNaptSc->sip>>16)&0xff,(pNaptSc->sip>>8)&0xff,(pNaptSc->sip)&0xff + ,(pNaptSc->dip>>24)&0xff,(pNaptSc->dip>>16)&0xff,(pNaptSc->dip>>8)&0xff,(pNaptSc->dip)&0xff + ,pNaptSc->sport + ,pNaptSc->dport + ); + } + } +} +#endif +#ifdef CONFIG_RG_IPV6_SOFTWARE_SHORTCUT_SUPPORT +{ + for(i=0;isip.ipv6_addr, zeroIP.ipv6_addr, IPV6_ADDR_LEN) && pV6NaptSc->idleSecs <= IDLE_TIMEOUT) + { + seq_printf(s, "%-8s %u %-8s %u %ld sip=%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x dip=%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x sport=%d dport=%d\n" + ,"ipv6" + ,(pNaptSc->isBridge==1)?2:((pNaptSc->isNapt==1?4:3)) + ,(pNaptSc->isTcp)?"tcp":"udp" + ,(pNaptSc->isTcp)?6:17 + ,pNaptSc->idleSecs + ,pV6NaptSc->sip.ipv6_addr[0],pV6NaptSc->sip.ipv6_addr[1],pV6NaptSc->sip.ipv6_addr[2],pV6NaptSc->sip.ipv6_addr[3] + ,pV6NaptSc->sip.ipv6_addr[4],pV6NaptSc->sip.ipv6_addr[5],pV6NaptSc->sip.ipv6_addr[6],pV6NaptSc->sip.ipv6_addr[7] + ,pV6NaptSc->sip.ipv6_addr[8],pV6NaptSc->sip.ipv6_addr[9],pV6NaptSc->sip.ipv6_addr[10],pV6NaptSc->sip.ipv6_addr[11] + ,pV6NaptSc->sip.ipv6_addr[12],pV6NaptSc->sip.ipv6_addr[13],pV6NaptSc->sip.ipv6_addr[14],pV6NaptSc->sip.ipv6_addr[15] + ,pV6NaptSc->dip.ipv6_addr[0],pV6NaptSc->dip.ipv6_addr[1],pV6NaptSc->dip.ipv6_addr[2],pV6NaptSc->dip.ipv6_addr[3] + ,pV6NaptSc->dip.ipv6_addr[4],pV6NaptSc->dip.ipv6_addr[5],pV6NaptSc->dip.ipv6_addr[6],pV6NaptSc->dip.ipv6_addr[7] + ,pV6NaptSc->dip.ipv6_addr[8],pV6NaptSc->dip.ipv6_addr[9],pV6NaptSc->dip.ipv6_addr[10],pV6NaptSc->dip.ipv6_addr[11] + ,pV6NaptSc->dip.ipv6_addr[12],pV6NaptSc->dip.ipv6_addr[13],pV6NaptSc->dip.ipv6_addr[14],pV6NaptSc->dip.ipv6_addr[15] + ,pV6NaptSc->sport + ,pV6NaptSc->dport + ); + } + } +} +#endif + +#endif //end CONFIG_RG_FLOW_BASED_PLATFORM + return 0; +} + +static int proc_rg_sw_shortcutCnt_fops_read(struct seq_file *s, void *v) +{ + unsigned int v4counter=0; + unsigned int v6counter=0; +#if defined(CONFIG_RG_FLOW_BASED_PLATFORM) + int i; + rtk_rg_table_flowEntry_t *pFlowEntry; + + for(i=0; ipath1.valid==0) + continue; + if(rg_db.flow[i].idleSecs > IDLE_TIMEOUT) + continue; + pFlowEntry = rg_db.flow[i].pFlowEntry; + switch(pFlowEntry->path1.in_path) + { + case FB_PATH_34: + if(pFlowEntry->path3.in_multiple_act==0) + { + if(pFlowEntry->path3.in_ipv4_or_ipv6==0) + v4counter++; + else + v6counter++; + } + break; + case FB_PATH_5: + { + if(pFlowEntry->path5.in_ipv4_or_ipv6==0) + v4counter++; + else + v6counter++; + } + break; + default: + break; + } + } + +#else //1 not CONFIG_RG_FLOW_BASED_PLATFORM + +#ifdef CONFIG_RG_IPV6_SOFTWARE_SHORTCUT_SUPPORT + rtk_ipv6_addr_t zeroIP={{0}}; +#endif +#if defined(CONFIG_ROME_NAPT_SHORTCUT) || defined(CONFIG_RG_IPV6_SOFTWARE_SHORTCUT_SUPPORT) + int i; +#endif +#ifdef CONFIG_ROME_NAPT_SHORTCUT +{ + //PROC_PRINTF("-------------------IPv4 SW shortcut-------------------\n"); + for(i=0;ii_private); +} + +static int proc_rg_nf_conntrack_fops_release(struct inode *inode, struct file *file) +{ + if(rg_db.systemGlobal.hwnat_enable == RG_HWNAT_PROTOCOL_STACK) + return seq_release_net(inode, file); + else + return single_release(inode, file); +} + +static int proc_rg_sw_shortcutCnt_fops_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_rg_sw_shortcutCnt_fops_read, inode->i_private); +} + +static const struct file_operations rg_ct_file_ops = { + .owner = THIS_MODULE, + .open = proc_rg_nf_conntrack_fops_open, + .write = NULL, + .read = seq_read, + .llseek = seq_lseek, + .release = proc_rg_nf_conntrack_fops_release, +}; + +static const struct file_operations rg_cnt_ct_file_ops = { + .owner = THIS_MODULE, + .open = proc_rg_sw_shortcutCnt_fops_open, + .write = NULL, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int nf_conntrack_standalone_init_proc(struct net *net) +{ + struct proc_dir_entry *pde; + + pde = proc_create("sw_shortcutCnt", 0440, net->proc_net, &rg_cnt_ct_file_ops); + if (!pde) + goto out_nf_conntrack; + + pde = proc_create("nf_conntrack", 0440, net->proc_net, &rg_ct_file_ops); + if (!pde) + goto out_nf_conntrack1; + + pde = proc_create("nf_conntrack_org", 0440, net->proc_net, &ct_file_ops); + if (!pde) + goto out_nf_conntrack2; + + pde = proc_create("nf_conntrack", S_IRUGO, net->proc_net_stat, + &ct_cpu_seq_fops); + if (!pde) + goto out_stat_nf_conntrack; + return 0; + +out_stat_nf_conntrack: + remove_proc_entry("nf_conntrack_org", net->proc_net); +out_nf_conntrack2: + remove_proc_entry("nf_conntrack", net->proc_net); +out_nf_conntrack1: + remove_proc_entry("sw_shortcutCnt", net->proc_net); +out_nf_conntrack: + return -ENOMEM; +} + +static void nf_conntrack_standalone_fini_proc(struct net *net) +{ + remove_proc_entry("nf_conntrack", net->proc_net_stat); + remove_proc_entry("nf_conntrack_org", net->proc_net); + remove_proc_entry("nf_conntrack", net->proc_net); + remove_proc_entry("sw_shortcutCnt", net->proc_net); +} +#elif defined(CONFIG_TRUE)&& defined(CONFIG_APOLLO_ROMEDRIVER) +#include "rtk_rg_struct.h" +#include "rtk_rg_define.h" +extern const rtk_rg_globalDatabase_t rg_db; + +static int proc_rg_sw_simpleFlow_fops_read(struct seq_file *s, void *v) +{ + int idx =0; + rtk_rg_asic_path1_entry_t *pP1Data = NULL; + int valid_num=0; + + for(idx=0; idxpath1; + if(pP1Data->in_path == FB_PATH_34 && pP1Data->in_multiple_act == 0) + { + rtk_rg_asic_path3_entry_t *p3Data = (rtk_rg_asic_path3_entry_t *)pP1Data; + if(p3Data->out_portmask == 0x20) + { + seq_printf(s,"P3\n"); + if(!p3Data->in_ipv4_or_ipv6) + { + seq_printf(s,"sip: %d.%d.%d.%d dip: %d.%d.%d.%d \n",\ + (p3Data->in_src_ipv4_addr>>24)&0xff, (p3Data->in_src_ipv4_addr>>16)&0xff, (p3Data->in_src_ipv4_addr>>8)&0xff, p3Data->in_src_ipv4_addr&0xff, + (p3Data->in_dst_ipv4_addr>>24)&0xff, (p3Data->in_dst_ipv4_addr>>16)&0xff, (p3Data->in_dst_ipv4_addr>>8)&0xff, p3Data->in_dst_ipv4_addr&0xff); + } + else + { + seq_printf(s,"sip 0x%x dip 0x%x\n", p3Data->in_src_ipv6_addr_hash,p3Data->in_dst_ipv6_addr_hash); + } + seq_printf(s,"srcport: %d dstport: %d\n", p3Data->in_l4_src_port, p3Data->in_l4_dst_port); + seq_printf(s,"dmacidx: %d\n", p3Data->out_dmac_idx); + seq_printf(s,"l4proto: %d\n", p3Data->in_l4proto); + valid_num++; + } + } + else if(pP1Data->in_path == FB_PATH_5) + { + rtk_rg_asic_path5_entry_t *p5Data = (rtk_rg_asic_path5_entry_t *)pP1Data; + if(p5Data->out_l4_direction == 1) + { + seq_printf(s,"P5\n"); + if(!p5Data->in_ipv4_or_ipv6) + { + seq_printf(s,"sip: %d.%d.%d.%d dip: %d.%d.%d.%d \n",\ + (p5Data->in_src_ipv4_addr>>24)&0xff, (p5Data->in_src_ipv4_addr>>16)&0xff, (p5Data->in_src_ipv4_addr>>8)&0xff, p5Data->in_src_ipv4_addr&0xff, + (p5Data->in_dst_ipv4_addr>>24)&0xff, (p5Data->in_dst_ipv4_addr>>16)&0xff, (p5Data->in_dst_ipv4_addr>>8)&0xff, p5Data->in_dst_ipv4_addr&0xff); + } + else + { + seq_printf(s,"sip 0x%x dip 0x%x\n", p5Data->in_src_ipv6_addr_hash,p5Data->in_dst_ipv6_addr_hash); + } + seq_printf(s,"srcport: %d dstport: %d\n", p5Data->in_l4_src_port,p5Data->in_l4_dst_port); + seq_printf(s,"dmacidx: %d\n", p5Data->out_dmac_idx); + seq_printf(s,"l4proto: %d\n", p5Data->in_l4proto); + valid_num++; + } + } + } + } + seq_printf(s,"flow num:%d\n", valid_num); + return 0; +} + + +static int proc_rg_sw_simpleFlow_fops_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_rg_sw_simpleFlow_fops_read, inode->i_private); +} + +static const struct file_operations rg_flow_ct_file_ops = { + .owner = THIS_MODULE, + .open = proc_rg_sw_simpleFlow_fops_open, + .write = NULL, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int nf_conntrack_standalone_init_proc(struct net *net) +{ + struct proc_dir_entry *pde; + + pde = proc_create("sw_simpleFlow", 0440, net->proc_net, &rg_flow_ct_file_ops); + if (!pde) + goto out_nf_conntrack; + + pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops); + if (!pde) + goto out_nf_conntrack1; + + pde = proc_create("nf_conntrack", S_IRUGO, net->proc_net_stat, + &ct_cpu_seq_fops); + if (!pde) + goto out_stat_nf_conntrack; + return 0; + +out_stat_nf_conntrack: + remove_proc_entry("nf_conntrack", net->proc_net); +out_nf_conntrack1: + remove_proc_entry("sw_simpleFlow", net->proc_net); +out_nf_conntrack: + return -ENOMEM; +} + +static void nf_conntrack_standalone_fini_proc(struct net *net) +{ + remove_proc_entry("nf_conntrack", net->proc_net_stat); + remove_proc_entry("nf_conntrack", net->proc_net); + remove_proc_entry("sw_simpleFlow", net->proc_net); +} +#else static int nf_conntrack_standalone_init_proc(struct net *net) { struct proc_dir_entry *pde; @@ -388,6 +825,7 @@ remove_proc_entry("nf_conntrack", net->proc_net_stat); remove_proc_entry("nf_conntrack", net->proc_net); } +#endif #else static int nf_conntrack_standalone_init_proc(struct net *net) {