Revert "[Feature][T106_eSDK]update from T106-V2.01.01.02P56U06.AP.15.11_CAP.15.11.01 to T106-V2.01.01.02P56U06.AP.16.08_CAP.16.08.01 -- code"
This reverts commit 39d99118f249054d01992819702e0612dfdfe3b9.
Reason for revert:revert 16.08_patch
Change-Id: Ib9848be6d113db9be3378524981a30d0c3a0c1a5
diff --git a/upstream/linux-5.10/net/8021q/vlan_dev.c b/upstream/linux-5.10/net/8021q/vlan_dev.c
index 6117e9c..86a1c99 100755
--- a/upstream/linux-5.10/net/8021q/vlan_dev.c
+++ b/upstream/linux-5.10/net/8021q/vlan_dev.c
@@ -94,7 +94,7 @@
return NETDEV_TX_OK;
#endif
}
-extern void fast_update_indev(struct sk_buff *skb, struct net_device *dev);
+
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
struct net_device *dev)
{
@@ -120,7 +120,7 @@
len = skb->len;
if (unlikely(netpoll_tx_running(dev)))
return vlan_netpoll_send_skb(vlan, skb);
- fast_update_indev(skb, dev);
+
ret = dev_queue_xmit(skb);
if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
diff --git a/upstream/linux-5.10/net/bridge/br_fdb.c b/upstream/linux-5.10/net/bridge/br_fdb.c
index 974ee5e..65a6054 100755
--- a/upstream/linux-5.10/net/bridge/br_fdb.c
+++ b/upstream/linux-5.10/net/bridge/br_fdb.c
@@ -1313,7 +1313,7 @@
u16 vid = 0;
int ntl_port_id = 0xff;
- if(!skb->dev || fastbr_level != 1)
+ if(!skb->dev)
{
//print_sun(SUN_DBG, "fast_br skb->dev err skb->dev = %x\n", skb->dev);
return 0;
diff --git a/upstream/linux-5.10/net/core/SI/net_other.c b/upstream/linux-5.10/net/core/SI/net_other.c
index 816686b..a6748c7 100755
--- a/upstream/linux-5.10/net/core/SI/net_other.c
+++ b/upstream/linux-5.10/net/core/SI/net_other.c
@@ -1090,8 +1090,7 @@
int fast_local4_output_num = 0; //±¾µØfast_local4³É¹¦·¢Ëͱ¨ÎÄ
int fast_local6_output_num = 0; //±¾µØfast_local6³É¹¦·¢Ëͱ¨ÎÄ
int fast_tcpdump_num = 0; //fast×¥°üÊýÁ¿
-int skb_expand4 = 0; //Í·¿Õ¼ä²»¹»ÖØÐÂÉêÇëµÄV4Êý¾Ý°ü
-int skb_expand6 = 0; //Í·¿Õ¼ä²»¹»ÖØÐÂÉêÇëµÄV6Êý¾Ý°ü
+
int double_mac = 0; //mac¼ì²é¿ª¹Ø
//slabÄÚ´æÊ¹ÓÃÏà¹ØÍ³¼Æ£¬Î´¿¼ÂÇͨÓÃslabµØÖ·³Ø£¬Èçkmalloc
diff --git a/upstream/linux-5.10/net/core/fastproc/fast4_fw.c b/upstream/linux-5.10/net/core/fastproc/fast4_fw.c
index a0674f9..0ef32e4 100755
--- a/upstream/linux-5.10/net/core/fastproc/fast4_fw.c
+++ b/upstream/linux-5.10/net/core/fastproc/fast4_fw.c
@@ -67,7 +67,6 @@
/* ******************************** º¯ÊýʵÏÖ ********************************/
int dst_expire_count = 0;
extern int no_neighbour;
-extern fast_list_t working_list;
static inline int rt_is_expired(struct rtable *rth)
{
@@ -556,11 +555,7 @@
{
ret = ifname_compare_aligned(ct->indev[dir]->name, ipinfo->iniface, ipinfo->iniface_mask);
}
- else
- {
- ret=1;
- }
-
+
if(ipinfo->iniface[0] != '\0')
*match_filter = 1;
@@ -588,8 +583,6 @@
ip_packet_match_neg(const struct ipt_ip *ipinfo,struct nf_conn* ct,int dir, int* match_filter)
{
unsigned long ret;
- if(!(ct->status & IPS_NAT_MASK))
- return false;
if (NF_INVF(ipinfo, IPT_INV_SRCIP,
(ct->tuplehash[dir].tuple.dst.u3.ip & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
NF_INVF(ipinfo, IPT_INV_DSTIP,
@@ -602,11 +595,7 @@
{
ret = ifname_compare_aligned(ct->outdev[dir]->name, ipinfo->iniface, ipinfo->iniface_mask);
}
- else
- {
- ret = 1;
- }
-
+
if(ipinfo->iniface[0] != '\0')
*match_filter = 1;
@@ -686,7 +675,7 @@
e = get_entry(table_base, private->hook_entry[NF_INET_LOCAL_IN]);
break;
default:
- return;
+ break;
}
while(num--)
{
@@ -758,7 +747,8 @@
static void ct_iptables_bhfunc(unsigned long param)
{
- fast_entry_t *ret = NULL;
+ int hash = 0;
+ struct nf_conntrack_tuple_hash *h;
struct hlist_nulls_node *n;
struct nf_conn *ct;
struct xt_table_info *private;
@@ -766,12 +756,13 @@
unsigned int addend;
local_bh_disable();
addend = xt_write_recseq_begin();
- spin_lock_bh(&fast_fw_spinlock);
- for (ret = (&working_list)->next; ret; ret = ret->next)
- {
- if(ret)
+ for(hash = 0; hash < nf_conntrack_htable_size; hash++)
+ {
+ hlist_nulls_for_each_entry_rcu(h,n,&nf_conntrack_hash[hash],hnnode)
{
- ct = ret->ct;
+ if(h)
+ {
+ ct = nf_ct_tuplehash_to_ctrack(h);
if(ct->fast_ct.isFast)
{
net = nf_ct_net(ct);
@@ -786,66 +777,19 @@
}
else
continue;
-
+ spin_lock_bh(&fast_fw_spinlock);
ct->packet_info[IP_CT_DIR_ORIGINAL].bytes = 0;
ct->packet_info[IP_CT_DIR_ORIGINAL].packets = 0;
ct->packet_info[IP_CT_DIR_REPLY].bytes = 0;
ct->packet_info[IP_CT_DIR_REPLY].packets = 0;
- }
- }
- spin_unlock_bh(&fast_fw_spinlock);
+ spin_unlock_bh(&fast_fw_spinlock);
+ }
+ }
+ }
xt_write_recseq_end(addend);
local_bh_enable();
}
-#if 0
-/*ÐÂfastÏÂiptablesͬ²½µÄ´úÂ루±£Áô£©*/
-/* Started by AICoder, pid:bc328v3b69u30bb14fea08b4d0be594808c2486b */
-static void ct_iptables_bhfunc(unsigned long param)
-{
- unsigned int addend;
- local_bh_disable();
- addend = xt_write_recseq_begin();
- spin_lock_bh(&fast_fw_spinlock);
- for(int hash = 0; hash < nf_conntrack_htable_size; hash++)
- {
- struct nf_conntrack_tuple_hash *h;
- struct hlist_nulls_node *n;
- for_each_rcu_safe(h, n, &nf_conntrack_hash[hash])
- {
- if(h)
- {
- struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(h);
- if(ct->fast_ct.isFast)
- {
- struct net *net = nf_ct_net(ct);
- struct xt_table_info *private;
- const char *chain_names[] = {
- "IPTABLE_RAW",
- "IPTABLE_MANGLE",
- "IPTABLE_NAT",
- "IPTABLE_FILTER"
- };
- for (int i = 0; i < 4; i++) {
- switch (i) {
- case 0: private = READ_ONCE(net->ipv4.iptable_raw->private); break;
- case 1: private = READ_ONCE(net->ipv4.iptable_mangle->private); break;
- case 2: private = READ_ONCE(net->ipv4.nat_table->private); break;
- case 3: private = READ_ONCE(net->ipv4.iptable_filter->private); break;
- }
- ct_iptables_syn_handle(ct, private, chain_names[i]);
- }
- }
- }
- }
- }
- spin_unlock_bh(&fast_fw_spinlock);
- xt_write_recseq_end(addend);
- local_bh_enable();
-}
-/* Ended by AICoder, pid:bc328v3b69u30bb14fea08b4d0be594808c2486b */
-#endif
-
int fast4_fw_init(void)
{
diff --git a/upstream/linux-5.10/net/core/fastproc/fast6.c b/upstream/linux-5.10/net/core/fastproc/fast6.c
index 5beebba..d5fab9c 100755
--- a/upstream/linux-5.10/net/core/fastproc/fast6.c
+++ b/upstream/linux-5.10/net/core/fastproc/fast6.c
@@ -207,9 +207,7 @@
__u8 next_hdr = 0;
unsigned char *l4head;
struct ipv6hdr *ip6;
- struct sk_buff *skb2 = NULL;
- int l4_offset = 0;
-
+
print_sun(SUN_DBG, "enter fast_6_recv \n");
if (fastnat_level == FAST_CLOSE)
@@ -288,18 +286,13 @@
print_sun(SUN_DBG, "fast_6_recv l4head is null \n");
return 0;
}
- l4_offset = l4head - skb->data;
-
- if (!(skb2 = fast_expand_headroom_v6(skb, dev))){
+
+
+
+ if (!(skb = fast_expand_headroom_v6(skb, dev))){
rcu_read_unlock();
return 1;
}
-
- if(skb2 != skb){
- l4head = skb2->data + l4_offset;
- skb = skb2;
- skb_expand6++;
- }
fast_tcpdump(skb);
@@ -323,30 +316,8 @@
skb->isFastnat = 1;
skb->priority = fast6_entry_data->priority;
skb->mark = fast6_entry_data->mark;
- if (likely(skb_get_nfct(skb) == 0)){
- skb_set_nfct(skb, (unsigned long)fast6_entry->ct);
- nf_conntrack_get(&fast6_entry->ct->ct_general);
- }
- spin_lock_bh(&fast_fw_spinlock);
- //»ùÓÚctÁ´½ÓµÄÁ÷Á¿Í³¼Æ --- ͳ¼ÆIP°ü²»ÊÇMAC°ü
- if (fast6_entry_data->tuplehash.tuple.dst.dir == IP_CT_DIR_ORIGINAL){
- fast6_entry->ct->packet_info[IP_CT_DIR_ORIGINAL].packets++;
- fast6_entry->ct->packet_info[IP_CT_DIR_ORIGINAL].bytes += skb->len;
- if(unlikely(fast6_entry->ct->indev[IP_CT_DIR_ORIGINAL] == NULL))
- fast6_entry->ct->indev[IP_CT_DIR_ORIGINAL] = skb->indev;
- if(unlikely(fast6_entry->ct->outdev[IP_CT_DIR_ORIGINAL] == NULL))
- fast6_entry->ct->outdev[IP_CT_DIR_ORIGINAL] = dev;
- } else if (fast6_entry_data->tuplehash.tuple.dst.dir == IP_CT_DIR_REPLY){
- fast6_entry->ct->packet_info[IP_CT_DIR_REPLY].packets++;
- fast6_entry->ct->packet_info[IP_CT_DIR_REPLY].bytes += skb->len;
- if(unlikely(fast6_entry->ct->indev[IP_CT_DIR_REPLY] == NULL))
- fast6_entry->ct->indev[IP_CT_DIR_REPLY] = skb->indev;
- if(unlikely(fast6_entry->ct->outdev[IP_CT_DIR_REPLY] == NULL))
- fast6_entry->ct->outdev[IP_CT_DIR_REPLY] = dev;
- } else {
- printk("fast6 packet error\n");
- }
- spin_unlock_bh(&fast_fw_spinlock);
+
+
//ÄÚºË×Ô´øµÄ»ùÓÚÁ´½ÓµÄÁ÷Á¿Í³¼Æ
struct nf_conn_counter *acct = (struct nf_conn_counter*)nf_conn_acct_find(fast6_entry->ct);
if (acct) {
@@ -377,8 +348,7 @@
//Ö»Óе±ÓÐMACÍ·Ô¤¸³ÖµÊ±£¬²Å×¼¸³Öµ£¬·ñÔòΪIPÍ·
skb_push(skb, ETH_HLEN);
-
- if (fast6_entry_data->hh_flag)
+
memcpy(skb->data, fast6_entry_data->hh_data, ETH_HLEN);
/*¸üÐÂÁ¬½Ó³¬Ê±*/
if (IPPROTO_TCP == tuple.dst.protonum)
@@ -500,12 +470,12 @@
return NF_ACCEPT;
}
_neighbour = dst_neigh_lookup_skb(dst, skb);
- if(_neighbour == NULL && ((ipv6_addr_type(&ipv6_hdr(skb)->daddr)) == IPV6_ADDR_ANY
- || ((ipv6_addr_type(&ipv6_hdr(skb)->daddr)) & IPV6_ADDR_LOOPBACK))){
- return NF_ACCEPT;
+ if(!_neighbour)
+ {
+ return NF_ACCEPT;
}
- if (_neighbour && memcmp(_neighbour->ha, zeromac, ETH_ALEN) == 0)
+ if (memcmp(_neighbour->ha, zeromac, ETH_ALEN) == 0)
{
goto accept;
}
@@ -566,10 +536,9 @@
fast6_entry_data = &fast6_entry->data[dir];
fast6_entry_data->tuplehash.tuple = ct->tuplehash[dir].tuple;
- //memcpy(fast6_entry_data->dmac, _neighbour->ha, ETH_ALEN);
+ memcpy(fast6_entry_data->dmac, _neighbour->ha, ETH_ALEN);
fast6_entry_data->priority = skb->priority;
fast6_entry_data->mark = skb->mark;
- if(fast6_entry_data->outdev == NULL){
fast6_entry_data->outdev = out;
if (!record_MAC_header(working_hash6, ct, fast6_entry, fast6_entry_data, _neighbour, out, htons(ETH_P_IPV6)))
@@ -577,7 +546,7 @@
spin_unlock_bh(&fast6_spinlock);
goto accept;
}
- }
+
//´Ë´¦±£Ö¤Õý·´Á½¸ö±ê¼Çλ²»³åÍ»
fast6_entry->flags = fast6_entry->flags | (1 << dir);
@@ -594,7 +563,7 @@
ct->fast_ct.isFast = FAST_CT_WND6;
accept:
- if(_neighbour)
+
neigh_release(_neighbour);
return NF_ACCEPT;
}
diff --git a/upstream/linux-5.10/net/core/fastproc/fast6_fw.c b/upstream/linux-5.10/net/core/fastproc/fast6_fw.c
index ec21bc6..322175b 100755
--- a/upstream/linux-5.10/net/core/fastproc/fast6_fw.c
+++ b/upstream/linux-5.10/net/core/fastproc/fast6_fw.c
@@ -40,23 +40,8 @@
#include <net/SI/net_cache.h>
#include <net/SI/print_sun.h>
-#include <linux/netfilter/xt_tcpudp.h>
-#include <linux/netfilter_ipv6/ip6_tables.h>
-
-
MODULE_LICENSE("GPL");
-static struct task_struct *ct_ip6tables_syn;
-static struct tasklet_struct ct_ip6tables_bh;
-extern unsigned int ct_iptables_syn_sw;
-enum table6_index {
- IP6TABLE_RAW,
- IP6TABLE_MANGLE,
- IP6TABLE_NAT,
- IP6TABLE_FILTER
-};
-
-
/* ***************** ipv6 ¿ìËÙת·¢Ïà¹Ø±äÁ¿ ************************* */
@@ -68,7 +53,6 @@
int dst_expire_count_v6 = 0;
extern int no_neighbour;
-extern fast_list_t working_list6;
extern void ntl_ct_set_iw(struct sk_buff *skb, struct nf_conn *ct, int ct_dir);
int fast6_fw_recv(struct nf_conn *tmpl,
struct sk_buff *skb,
@@ -179,8 +163,7 @@
skb->isFastnat = 1;
nf_ct_set(skb, (struct nf_conn *)&ct->ct_general, ctinfo);
- ct->packet_info[dir].packets++;
- ct->packet_info[dir].bytes += skb->len;
+
//»ùÓÚÍø¿ÚµÄÁ÷Á¿Í³¼Æ --- ²Î¿¼linuxÔÉúµÄÇý¶¯£¬Í³¼ÆµÄ¶¼ÊÇIP°ü³¤¶È
if (fastnat_level == FAST_NET_DEVICE)
{
@@ -220,17 +203,6 @@
}
skb->dev = dev;
skb->now_location |= FASTNAT_SUCC;
-
- if(ct->indev[dir] == NULL && skb->indev != NULL)
- {
- ct->indev[dir] = skb->indev;
- }
-
- if(ct->outdev[dir] == NULL && skb->dev != NULL)
- {
- ct->outdev[dir] = skb->dev;
- }
-
skb->vlan_proto = vlan_proto_raw;
skb->vlan_tci = vlan_tci_raw;
__flush_dcache_area(skb->data, skb->len);
@@ -398,372 +370,6 @@
.priority = NF_IP6_PRI_LAST,
};
-static inline bool
-port_match(u_int16_t min, u_int16_t max, u_int16_t port, bool invert)
-{
- return (port >= min && port <= max) ^ invert;
-}
-
-static bool ctable_mt(struct nf_conn* ct, struct xt_action_param *par,int dir, int* match_filter)
-{
- const struct xt_tcp *tcpinfo = par->matchinfo;
-
- if (!port_match(tcpinfo->spts[0], tcpinfo->spts[1],
- ntohs(ct->tuplehash[dir].tuple.src.u.tcp.port),
- !!(tcpinfo->invflags & XT_TCP_INV_SRCPT)))
- return false;
- if((tcpinfo->spts[0] || tcpinfo->spts[1]) ^ (!!(tcpinfo->invflags & XT_TCP_INV_SRCPT)))
- *match_filter = 1;
- if (!port_match(tcpinfo->dpts[0], tcpinfo->dpts[1],
- ntohs(ct->tuplehash[dir].tuple.dst.u.tcp.port),
- !!(tcpinfo->invflags & XT_TCP_INV_DSTPT)))
- return false;
- if((tcpinfo->dpts[0] || tcpinfo->dpts[1]) ^ (!!(tcpinfo->invflags & XT_TCP_INV_DSTPT)))
- *match_filter = 1;
- return true;
-}
-
-static inline bool
-ip6_packet_match(const struct ip6t_ip6 *ip6info,struct nf_conn* ct,int dir, int* match_filter)
-{
- unsigned long ret;
- if (NF_INVF(ip6info, IP6T_INV_SRCIP,
- ipv6_masked_addr_cmp((struct in6_addr *)(ct->tuplehash[dir].tuple.src.u3.ip6), &ip6info->smsk,
- &ip6info->src)) ||
- NF_INVF(ip6info, IP6T_INV_DSTIP,
- ipv6_masked_addr_cmp((struct in6_addr *)(ct->tuplehash[dir].tuple.dst.u3.ip6), &ip6info->dmsk,
- &ip6info->dst)))
- return false;
- if(ip6info->src.in6_u.u6_addr32[0] || ip6info->dst.in6_u.u6_addr32[0])
- {
- *match_filter = 1;
- }
-
- if(ct->indev[dir] != NULL)
- {
- ret = ifname_compare_aligned(ct->indev[dir]->name, ip6info->iniface, ip6info->iniface_mask);
- }
- else
- {
- ret=1;
- }
-
- if(ip6info->iniface[0] != '\0')
- *match_filter = 1;
-
- if (NF_INVF(ip6info, IP6T_INV_VIA_IN, ret != 0))
- return false;
- if(ct->outdev[dir] != NULL)
- {
- ret = ifname_compare_aligned(ct->outdev[dir]->name, ip6info->outiface, ip6info->outiface_mask);
- }
-
- if(ip6info->outiface[0] != '\0')
- *match_filter = 1;
-
- if (NF_INVF(ip6info, IP6T_INV_VIA_OUT, ret != 0))
- return false;
-
- if (ip6info->flags & IP6T_F_PROTO) {
- int protohdr;
-
- protohdr = ct->tuplehash[dir].tuple.dst.protonum;
-
- if (ip6info->proto == protohdr) {
- if (ip6info->invflags & IP6T_INV_PROTO)
- return false;
-
- return true;
- }
-
- /* We need match for the '-p all', too! */
- if ((ip6info->proto != 0) &&
- !(ip6info->invflags & IP6T_INV_PROTO))
- return false;
- }
-
- return true;
-}
-
-static inline bool
-ip6_packet_match_neg(const struct ip6t_ip6 *ip6info,struct nf_conn* ct,int dir, int* match_filter)
-{
- unsigned long ret;
- if(!(ct->status & IPS_NAT_MASK))
- return false;
- if (NF_INVF(ip6info, IP6T_INV_SRCIP,
- ipv6_masked_addr_cmp((struct in6_addr *)ct->tuplehash[dir].tuple.src.u3.ip6, &ip6info->smsk,
- &ip6info->src)) ||
- NF_INVF(ip6info, IP6T_INV_DSTIP,
- ipv6_masked_addr_cmp((struct in6_addr *)ct->tuplehash[dir].tuple.dst.u3.ip6, &ip6info->dmsk,
- &ip6info->dst)))
- return false;
- if(ip6info->src.in6_u.u6_addr32[0] || ip6info->dst.in6_u.u6_addr32[0])
- *match_filter = 1;
-
- if(ct->outdev[dir] != NULL)
- {
- ret = ifname_compare_aligned(ct->outdev[dir]->name, ip6info->iniface, ip6info->iniface_mask);
- }
- else
- {
- ret = 1;
- }
-
- if(ip6info->iniface[0] != '\0')
- *match_filter = 1;
-
- if (NF_INVF(ip6info, IP6T_INV_VIA_IN, ret != 0))
- return false;
- if(ct->indev[dir] != NULL)
- {
- ret = ifname_compare_aligned(ct->indev[dir]->name, ip6info->outiface, ip6info->outiface_mask);
- }
-
- if(ip6info->outiface[0] != '\0')
- *match_filter = 1;
-
- if (NF_INVF(ip6info, IP6T_INV_VIA_OUT, ret != 0))
- return false;
-
- if (ip6info->flags & IP6T_F_PROTO) {
- int protohdr;
-
- protohdr = ct->tuplehash[dir].tuple.dst.protonum;
-
- if (ip6info->proto == protohdr) {
- if (ip6info->invflags & IP6T_INV_PROTO)
- return false;
-
- return true;
- }
-
- /* We need match for the '-p all', too! */
- if ((ip6info->proto != 0) &&
- !(ip6info->invflags & IP6T_INV_PROTO))
- return false;
- }
-
- return true;
-}
-
-static inline struct ip6t_entry *
-get_entry(const void *base, unsigned int offset)
-{
- return (struct ip6t_entry *)(base + offset);
-}
-
-static inline
-struct ip6t_entry *ip6t_next_entry(const struct ip6t_entry *entry)
-{
- return (void *)entry + entry->next_offset;
-}
-
-
-
-//ͬ²½ctͳ¼ÆÐÅÏ¢µ½iptables,ͬ²½ÖÜÆÚÔݶ¨1s
-static int ct_ip6tables_syn_thread(void *param)
-{
- while (1)
- {
- if(ct_iptables_syn_sw)
- {
- rcu_read_lock();
- tasklet_schedule(&ct_ip6tables_bh);
- rcu_read_unlock();
- //ÿ´Îͬ²½¼ä¸ôΪ1s.
- }
- msleep(1*1000);
- }
- return 0;
-}
-
-void ct_ip6tables_syn_handle(struct nf_conn *ct,struct xt_table_info *private,int table_id)
-{
- void *table_base;
- struct ip6t_entry *e;
- const struct xt_entry_match *ematch;
- struct xt_action_param acpar;
- struct xt_counters *counter;
- int match_flag = 0;
- int match_filter = 0;
- int num = 0;
-
-
- table_base = private->entries;
- num = private->number;
- switch(table_id)
- {
- case 0:
- case 1:
- case 2:
- e = get_entry(table_base, private->hook_entry[NF_INET_PRE_ROUTING]);
- break;
- case 3:
- e = get_entry(table_base, private->hook_entry[NF_INET_LOCAL_IN]);
- break;
- default:
- return;
- }
- while(num--)
- {
- match_flag = 0;
- match_filter = 0;
- if(!ip6_packet_match(&e->ipv6, ct, IP_CT_DIR_ORIGINAL,&match_filter) &&
- !ip6_packet_match_neg(&e->ipv6, ct, IP_CT_DIR_REPLY,&match_filter))
- {
- }
- else
- {
- xt_ematch_foreach(ematch, e)
- {
- acpar.matchinfo = ematch->data;
- if (!ctable_mt(ct, &acpar, IP_CT_DIR_ORIGINAL,&match_filter))
- {
- match_flag = 1;
- break;
- }
- else
- {
- }
- }
- if(!match_flag)
- {
- if(match_filter)
- {
- counter = xt_get_this_cpu_counter(&e->counters);
- ADD_COUNTER(*counter, ct->packet_info[IP_CT_DIR_ORIGINAL].bytes,ct->packet_info[IP_CT_DIR_ORIGINAL].packets);
- }
- e = ip6t_next_entry(e);
- continue;
- }
- match_flag = 0;
- match_filter = 0;
- }
-
- if (!ip6_packet_match(&e->ipv6, ct, IP_CT_DIR_REPLY,&match_filter) &&
- !ip6_packet_match_neg(&e->ipv6, ct, IP_CT_DIR_ORIGINAL,&match_filter))
- {
- e = ip6t_next_entry(e);
- continue;
- }
- else
- {
- xt_ematch_foreach(ematch, e)
- {
- acpar.matchinfo = ematch->data;
- if (!ctable_mt(ct, &acpar, IP_CT_DIR_REPLY,&match_filter))
- {
- match_flag = 1;
- break;
- }
- }
- if(!match_flag)
- {
- if(match_filter)
- {
- counter = xt_get_this_cpu_counter(&e->counters);
- ADD_COUNTER(*counter, ct->packet_info[IP_CT_DIR_REPLY].bytes,ct->packet_info[IP_CT_DIR_REPLY].packets);
- }
- e = ip6t_next_entry(e);
- continue;
- }
- }
- }
-
-}
-
-static void ct_ip6tables_bhfunc(unsigned long param)
-{
- fast_entry_t *ret = NULL;
- struct hlist_nulls_node *n;
- struct nf_conn *ct;
- struct xt_table_info *private;
- struct net * net;
- unsigned int addend;
- local_bh_disable();
- addend = xt_write_recseq_begin();
- spin_lock_bh(&fast_fw_spinlock);
- for (ret = (&working_list6)->next; ret; ret = ret->next)
- {
- if(ret)
- {
- ct = ret->ct;
- if(ct->fast_ct.isFast)
- {
- net = nf_ct_net(ct);
- private = READ_ONCE(net->ipv6.ip6table_raw->private);
- ct_ip6tables_syn_handle(ct,private,IP6TABLE_RAW);
- private = READ_ONCE(net->ipv6.ip6table_mangle->private);
- ct_ip6tables_syn_handle(ct,private,IP6TABLE_MANGLE);
- private = READ_ONCE(net->ipv6.ip6table_nat->private);
- ct_ip6tables_syn_handle(ct,private,IP6TABLE_NAT);
- private = READ_ONCE(net->ipv6.ip6table_filter->private);
- ct_ip6tables_syn_handle(ct,private,IP6TABLE_FILTER);
- }
- else
- continue;
-
- ct->packet_info[IP_CT_DIR_ORIGINAL].bytes = 0;
- ct->packet_info[IP_CT_DIR_ORIGINAL].packets = 0;
- ct->packet_info[IP_CT_DIR_REPLY].bytes = 0;
- ct->packet_info[IP_CT_DIR_REPLY].packets = 0;
- }
- }
- spin_unlock_bh(&fast_fw_spinlock);
- xt_write_recseq_end(addend);
- local_bh_enable();
-}
-
-#if 0
-/*ÐÂfast ip6tablesÁ÷Á¿Í¬²½´úÂë,±£Áô*/
-/* Started by AICoder, pid:b1b62d7ef7md76714807099a103c224334833109 */
-static void ct_ip6tables_bhfunc(unsigned long param)
-{
- int hash;
- struct nf_conn *ct;
- struct xt_table_info *private;
- struct net *net;
- unsigned int addend;
- local_bh_disable();
- addend = xt_write_recseq_begin();
- for(hash = 0; hash < nf_conntrack_htable_size; hash++)
- {
- struct nf_conntrack_tuple_hash *h;
- struct hlist_nulls_node *n;
- hlist_nulls_for_each_entry_rcu(h, n, &nf_conntrack_hash[hash], hnnode)
- {
- if(h)
- {
- ct = nf_ct_tuplehash_to_ctrack(h);
- if(ct->fast_ct.isFast)
- {
- net = nf_ct_net(ct);
- private = READ_ONCE(net->ipv6.ip6table_raw->private);
- ct_ip6tables_syn_handle(ct, private, IP6TABLE_RAW);
- private = READ_ONCE(net->ipv6.ip6table_mangle->private);
- ct_ip6tables_syn_handle(ct, private, IP6TABLE_MANGLE);
- private = READ_ONCE(net->ipv6.ip6table_nat->private);
- ct_ip6tables_syn_handle(ct, private, IP6TABLE_NAT);
- private = READ_ONCE(net->ipv6.ip6table_filter->private);
- ct_ip6tables_syn_handle(ct, private, IP6TABLE_FILTER);
- spin_lock_bh(&fast_fw_spinlock);
- for(int i = 0; i < 4; i++)
- {
- ct->packet_info[i].bytes = 0;
- ct->packet_info[i].packets = 0;
- }
- spin_unlock_bh(&fast_fw_spinlock);
- }
- }
- }
- }
- xt_write_recseq_end(addend);
- local_bh_enable();
-}
-/* Ended by AICoder, pid:b1b62d7ef7md76714807099a103c224334833109 */
-#endif
-
int fast6_fw_init(void)
{
@@ -777,14 +383,6 @@
}
print_sun(SUN_DBG,"init fast6_fw_init done\n");
- ct_ip6tables_bh.func = ct_ip6tables_bhfunc;
- ct_ip6tables_syn = kthread_create(ct_ip6tables_syn_thread, (void *)0, "ct_ip6tables_syn" );
- if (!IS_ERR(ct_ip6tables_syn))
- {
- printk("ntl_syn_task thread's init is succ");
- wake_up_process(ct_ip6tables_syn);
- }
-
return 0;
}
@@ -792,12 +390,6 @@
{
fast_release_all(RELEASE_ALL_DST);
nf_unregister_net_hook(&init_net, &fast6_fw_hook);
- if (ct_ip6tables_syn)
- {
- kthread_stop(ct_ip6tables_syn);
- ct_ip6tables_syn = NULL;
- }
- tasklet_kill(&ct_ip6tables_bh);
return 0;
}
diff --git a/upstream/linux-5.10/net/core/fastproc/fast_common.c b/upstream/linux-5.10/net/core/fastproc/fast_common.c
index 80ad864..69f3761 100755
--- a/upstream/linux-5.10/net/core/fastproc/fast_common.c
+++ b/upstream/linux-5.10/net/core/fastproc/fast_common.c
@@ -621,7 +621,7 @@
//²Î¿¼ip6_xmit,À©³äskbÍ·²¿
struct sk_buff *fast_expand_headroom_v6(struct sk_buff *skb, struct net_device *dev) {
- unsigned int hh_len = LL_RESERVED_SPACE(dev);//EC616000622279½â¾öv6ÉÏÐÐÊý¾Ý°üÓÉÓÚÍ·¿Õ¼ä²»¹»ÖØÐÂÉêÇëµÄÎÊÌâ + sizeof(struct ipv6hdr);
+ unsigned int hh_len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr);
struct sk_buff *skb2 = NULL;
if (unlikely(skb_headroom(skb) < hh_len)) {
skb2 = skb_realloc_headroom(skb, max(hh_len, NET_SKB_PAD));
@@ -726,9 +726,6 @@
{
tcpack_rel(entry);
//nf_ct_put(entry->ct);
- spin_lock_bh(&fast_fw_spinlock);
- entry->ct->fast_entry = NULL;
- spin_unlock_bh(&fast_fw_spinlock);
atomic_dec(&(entry->ct->ct_general.use));
fn_list_del(list_head, entry);
}
@@ -813,7 +810,6 @@
netslab_inc(FAST_SLAB);
memset(ret, 0, sizeof(fast_entry_t));
ret->ct = ct;
- ct->fast_entry = ret;
ret->list_head = list_head;
//ÉèÖö¨Ê±Æ÷
@@ -901,7 +897,7 @@
goto REL;
//½ö¶ÔÒÔÌ«ÍøÀàÍø¿Ú½øÐÐMACÍ·Ô¤¸³Öµ£¬ÆäËüµÄÈçPPP¡¢PPPoEÕâЩ£¬½ÔÊǿɱäµÄ£¬²»ÄÜÔ¤¸³Öµ£»²Î¼ûalloc_netdevºÍalloc_etherdev½Ó¿Ú
- if (out->type != ARPHRD_ETHER || neigh == NULL)
+ if (out->type != ARPHRD_ETHER)
return 1;
//¶ÔÓÚ³ö¿ÚÎªÍøÇÅbrʱ£¬Ö±½Ó»ñÈ¡L2ÍøÂçÉ豸£¬¼´usb0»òwifi0
@@ -910,7 +906,7 @@
if(out->dev_addr == NULL)
goto REL;
- if (fastbr_level)
+ if (fastbr_level == 1)
{
dst_out = getbrport_bydst(out, neigh->ha);
if (dst_out == NULL)
@@ -968,9 +964,6 @@
//»Ö¸´ctµÄ³¬Ê±
//add_timer(&ct->timeout);
//nf_ct_put(ct);
- spin_lock_bh(&fast_fw_spinlock);
- entry->ct->fast_entry = NULL;
- spin_unlock_bh(&fast_fw_spinlock);
atomic_dec(&(ct->ct_general.use));
del_timer(&entry->timeout);
fn_list_del(entry->list_head, entry);
@@ -1086,9 +1079,7 @@
del_timer(&entry->timeout);
workinghash_del_node(entry);
- spin_lock_bh(&fast_fw_spinlock);
- entry->ct->fast_entry = NULL;
- spin_unlock_bh(&fast_fw_spinlock);
+
//»Ö¸´ctµÄ³¬Ê±
//add_timer(&entry->ct->timeout);
fn_list_del(list_head, entry);
@@ -1561,7 +1552,7 @@
return 1;
}
//vlan
- else if (next_pro == cpu_to_be16(ETH_P_8021Q) && fastbr_level == 1)
+ else if (next_pro == cpu_to_be16(ETH_P_8021Q))
{
skb->isvlan = 1;
skb_pull(skb, VLAN_HLEN);
@@ -1600,7 +1591,7 @@
//if (((unsigned long)skb->data)%4 != 0)
//panic("ERR: fast from dev skb->data%4 != 0");
- if (skb->indev == NULL || is_vlan_dev(skb->dev))
+ if (skb->indev == NULL)
skb->indev = skb->dev;
//ÐèҪ׼ȷ¶¨Î»µ½IPÍ·£¬ÆÚ¼ä¿ÉÄÜÌø¹ýppp/mac/pppoeµÈ¸÷ÖÖ²ã2Í·²¿
if (set_skbdata_toip(skb) == 1 && fast_for_ipdata(skb))
@@ -2064,21 +2055,6 @@
return dst;
}
-void fast_update_indev(struct sk_buff *skb, struct net_device *dev)
-{
- if(fastbr_level != 1 && skb->isFastnat == 1){
- enum ip_conntrack_info ctinfo;
- struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-
- if(ct){
- if(ct->indev[0] == skb->indev && ct->indev[1] == NULL)
- ct->indev[1] = dev;
- if(ct->indev[1] == skb->indev && ct->indev[0] == NULL)
- ct->indev[0] = dev;
- }
- }
-}
-
/*fast³õʼ»¯*/
static int __init
tsp_fast_init(void)
diff --git a/upstream/linux-5.10/net/core/fastproc/fast_track.c b/upstream/linux-5.10/net/core/fastproc/fast_track.c
index 712ff6d..37f3cfc 100755
--- a/upstream/linux-5.10/net/core/fastproc/fast_track.c
+++ b/upstream/linux-5.10/net/core/fastproc/fast_track.c
@@ -234,7 +234,7 @@
if (copy_from_user(char_fastbr, buffer, 1))
return -EFAULT;
- if (char_fastbr[0] < '0' || char_fastbr[0] > '2')
+ if (char_fastbr[0] < '0' || char_fastbr[0] > '1')
return -EINVAL;
fastbr_level = (int)(char_fastbr[0] - '0');
@@ -252,8 +252,8 @@
{
if (*pos == 0)
{
- seq_printf(seq, "fastnat have %d conn!!!\nskb_num4:%d,fastnat_num:%d,expand_head4:%d\n",
- working_list.count, skb_num4, fastnat_num, skb_expand4);
+ seq_printf(seq, "fastnat have %d conn!!!\nskb_num4:%d,fastnat_num:%d\n",
+ working_list.count, skb_num4, fastnat_num);
seq_printf(seq, "fastbr_sum:%d,fastbr_num:%d\n",
skb_num4 + skb_num6 + skb_unknown - fastnat_num - fast6_num, fastbr_num);
@@ -399,8 +399,8 @@
working_list.count,fastnat_recv_count,fastnat_real_count);
seq_printf(seq, "send_2_ps_failed:%u, send_2_usb_failed:%u\n", send_2_ps_failed, send_2_usb_failed);
#endif
- seq_printf(seq, "fast6 have %d conn!!!\nskb_num6:%d,fast6_num:%d,expand_head6:%d\n",
- working_list6.count, skb_num6, fast6_num, skb_expand6);
+ seq_printf(seq, "fast6 have %d conn!!!\nskb_num6:%d,fast6_num:%d\n",
+ working_list6.count, skb_num6, fast6_num);
}
return &working_hash6[*pos];
}
@@ -1160,42 +1160,6 @@
.proc_write = ct_iptables_syn_set,
};
-/* Started by AICoder, pid:i2747j1887i1a311479909db709e49391b4455c1 */
-static ssize_t dev_unreg_set(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
-{
- struct net_device *dev = NULL;
- size_t size;
- char dev_name[MAX_NET_DEVICE_NAME_LEN + 1] = {0};
-
- // Ensure that the string is null-terminated
- if (count == 0 || count > MAX_NET_DEVICE_NAME_LEN + 1)
- return -EINVAL;
-
- // Copy the device name from user space and ensure it's null terminated
- size = min(count - 1, MAX_NET_DEVICE_NAME_LEN);
- if (copy_from_user(dev_name, buffer, size)) {
- return -EFAULT;
- }
- dev_name[size] = '\0'; // Ensure null-termination
-
- // Try to get the network device by name
- dev = dev_get_by_name(&init_net, dev_name);
- if (dev) {
- // Put the device reference
- dev_put(dev);
- // Unregister the network device
- unregister_netdev(dev);
- } else {
- printk("dev_unreg %s not found\n", dev_name);
- }
-
- return count;
-}
-
-static const struct proc_ops dev_unreg_file_ops = {
- .proc_write = dev_unreg_set,
-};
-/* Ended by AICoder, pid:i2747j1887i1a311479909db709e49391b4455c1 */
//¿ìËÙת·¢procÎļþµÄ³õʼ»¯
int fast_conntrack_init_proc(void)
@@ -1231,7 +1195,6 @@
proc_create("dev_reset_stats", 0440, init_net.proc_net, &dev_reset_file_ops);
proc_create("ct_iptables_syn", 0440, init_net.proc_net, &ct_iptables_syn_file_ops);
- proc_create("dev_unreg", 0440, init_net.proc_net, &dev_unreg_file_ops);
return 1;
}
diff --git a/upstream/linux-5.10/net/core/fastproc/fastnat.c b/upstream/linux-5.10/net/core/fastproc/fastnat.c
index 8d585c0..717454c 100755
--- a/upstream/linux-5.10/net/core/fastproc/fastnat.c
+++ b/upstream/linux-5.10/net/core/fastproc/fastnat.c
@@ -209,7 +209,6 @@
{
iph = (struct iphdr *)skb2->data;
skb = skb2;
- skb_expand4++;
}
fast_tcpdump(skb);
@@ -276,8 +275,7 @@
skb->priority = nat_entry_data->priority;
skb->mark = nat_entry_data->mark;
-
- spin_lock_bh(&fast_fw_spinlock);
+
//»ùÓÚctÁ´½ÓµÄÁ÷Á¿Í³¼Æ --- ͳ¼ÆIP°ü²»ÊÇMAC°ü
if (nat_entry_data->tuplehash.tuple.dst.dir == IP_CT_DIR_ORIGINAL){
nat_entry->ct->packet_info[IP_CT_DIR_ORIGINAL].packets++;
@@ -296,7 +294,6 @@
} else {
printk("fastnat packet error\n");
}
- spin_unlock_bh(&fast_fw_spinlock);
//ÄÚºË×Ô´øµÄ»ùÓÚÁ´½ÓµÄÁ÷Á¿Í³¼Æ
struct nf_conn_counter *acct = (struct nf_conn_counter *)nf_conn_acct_find((const struct nf_conn *)nat_entry->ct);
@@ -453,8 +450,7 @@
}
//¹ã²¥¡¢×é²¥²»½¨Á´
- if (ipv4_is_multicast(ip_hdr(skb)->daddr) || ipv4_is_lbcast(ip_hdr(skb)->daddr)
- || ip_hdr(skb)->daddr == 0 || ip_hdr(skb)->saddr == 0)
+ if (ipv4_is_multicast(ip_hdr(skb)->daddr) || ipv4_is_lbcast(ip_hdr(skb)->daddr))
{
return NF_ACCEPT;
}
@@ -471,10 +467,13 @@
}
_neighbour = dst_neigh_lookup_skb(dst, skb);
- if(_neighbour == NULL && ((ip_hdr(skb)->daddr & 0xff000000) == 0xff000000 )){
+ if (!_neighbour)
+ {
+ print_sun(SUN_DBG,"napt_handle() _neighbour = null\n");
return NF_ACCEPT;
- }
- if (_neighbour && memcmp(_neighbour->ha, zeromac, ETH_ALEN) == 0)
+ }
+
+ if (memcmp(_neighbour->ha, zeromac, ETH_ALEN) == 0)
{
if (strncmp(out->name, ppp_name, strlen(ppp_name)) != 0)
{
@@ -558,10 +557,9 @@
entry_data = &nat_entry->data[dir];
entry_data->tuplehash.tuple = ct->tuplehash[dir].tuple;
- //memcpy(entry_data->dmac, _neighbour->ha, ETH_ALEN);
+ memcpy(entry_data->dmac, _neighbour->ha, ETH_ALEN);
entry_data->priority = skb->priority;
entry_data->mark = skb->mark;
- if(entry_data->outdev == NULL){
entry_data->outdev = out;
/*¼Ç¼MACµØÖ·µ½entry_data->hh_data*/
@@ -570,7 +568,6 @@
spin_unlock_bh(&fastnat_spinlock);
goto accept;
}
- }
print_sun(SUN_DBG,"napt_handle() ct->status=0x%x\n", ct->status);
/*»ñÈ¡natת»»ÐèÒªµÄIPºÍportÐÅÏ¢*/
if (test_bit(IPS_SRC_NAT_BIT, &ct->status))
@@ -627,7 +624,6 @@
spin_unlock_bh(&fastnat_spinlock);
accept:
- if(_neighbour)
neigh_release(_neighbour);
return NF_ACCEPT;
}
diff --git a/upstream/linux-5.10/net/netfilter/nf_conntrack_core.c b/upstream/linux-5.10/net/netfilter/nf_conntrack_core.c
index d4ae0b7..e92413e 100755
--- a/upstream/linux-5.10/net/netfilter/nf_conntrack_core.c
+++ b/upstream/linux-5.10/net/netfilter/nf_conntrack_core.c
@@ -1621,11 +1621,6 @@
ct->packet_info[IP_CT_DIR_ORIGINAL].bytes = 0;
ct->packet_info[IP_CT_DIR_REPLY].packets = 0;
ct->packet_info[IP_CT_DIR_REPLY].bytes = 0;
- ct->indev[IP_CT_DIR_ORIGINAL] = NULL;
- ct->outdev[IP_CT_DIR_ORIGINAL] = NULL;
- ct->indev[IP_CT_DIR_REPLY] = NULL;
- ct->outdev[IP_CT_DIR_REPLY] = NULL;
- ct->fast_entry = NULL;
for(dir = IP_CT_DIR_ORIGINAL; dir < IP_CT_DIR_MAX; dir++)
{
ct->indev[dir] = NULL;