--- zzzz-none-000/linux-4.19.183/net/ipv6/ip6_tunnel.c 2021-03-24 10:07:39.000000000 +0000 +++ bcm63-7530ax-756/linux-4.19.183/net/ipv6/ip6_tunnel.c 2023-06-28 08:54:21.000000000 +0000 @@ -59,6 +59,10 @@ #include #include +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) +#include +#endif + MODULE_AUTHOR("Ville Nuorvala"); MODULE_DESCRIPTION("IPv6 tunneling device"); MODULE_LICENSE("GPL"); @@ -793,7 +797,15 @@ goto drop; } +#if (defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG)) + /* as bcm_gre_rcv_check increments seqno (for all tunnel packets) when + * GRE acceleration is enabled, we try to avoid double increment here + */ + if ((tunnel->parms.i_flags & TUNNEL_SEQ) && + !blog_gre_tunnel_accelerated()) { +#else if (tunnel->parms.i_flags & TUNNEL_SEQ) { +#endif if (!(tpi->flags & TUNNEL_SEQ) || (tunnel->i_seqno && (s32)(ntohl(tpi->seq) - tunnel->i_seqno) < 0)) { @@ -847,9 +859,35 @@ skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev))); +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + blog_link(IF_DEVICE, blog_ptr(skb), (void*)tunnel->dev, DIR_RX, skb->len); + /*TODO check here proto is set prorpely from userspace + when tunnle is created */ + if(tunnel->parms.proto == IPPROTO_GRE){ + blog_link(GRE_TUNL, blog_ptr(skb), (void*)tunnel, DIR_RX, 0); + blog_link(TOS_MODE, blog_ptr(skb), tunnel, DIR_RX, BLOG_TOS_FIXED); + }else{ + + blog_link(TOS_MODE, blog_ptr(skb), NULL, DIR_RX, + (tunnel->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) ? + BLOG_TOS_INHERIT : BLOG_TOS_FIXED); + } +#endif + if (tun_dst) skb_dst_set(skb, (struct dst_entry *)tun_dst); +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + if ((skb->protocol != htons(ETH_P_IP)) +#if IS_ENABLED(CONFIG_IPV6) + && (skb->protocol != htons(ETH_P_IPV6)) && + (tpi->proto != htons(ETH_P_TEB) || skb->protocol != htons(ETH_P_8021Q)) +#endif + ) { + blog_skip(skb, blog_skip_reason_unknown_proto); /* No blogging */ + } +#endif + gro_cells_receive(&tunnel->gro_cells, skb); return 0; @@ -1060,6 +1098,9 @@ bool use_cache = false; u8 hop_limit; int err = -1; +#if defined(CONFIG_BCM_KF_IPV6) + u8 needFrag = 0; +#endif if (t->parms.collect_md) { hop_limit = skb_tunnel_info(skb)->key.ttl; @@ -1148,8 +1189,12 @@ skb_dst_update_pmtu_no_confirm(skb, mtu); if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) { *pmtu = mtu; +#if defined(CONFIG_BCM_KF_IPV6) + needFrag = 1; +#else err = -EMSGSIZE; goto tx_err_dst_release; +#endif } if (t->err_count > 0) { @@ -1228,7 +1273,17 @@ ipv6h->nexthdr = proto; ipv6h->saddr = fl6->saddr; ipv6h->daddr = fl6->daddr; +#if defined(CONFIG_BCM_KF_IPV6) + if (needFrag) { + skb->ignore_df = 1; + ip6_fragment(net, skb->sk, skb, ip6_local_out); + } + else { + ip6tunnel_xmit(skb->sk, skb, dev); + } +#else ip6tunnel_xmit(NULL, skb, dev); +#endif return 0; tx_err_link_failure: stats->tx_carrier_errors++; @@ -1293,6 +1348,13 @@ fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + blog_link(TOS_MODE, blog_ptr(skb), NULL, DIR_TX, + (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) ? + BLOG_TOS_INHERIT : BLOG_TOS_FIXED); + blog_link(IF_DEVICE, blog_ptr(skb), (void*)dev, DIR_TX, skb->len); +#endif + if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) return -1;