--- zzzz-none-000/linux-3.10.107/net/l2tp/l2tp_core.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/net/l2tp/l2tp_core.c 2021-11-10 11:53:56.000000000 +0000 @@ -18,6 +18,12 @@ * published by the Free Software Foundation. */ +/** + * Some part of this file is modified by Ikanos Communications. + * + * Copyright (C) 2013-2014 Ikanos Communications. + */ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include @@ -159,6 +165,13 @@ #define l2tp_tunnel_inc_refcount(t) l2tp_tunnel_inc_refcount_1(t) #define l2tp_tunnel_dec_refcount(t) l2tp_tunnel_dec_refcount_1(t) #endif +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +#ifdef CONFIG_L2TP_AP_SUPPORT +void (*buildL2TPFastPathInfo_ptr)(struct sk_buff *skb, struct l2tp_session *session,__u8 direction) = NULL; +void (*ap2ap_deleteL2TPFlowEntries_ptr)(unsigned short tunnelId, unsigned short sessionID) = NULL; +#endif +unsigned char (*qosGetTosValue_ptr)(struct sk_buff *skb) = NULL; +#endif /* Session hash global list for L2TPv3. * The session_id SHOULD be random according to RFC3931, but several @@ -1079,6 +1092,21 @@ /* Queue the packet to IP for output */ skb->local_df = 1; +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +#ifdef CONFIG_L2TP_AP_SUPPORT + if(buildL2TPFastPathInfo_ptr) { + buildL2TPFastPathInfo_ptr(skb,session,PROCESS_L2TP_ENCAP); + } else { + skb->apFlowData.encap_protocol = PROCESS_L2TP_SLOW_PATH; + } +#else + /* Below code is to avoid adding fast path entry + * when Fastpath l2tp support is disabled + */ + skb->apFlowData.encap_protocol = PROCESS_L2TP_SLOW_PATH; +#endif +#endif + #if IS_ENABLED(CONFIG_IPV6) if (skb->sk->sk_family == PF_INET6 && !tunnel->v4mapped) error = inet6_csk_xmit(skb, NULL); @@ -1178,7 +1206,7 @@ memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | IPSKB_REROUTED); - nf_reset(skb); + nf_reset_no_generic_ct(skb); bh_lock_sock(sk); if (sock_owned_by_user(sk)) { @@ -1200,6 +1228,14 @@ skb_reset_transport_header(skb); uh = udp_hdr(skb); uh->source = inet->inet_sport; +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +#ifdef CONFIG_L2TP_AP_SUPPORT +// inet->inet_dport = session->tunnel_addr.addr.sin_port; +// inet->inet_daddr = session->tunnel_addr.addr.sin_addr.s_addr; + if(qosGetTosValue_ptr) + inet->tos = qosGetTosValue_ptr(skb); +#endif +#endif uh->dest = inet->inet_dport; udp_len = uhlen + hdr_len + data_len; uh->len = htons(udp_len); @@ -1328,6 +1364,13 @@ (*session->ref)(session); write_unlock_bh(&tunnel->hlist_lock); +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +#ifdef CONFIG_L2TP_AP_SUPPORT + if(ap2ap_deleteL2TPFlowEntries_ptr) + ap2ap_deleteL2TPFlowEntries_ptr(session->tunnel->tunnel_id, + session->session_id); +#endif +#endif __l2tp_session_unhash(session); l2tp_session_queue_purge(session); @@ -1737,11 +1780,14 @@ */ int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) { - l2tp_tunnel_inc_refcount(tunnel); - l2tp_tunnel_closeall(tunnel); - if (false == queue_work(l2tp_wq, &tunnel->del_work)) { - l2tp_tunnel_dec_refcount(tunnel); - return 1; + if (tunnel->deleted == 0) { + tunnel->deleted = 1; + l2tp_tunnel_inc_refcount(tunnel); + l2tp_tunnel_closeall(tunnel); + if (false == queue_work(l2tp_wq, &tunnel->del_work)) { + l2tp_tunnel_dec_refcount(tunnel); + return 1; + } } return 0; } @@ -1992,4 +2038,11 @@ MODULE_DESCRIPTION("L2TP core"); MODULE_LICENSE("GPL"); MODULE_VERSION(L2TP_DRV_VERSION); +#if IS_ENABLED(CONFIG_FUSIV_KERNEL_AP_2_AP) +#ifdef CONFIG_L2TP_AP_SUPPORT +EXPORT_SYMBOL(ap2ap_deleteL2TPFlowEntries_ptr); +EXPORT_SYMBOL(buildL2TPFastPathInfo_ptr); +EXPORT_SYMBOL(qosGetTosValue_ptr); +#endif +#endif