--- zzzz-none-000/linux-4.1.38/net/ipv6/ip6_tunnel.c 2017-01-18 18:48:06.000000000 +0000 +++ bcm63-7582-715/linux-4.1.38/net/ipv6/ip6_tunnel.c 2020-11-25 10:06:48.000000000 +0000 @@ -58,6 +58,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"); @@ -851,6 +855,14 @@ u64_stats_update_begin(&tstats->syncp); tstats->rx_packets++; tstats->rx_bytes += skb->len; + +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + blog_lock(); + blog_link(TOS_MODE, blog_ptr(skb), NULL, DIR_RX, + (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) ? + BLOG_TOS_INHERIT : BLOG_TOS_FIXED); + blog_unlock(); +#endif u64_stats_update_end(&tstats->syncp); netif_rx(skb); @@ -986,6 +998,9 @@ unsigned int max_headroom = sizeof(struct ipv6hdr); u8 proto; int err = -1; +#if defined(CONFIG_BCM_KF_IP) + u8 needFrag = 0; +#endif /* NBMA tunnel */ if (ipv6_addr_any(&t->parms.raddr)) { @@ -1048,8 +1063,12 @@ skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu); if (skb->len > mtu) { *pmtu = mtu; +#if defined(CONFIG_BCM_KF_IP) + needFrag = 1; +#else err = -EMSGSIZE; goto tx_err_dst_release; +#endif } skb_scrub_packet(skb, !net_eq(t->net, dev_net(dev))); @@ -1100,7 +1119,17 @@ ipv6h->nexthdr = proto; ipv6h->saddr = fl6->saddr; ipv6h->daddr = fl6->daddr; +#if defined(CONFIG_BCM_KF_IP) + if (needFrag) { + skb->ignore_df = 1; + ip6_fragment(skb->sk, skb, ip6_local_out_sk); + } + else { + ip6tunnel_xmit(skb->sk, skb, dev); + } +#else ip6tunnel_xmit(NULL, skb, dev); +#endif if (ndst) ip6_tnl_dst_store(t, ndst); return 0; @@ -1144,6 +1173,15 @@ if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK) fl6.flowi6_mark = skb->mark; +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + blog_lock(); + 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); + blog_unlock(); +#endif + err = ip6_tnl_xmit2(skb, dev, dsfield, &fl6, encap_limit, &mtu); if (err != 0) { /* XXX: send ICMP error even if DF is not set. */