<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Personal blog of Anurag Bhatia</title>
    <link>https://anuragbhatia.com/</link>
    <description>Recent content on Personal blog of Anurag Bhatia</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 10 Apr 2026 01:50:00 +0530</lastBuildDate><atom:link href="https://anuragbhatia.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Netflow for home router &amp; Linux servers</title>
      <link>https://anuragbhatia.com/post/2026/04/netflow-for-personal-devices/</link>
      <pubDate>Fri, 10 Apr 2026 01:50:00 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/04/netflow-for-personal-devices/</guid>
      <description>&lt;p&gt;For the last few weeks, I have been running a NetFlow collector for the home router. This is something I wanted to do for a long time, but I was missing the time to invest. There are a few open source options, and I guess many commercial solutions offering NetFlow, often bundled with other products.&lt;/p&gt;
&lt;p&gt;My personal monitoring is 100% open source and presently running Prometheus + Thanos + Node Exporter + Blackbox Exporter + SNMP Exporter  + Grafana + Grafana Loki + a few more exporters. So I started looking for open source options which are still under active development and supported.&lt;/p&gt;
&lt;p&gt;Two of them are quite popular  - &lt;a href=&#34;https://github.com/pmacct/pmacct&#34;&gt;Pmacct&lt;/a&gt; and &lt;a href=&#34;https://github.com/akvorado/akvorado&#34;&gt;Akvorado&lt;/a&gt;. Pmacct is extremely advanced, flexible, but at the same time overall complicated to set up (and maintain). Even their &lt;a href=&#34;https://github.com/pmacct/pmacct/blob/master/QUICKSTART&#34;&gt;quickstart file&lt;/a&gt; 3100-line file is full of setup options. On the other hand, Akvorado seems simpler to maintain. Some complications, anyway, are expected with NetFlow because the goal is not just to collect the data but also to have a system to store it, analyse it, map IPs to location/AS numbers, etc., dashboards, etc. It&amp;rsquo;s a tool developed by French ISP Free, which is part of the Iliad group, which also owns Scaleway.&lt;/p&gt;
&lt;p&gt;Setting up Akvorado is easy if you are familiar with Docker. They have a simple 4 command &lt;a href=&#34;https://demo.akvorado.net/docs/intro#quick-start&#34;&gt;quick-start&lt;/a&gt; which deploys all their containers as part of the stack. They deploy a few containers as part of the overall stack.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/akvorado_design.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://demo.akvorado.net/docs/intro#big-picture&#34;&gt;big picture page&lt;/a&gt; on their demo site documentation covers the overall architecture. I started feeding it data from the home (Mikrotik) router and later also added various Linux servers/VMs I manage for R&amp;amp;D, DNS, as well as to host this blog and other infrastructure. For Linux, I am using Pmacct as an exporter, as &lt;a href=&#34;https://demo.akvorado.net/docs/operations#gnulinux&#34;&gt;Akvorado&amp;rsquo;s documentation&lt;/a&gt; suggests using it in exporter mode and has a sample config which works.&lt;/p&gt;
&lt;h3 id=&#34;some-data&#34;&gt;Some data&lt;/h3&gt;
&lt;p&gt;Now that it&amp;rsquo;s been running for a few weeks, I can see major sources of data coming to the home. Before jumping to data, it&amp;rsquo;s important to note that I have regular camera feeds uploading traffic to my server in Mumbai, and some backups, route collector data pull and automated speedtests at home. All these kinds of &amp;ldquo;pollute&amp;rdquo; data, and thus, it is more fun to exclude and look for remaining data coming from regular usage by end devices at home. In the setup, I can easily filter data based on srcAS, dstAS, srcIP, dstIP, port, in and out interfaces, etc.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the data for the last 10 days towards end devices (excluding home server and camera traffic)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/Home_traffic_last-10days.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;While most of ASNs here are expected, but just for the context, Esto AS135817 is one of the upstreams at home (friendly ISP that I reach over a GRE tunnel over an IX from an underlying ISP), and most of the traffic hitting it is actually CDN traffic for Google GGC, Facebook FNA, etc., sitting on their IPs.&lt;/p&gt;
&lt;p&gt;What is more fun here are the Sankey graphs, where for a given interval, I can map ANY attribute -&amp;gt; ANY other attribute. e.g., srcAS -&amp;gt; Home Out interfaces or SrcPort -&amp;gt; SrcAS -&amp;gt; Destination IPs, etc.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the Sankey Graph for SrcPort -&amp;gt; SrcAS -&amp;gt; In Interface at home&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/sankey1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;On this connection, I get most of Google traffic from Google&amp;rsquo;s AS directly; however, for a few days, I was on Airtel as primary due to an outage on the underlying ISP and thus could not reach Esto over the tunnel. For those days, traffic patterns were very different. Both Google and Akamai terminated most of the traffic on caching nodes within Airtel.&lt;/p&gt;
&lt;p&gt;Traffic profile when running home traffic via Airtel:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/sankey2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Akvorado has support for Grafana, and while their dashboard seems good for usual lookups, I miss a pie chart. Let&amp;rsquo;s see what the pie chart of the last 10 days&amp;rsquo; traffic looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/pie3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Another fun thing is to look for traffic by Etype for IPv4 Vs IPv6 comparison. Let&amp;rsquo;s see how much IPv4 Vs IPv6 traffic there is in the last week:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/sankey3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;The same logic can be used to have a pie chart, but it has to be in Grafana.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/04/netflow-for-personal-devices/pie4.png&#34; width=&#34;300&#34; height=&#34;120&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Thus for now 89% of traffic is IPv6 at home. On that note, time to end this post.  😀&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Who can light fibre in India?</title>
      <link>https://anuragbhatia.com/post/2026/02/who-can-light-fibre-in-india/</link>
      <pubDate>Sun, 22 Feb 2026 02:19:05 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/02/who-can-light-fibre-in-india/</guid>
      <description>&lt;h3 id=&#34;friend-and-his-two-homes&#34;&gt;Friend and his two homes&amp;hellip;&lt;/h3&gt;
&lt;p&gt;Recently, a friend of mine mentioned his plan to procure dark fibre to connect two of his homes. His idea was straightforward - get LCO to give a dark strand between
both homes and run Bidi optics over it. I ended up telling him that while his idea is technically fine, as modern optics can easily cover that sort of distance, it would be illegal as per Indian telecom laws!&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t just him, but numerous content players, hosting companies, and Cloud players find it a bit odd when they find this out. In this post, I will document what is allowed and what is not allowed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advance warning&lt;/strong&gt;: I am a technical person &amp;amp; do not know much about regulatory. Whatever I am sharing here is what I have learned from my friends who have expertise in the subject. Indian telecom rules are overly complex and can have a different set of interpretations, and often go into the grey area. I welcome readers to share feedback if they are aware of something which isn&amp;rsquo;t correct as per the regulation. With that warning out of the way, I will proceed with the post.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;understanding-licensing&#34;&gt;Understanding licensing&lt;/h3&gt;
&lt;p&gt;In India, when fibre is going outside of a given building, one needs to have a license to light it. In fact, not just &amp;ldquo;lighting up a dark fibre&amp;rdquo; but to deploy and resell dark fibre, one needs a license (IP-1). Infrastructure Provider Category 1 (or IP-1) is considered an easy license which can be used to sell passive assets such as dark fibre, ducts, towers, etc. Active infra i.e lighting up fibre, is not allowed under this license, and it&amp;rsquo;s expected that an IP-1 holder leases their dark fibre only to a license holder who is authorised to light the fibre. Within a building, campus, datacenter, home etc one can deploy a light fibre but as soon as it goes outside of that it becomes a bit of a grey area depending on the use case.&lt;/p&gt;
&lt;p&gt;An Internet Service Provider (ISP) holding an ISP license or Unified License with ISP authorisation can light fibre but only for two specific purposes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Offering internet drop to the end user (quite obvious)&lt;/li&gt;
&lt;li&gt;Their own backhaul connectivity between routers, switches, OLTs, etc located anywhere within their authorisation area&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While this looks quite straightforward, it specifically excludes point-to-point connectivity. An ISP cannot offer point-to-point connectivity under its license. So for my friend&amp;rsquo;s use case - he cannot buy a point-to-point link using any technology (MPLS, layer 2 VLAN, DWDM wavelength or dark fibre strands) from the ISP as the ISP under the ISP license is not authorised to sell those. But funny enough if the same ISP sells him &amp;ldquo;internet drop&amp;rdquo; under ISP license and two routers (outside of core ISP business) and &amp;ldquo;helps&amp;rdquo; in setting VPN over the public internet, it&amp;rsquo;s largely legal because from ISP and DoT&amp;rsquo;s point of view this is an internet product. About #2 - For a long time ISPs could not procure dark fibre and make use of it because they could not make full use of the capacity. They could not light it with say DWDM &amp;amp; resell wavelengths. However recently it was clarified that an ISP can sell capacity to other licensed ISPs only (not end non-licensed customers). When researching I found some friends not being aware of it as well as some calling it a grey area rule.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;access-license--nld&#34;&gt;Access License &amp;amp; NLD&lt;/h3&gt;
&lt;p&gt;An Access license in India for selling circuits. It allows many things including selling p2p circuits, voice, mobile, etc. Many networks use an access license along with NLD (National Long Distance) which allows these services across India. It&amp;rsquo;s a vast license due to involvement of voice and mobile permissions but for the context of this post - it&amp;rsquo;s the ultimate license needed by players to do things without going into the grey area.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;debate-on-captive&#34;&gt;Debate on captive&lt;/h3&gt;
&lt;p&gt;I have heard of different opinions around captive traffic. An ISP friend of mine who has expertise in regulation (and doesn&amp;rsquo;t want to be named in this post) recently bid for a government contract. A project where the goal was to offer dark fibre to one department of the government. He had an ISP license while the government department that was taking fibre had no license. Their end goal was to connect to their own infra. This raised some concerns from other bidders. For now it&amp;rsquo;s unclear and I guess subject to interpretation on whether someone can light fibre for their captive use or not when the end product itself does not resell the capacity. Most large projects end up taking NLD and access licenses anyway because they intend to sell excess capacity. Thus networks like Railtel (by Indian Railway), Oil India, Powergrid Corp, etc all take NLD license to have legal ability to light fibre for their own use as well as to resell excess capacity. Industry-wide I hear that private players taking dark fibre and lighting it themselves is absolutely not allowed while for the government. bodies it remains a grey area.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;cloud-and-content-players&#34;&gt;Cloud and content players&lt;/h3&gt;
&lt;p&gt;Modern cloud and content players are major users of dark fibres, especially within metros. Hyperscalars like Amazon AWS, Google Cloud and Microsoft Azure deploy their infra in three datacenters in a given region &amp;amp; these have to be technically connected with dark fibre. There&amp;rsquo;s massive East-West traffic due to replication, high availability &amp;amp; many other reasons. In the majority of markets these companies can procure dark fibre between their datacenters and light it themselves but in India they cannot. In India, it&amp;rsquo;s a known case that they get external license-holding players to light fibre for them. In most of these cases hyperscalars work very closely with those players, they define network topology, hardware, configs etc but ultimately someone else executes it for them. Most of the Cloud players will never take a telecom license (ISP, access, NLD, ILD etc) in India simply because then they would be subject to many of the telecom-related rules and regulations. That brings business, security and many concerns. Take e.g the long over-discussed AGR case. If any of the Cloud players had a license, under older terms their compute, storage (and just anything) revenue would be subject to AGR / license fees. In a way, it&amp;rsquo;s good that Cloud players work well without a license as that keeps things simple. The fact that they cannot light fibre themselves is a drawback of our Indian licensing system and should be fixed. In most other markets including the US, UK, Germany, Singapore etc - lighting of fibre does not need a license.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;status-of-datacenters&#34;&gt;Status of datacenters&lt;/h3&gt;
&lt;p&gt;Over time datacenters have taken an NLD license. List includes but is not limited to NTT Netmagic, Yotta, Ctrls etc. This is mostly because these players have multiple datacenters in a given area, and they want to connect and resell lit services. They can in theory do without NLD by using IP-1 and then reselling dark fibre strands only but that does not scale up, plus their customers who are buying would need to have a license to light the fibre.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;old-and-outdated-ideas-around-regulation&#34;&gt;Old and outdated ideas around regulation&lt;/h3&gt;
&lt;p&gt;Most of these ideas around licensing in the fixed-line market do not make sense anymore, simply because everything runs on fibre and fibre is not a scarce resource. ISP license somewhat makes sense (excluding the AGR part) because there is a requirement of URL filtering, CGNAT logging, etc., but outside of that, it&amp;rsquo;s largely an inflated set of rules. On the access side, the requirement of a license to light fibre simply promotes more rent-seeking behaviour instead of cleaner, competitive and optimised deployments. AGR on fixedline (and probably mobile telephony) also doesn&amp;rsquo;t make sense. In case of fixed line, the network runs on optical fibre which is laid by vendors who pay Rights of Way (RoW) to municipalities, State and central government (whichever road they use). There is taxation in the form of GST in the system on top of RoW. So the AGR on top doesn&amp;rsquo;t make sense as bits are not flowing over any scarce resource. It&amp;rsquo;s largely over privately built infrastructure, for which RoW and GST are already being paid.&lt;/p&gt;
&lt;p&gt;With those thoughts I think my friend needs an access license to connect his homes and his LCO (or ISP who actually runs it) needs a IP-1 license to legally re-sell him dark fibre. 😀&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog, and hence, posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;update---18-mar-2026&#34;&gt;Update - 18 Mar 2026&lt;/h3&gt;
&lt;p&gt;I cannot count how many people by now have told me that new rules are just about to be notified and changes are inevitable. New rules will allow ISP license holders (or folks with UL license with ISP authorization) to be able to sell point to point services. That won&amp;rsquo;t fix the problem completely but greatly reduces it.&lt;/p&gt;
&lt;p&gt;Another point to mention here is that in Nov 2022 &lt;a href=&#34;(https://tele.net.in/dot-amends-scope-of-ip-1-registration-ip-1s-to-share-infrastructure-with-specified-entities/)&#34;&gt;DoT tweaked IP-1 license rules&lt;/a&gt; to allow them to give dark fibre to non-licence holders which are specified by DoT.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Airtel India - Europe routing issues</title>
      <link>https://anuragbhatia.com/post/2026/01/eu-india-routing-issues/</link>
      <pubDate>Thu, 29 Jan 2026 03:45:04 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/01/eu-india-routing-issues/</guid>
      <description>&lt;p&gt;Since &lt;strong&gt;20:08 IST / 14:38 GMT on 28 Jan 2026&lt;/strong&gt;, the latency between Airtel India and Europe has gone up along with significant packet loss.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of shortlist 300+ endpoints from Airtel India with European endpoints:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/eu-india-routing-issues/rtk-eu-airtel.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;traceroutes&#34;&gt;Traceroutes&lt;/h2&gt;
&lt;h3 id=&#34;airtel-haryana---contabo-europe&#34;&gt;Airtel Haryana -&amp;gt; Contabo Europe&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Start: 2026-01-29T03:52:33+0530
HOST: desktop                                                                  Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. AS???    _gateway (172.16.0.1)                                             0.0%    10    0.2   0.2   0.2   0.2   0.0
 2. AS???    10.240.9.204                                                      0.0%    10    6.2   7.7   4.6  17.7   3.7
 3. AS???    172.31.0.155                                                      0.0%    10   12.1   8.4   5.0  12.8   3.2
 4. AS9498   173.168.18.125.dhcp.anaronline.net (125.18.168.173)               0.0%    10    5.1   6.5   5.0   8.0   1.2
 5. AS???    182.79.243.34                                                     0.0%    10  266.6 262.7 259.1 276.3   5.3
 6. AS1299   lax-b22-link.ip.twelve99.net (62.115.162.62)                      0.0%    10  259.4 258.1 256.6 259.9   1.1
 7. AS1299   lax-bb2-link.ip.twelve99.net (62.115.140.156)                    10.0%    10  256.7 257.9 256.6 259.6   1.2
 8. AS1299   dls-b7-link.ip.twelve99.net (62.115.140.247)                     20.0%    10  323.4 324.2 322.6 326.2   1.2
 9. AS1299   atl-b24-link.ip.twelve99.net (62.115.140.32)                      0.0%    10  336.4 336.5 335.4 338.0   0.9
 10. AS1299   atl-bb2-link.ip.twelve99.net (62.115.143.236)                     0.0%    10  323.1 321.7 320.2 323.4   1.0
 11. AS1299   ash-bb2-link.ip.twelve99.net (62.115.137.132)                    40.0%    10  320.9 321.1 320.6 321.7   0.4
 12. AS1299   prs-bb2-link.ip.twelve99.net (62.115.140.106)                     0.0%    10  318.8 318.3 317.2 319.5   0.9
 13. AS1299   laut-b2-link.ip.twelve99.net (62.115.136.185)                     0.0%    10  325.7 326.0 324.3 327.7   1.3
 14. AS1299   contabohubeurope-ic-385701.ip.twelve99-cust.net (213.248.67.11)   0.0%    10  325.8 324.4 322.8 326.4   1.2
 15. AS???    ???                                                              100.0    10    0.0   0.0   0.0   0.0   0.0
 16. AS???    ???                                                              100.0    10    0.0   0.0   0.0   0.0   0.0
 17. AS51167  eu01.anuragbhatia.com (213.199.54.67)                             0.0%    10  323.1 323.5 322.4 324.9   0.9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Reading this trace: This is Ambala &amp;raquo; Airtel MPLS &amp;raquo; Los Angeles Arelion AS1299 handover &amp;gt; Arelion Dallas &amp;gt; Arelion Atlanta &amp;gt; Arelion Ashburn &amp;gt; Arelion Paris &amp;gt; Europe&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;contabo-europe---airtel-haryana-cgnat-ip-terminating-in-saha-ambala-haryana&#34;&gt;Contabo Europe -&amp;gt; Airtel Haryana (CGNAT IP terminating in Saha (Ambala) Haryana):&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Start: 2026-01-29T03:53:51+0530
HOST: eu01.anuragbhatia.com                                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. AS???    10.243.1.101                                                  0.0%    10    0.2   0.3   0.2   0.4   0.1
 2. AS???    10.0.66.2                                                     0.0%    10    0.3   0.3   0.2   0.3   0.0
 3. AS1299   laut-b2-link.ip.twelve99.net (213.248.70.176)                 0.0%    10    2.7   2.8   1.4   4.7   1.0
 4. AS1299   laut-b1-link.ip.twelve99.net (62.115.136.194)                 0.0%    10    3.6   2.7   1.9   3.6   0.6
 5. AS1299   ffm-bb1-link.ip.twelve99.net (62.115.136.146)                 0.0%    10    2.9   3.0   2.9   3.5   0.2
 6. AS1299   mei-b5-link.ip.twelve99.net (62.115.124.59)                   0.0%    10   18.4  18.3  18.2  18.7   0.1
 7. AS1299   sng-b7-link.ip.twelve99.net (62.115.134.229)                  0.0%    10  155.1 155.2 154.9 155.6   0.3
 8. AS1299   sng-b5-link.ip.twelve99.net (62.115.139.1)                   80.0%    10  162.5 162.5 162.5 162.6   0.1
 9. AS1299   bhartiairtel-ic-375944.ip.twelve99-cust.net (62.115.49.157)   0.0%    10  238.1 236.2 233.5 252.4   5.9
 10. AS9498   116.119.44.230                                                0.0%    10  320.7 321.0 320.5 323.2   0.8
 11. AS9498   170.168.18.125.dhcp.anaronline.net (125.18.168.170)           0.0%    10  327.1 328.9 319.4 355.2  13.6
 12. AS???    ???    
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This one is handover to Arelion AS1299 Europe locally &amp;gt; Arelion Frankfurt &amp;gt; Arelion Marseille &amp;raquo; Arelion Singapore &amp;gt; Bharti Airtel AS9498 Singapore handover &amp;raquo;&amp;gt; Airtel MPLS &amp;gt; Haryana&lt;/p&gt;
&lt;p&gt;How to know that it&amp;rsquo;s not just me on both ends - my home connection in Haryana and my server in EU being impacted?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look for average latency to a few dozen Airtel endpoints in India from Contabo, Hetzner, hosting.de:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/eu-india-routing-issues/EU-Airtel-India-latency.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;impact-from-bgp-routing-table&#34;&gt;Impact from BGP routing table&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s compare Airtel AS9498 routes inside Arelion AS1299 table with BGP community tags: 1299:30000 (EU Customers) Vs 1299:37000 (APAC customers) based on routes visible from various downstreams of AS1299 across public route collectors (since Arelion&amp;rsquo;s own direct feed does not include the BGP community tag):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/eu-india-routing-issues/Arelion-Airtel-learning.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Within a few hours Arelion&amp;rsquo;s learning of Airtel AS9498 routes in Europe (1299:30000) went down by 7000 routes and APAC (1299:37000) went up by over 6000 routes.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;what-about-other-indian-telcos&#34;&gt;What about other Indian telcos?&lt;/h3&gt;
&lt;p&gt;There seems some minor impact on Tata Comm but it is largely contained. Average latency from EU - Tata Comm Indian endpoint went up from 164ms to 180ms. In the case of Jio, it also shows the same behaviour as usual. However, on Jio, there&amp;rsquo;s a visible jump in latency every late evening for months, and this jump seems to follow the same pattern.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/eu-india-routing-issues/EU-TataComm.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Trace from EU to Tata Comm AS4755 Delhi confirms largely normal routing.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Start: 2026-01-29T04:16:29+0530
HOST: eu01.anuragbhatia.com                                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. AS???    10.243.1.101                                                  0.0%    10    0.2   0.2   0.2   0.3   0.0
 2. AS???    10.0.66.2                                                     0.0%    10    0.2   0.2   0.2   0.3   0.0
 3. AS1299   laut-b1-link.ip.twelve99.net (62.115.45.148)                  0.0%    10    2.5   3.1   1.6   4.7   1.0
 4. AS1299   ffm-bb1-link.ip.twelve99.net (62.115.136.146)                 0.0%    10    3.2   3.1   2.9   3.4   0.2
 5. AS1299   ffm-b5-link.ip.twelve99.net (62.115.136.213)                  0.0%    10    3.5   3.2   3.0   3.5   0.1
 6. AS1299   tata-ic-378325.ip.twelve99-cust.net (213.248.78.41)          60.0%    10    4.3   4.3   3.9   4.7   0.3
 7. AS6453   if-bundle-56-2.qcore2.pvu-paris.as6453.net (80.231.245.40)   60.0%    10   16.1  16.0  15.6  16.4   0.4
 8. AS6453   if-bundle-12-2.qcore1.pvu-paris.as6453.net (80.231.245.12)    0.0%    10   15.4  15.8  15.4  16.8   0.4
 9. AS6453   if-bundle-22-3.qcore1.pye-paris.as6453.net (80.231.154.200)  50.0%    10   15.7  15.9  15.6  16.3   0.3
 10. AS6453   if-bundle-2-2.qcore2.pye-paris.as6453.net (80.231.154.27)     0.0%    10   15.5  15.9  15.4  16.4   0.4
 11. AS6453   if-bundle-13-2.qcore1.ldn-london.as6453.net (80.231.196.37)  90.0%    10   20.5  20.5  20.5  20.5   0.0
 12. AS6453   195.219.213.129                                              70.0%    10   15.4  15.5  15.4  15.7   0.2
 13. AS6453   80.231.131.77                                                 0.0%    10  123.0 125.2 123.0 144.3   6.7
 14. AS???    ???                                                          100.0    10    0.0   0.0   0.0   0.0   0.0
 15. AS4755   115.114.73.212.static-delhi.vsnl.net.in (115.114.73.212)      0.0%    10  158.5 158.6 158.5 158.7   0.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With hope that your packets won&amp;rsquo;t be spread at the bottom of the ocean, it&amp;rsquo;s time for me to end this post and get back to work. 😀&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;update---29-jan-2026--1714-ist&#34;&gt;Update - 29 Jan 2026 / 17:14 IST&lt;/h3&gt;
&lt;p&gt;A friend from the industry has confirmed that &lt;a href=&#34;https://www.submarinenetworks.com/en/systems/asia-europe-africa/mena&#34;&gt;MENA cable&lt;/a&gt; has went down around the same time.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;update---04-mar-2026&#34;&gt;Update - 04 Mar 2026&lt;/h3&gt;
&lt;p&gt;Significant traffic routing between India and EU seems direct now.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;update---13-mar-2026&#34;&gt;Update - 13 Mar 2026&lt;/h3&gt;
&lt;p&gt;MENA Cable has been fixed and connectivity between India and EU is back online. Since evening there&amp;rsquo;s a visible further drop in average latency between India and EU over the Airtel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/eu-india-routing-issues/India-EU-Airtel-latency.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>When BGP lies, the internet believes!</title>
      <link>https://anuragbhatia.com/post/2026/01/when-bgp-lies/</link>
      <pubDate>Wed, 21 Jan 2026 00:02:42 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/01/when-bgp-lies/</guid>
      <description>&lt;p&gt;Earlier in the day, I came across Liberty Global (AS6830) seemingly originating several Vodafone Romania (AS12302) prefixes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/when-bgp-lies/as6839_1.png&#34; alt=&#34;&#34;&gt;
Source: &lt;a href=&#34;https://bgp.he.net/AS6830#_prefixes&#34;&gt;https://bgp.he.net/AS6830#_prefixes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is highly unusual because AS6830 is a large transit-free network. I have seen some transit-free networks leaking routes, but originating a large number of prefixes is not common. It has massive stakes from Belgium-based Telenet to Virgin Media, etc. To verify if they are actually originating these or not, let&amp;rsquo;s check from &lt;a href=&#34;https://lg.aorta.net&#34;&gt;their looking glass&lt;/a&gt; for one of the prefixes here: &lt;strong&gt;46.97.104.0/24&lt;/strong&gt; via their PoP at &lt;strong&gt;Interxion FRA6 Frankfurt&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/when-bgp-lies/as6839_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;This clearly shows that their own router is learning it from Vodafone C&amp;amp;W AS1273 and not holding the fake route. The origin is AS12302 &lt;em&gt;(Vodafone Romania)&lt;/em&gt;. So why does that prefix appear in bgp.he.net?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at real-time lookup from &lt;a href=&#34;https://bgp.he.net/super-lg/#46.97.104.0/24?tob=none&amp;amp;mt=include&amp;amp;ma=6830&amp;amp;els=exact&#34;&gt;super-lg&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/01/when-bgp-lies/superlg.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Reading this AS_PATH: &lt;strong&gt;35505 44682 8751 6830&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So &lt;a href=&#34;https://www.ris.ripe.net/peerlist/rrc22.shtml&#34;&gt;RIPE RIS RRC22&lt;/a&gt; in Bucharest, Romania &amp;ldquo;learns&amp;rdquo; this from AS35505 &lt;em&gt;(Pronet Solutii IT SRL)&lt;/em&gt; which learns it from AS44682 &lt;em&gt;(SIL-MIRO COM SRL)&lt;/em&gt; which learns it from AS8751 &lt;em&gt;(MEDIA SAT SRL)&lt;/em&gt; which &amp;ldquo;claims&amp;rdquo; to have learnt it from AS6830. This very much smells like a &amp;ldquo;fake route&amp;rdquo; generated by someone here likely from a route optimiser. From the Liberty Global looking glass, it&amp;rsquo;s clear that AS6830 does not have it. So it has to be either AS8751 or AS44682 or AS35505 having this route in their table. It&amp;rsquo;s hard to verify and be 100% sure who since those three ASNs don&amp;rsquo;t have a looking glass or a RIPE Atlas probe for me to see their routing. Thus &lt;strong&gt;&lt;em&gt;when BGP lies, the internet believes!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog, and hence, posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Opentofu &#43; Tailscale = Bootstrapped DevOps environment with VPN</title>
      <link>https://anuragbhatia.com/post/2026/opentofu-tailscale/</link>
      <pubDate>Sun, 18 Jan 2026 02:58:46 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/opentofu-tailscale/</guid>
      <description>&lt;p&gt;For the last few days, I have been playing with &lt;a href=&#34;https://opentofu.org&#34;&gt;OpenTofu&lt;/a&gt;. For those who may not know, it&amp;rsquo;s a fork of last Terraform as Terraform&amp;rsquo;s license was changed due to IBM&amp;rsquo;s acquisition of Hashicorp and is a Cloud Native Foundation project. It can be used to quickly deploy (and remove) resources from various cloud players.&lt;/p&gt;
&lt;p&gt;Yesterday came across this tweet from Tailscale about tailscale&amp;rsquo;s module for deployment.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Cloud-init can be tough, and we&amp;#39;ve heard all about it. So we built an open-source Terraform module, one that helps provide a more consistent Tailscale experience across AWS, Azure, GCP, and everywhere. No more surprises, OS quirks, or other mysteries: &lt;a href=&#34;https://t.co/vn1ITU7Fgz&#34;&gt;https://t.co/vn1ITU7Fgz&lt;/a&gt; &lt;a href=&#34;https://t.co/stcF6WuiD7&#34;&gt;pic.twitter.com/stcF6WuiD7&lt;/a&gt;&lt;/p&gt;&amp;mdash; Tailscale (@Tailscale) &lt;a href=&#34;https://twitter.com/Tailscale/status/2011924373754597419?ref_src=twsrc%5Etfw&#34;&gt;January 15, 2026&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;It&amp;rsquo;s cool and useful, though I find Cloud init way more useful since for me these tools are more useful for quick testing rather than a permanent production server. The idea of tailscale on devops VMs as they come up is pretty powerful, as it takes care of the private network between these machines, plus underlay doesn&amp;rsquo;t matter, and hence one can use (cheaper) IPv6-only VMs.&lt;/p&gt;
&lt;p&gt;An example of OpenTofu config &lt;em&gt;(which is similar to Terraform)&lt;/em&gt; to deploy three IPv6 only servers on players like Hetzner across Nuremberg, Helsinki, and Ashburn:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;main.tf&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;terraform {
  required_providers {
    hcloud = {
      source  = &amp;#34;hetznercloud/hcloud&amp;#34;
      version = &amp;#34;~&amp;gt; 1.59.0&amp;#34;
    }
  }
}

provider &amp;#34;hcloud&amp;#34; {
  token = var.hcloud_token
}


data &amp;#34;hcloud_ssh_key&amp;#34; &amp;#34;desktop&amp;#34; {
  name = &amp;#34;desktop&amp;#34;
}

data &amp;#34;hcloud_image&amp;#34; &amp;#34;ubuntu&amp;#34; {
  name   = &amp;#34;debian-13&amp;#34;
  most_recent = true
}

resource &amp;#34;hcloud_server&amp;#34; &amp;#34;vms&amp;#34; {
  for_each = var.vms

  name        = each.key
  image       = data.hcloud_image.ubuntu.id
  server_type = each.value.server_type
  location    = each.value.location
  ssh_keys    = [data.hcloud_ssh_key.desktop.id]

  user_data = &amp;lt;&amp;lt;-EOF
    #cloud-config
    package_upgrade: true
    packages:
      - curl
    runcmd:
      - curl -fsSL https://tailscale.com/install.sh | sh
      - tailscale up --authkey=${var.tailscale_authkey} --accept-routes
  EOF

  public_net {
    ipv4_enabled = false
    ipv6_enabled = true
  }

  labels = {
    managed-by = &amp;#34;opentofu&amp;#34;
  }

  lifecycle {
    ignore_changes = [user_data]
  }  
}

output &amp;#34;vm_ips&amp;#34; {
  value = { for k, vm in hcloud_server.vms : k =&amp;gt; vm.ipv6_address }
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;variables.tf&lt;/strong&gt; &lt;em&gt;(to hold non-secret variables)&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;variable &amp;#34;hcloud_token&amp;#34; {
  description = &amp;#34;Hetzner Cloud API Token&amp;#34;
  type        = string
  sensitive   = true
}

variable &amp;#34;vms&amp;#34; {
  description = &amp;#34;Map of VMs with locations&amp;#34;
  type = map(object({
    location    = string
    server_type = optional(string, &amp;#34;cx23&amp;#34;)
  }))
  default = {
    devops01 = { location = &amp;#34;nbg1&amp;#34; }
    devops02 = { location = &amp;#34;ash&amp;#34;, server_type = &amp;#34;cpx11&amp;#34; }
    devops03 = { location = &amp;#34;hel1&amp;#34; }
  }
}

variable &amp;#34;tailscale_authkey&amp;#34; {
  description = &amp;#34;Tailscale Auth key&amp;#34;
  type        = string
  sensitive   = true
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;terraform.tfvars&lt;/strong&gt; &lt;em&gt;(to hold secret variables)&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hcloud_token = &amp;#34;XXX&amp;#34;
tailscale_authkey = &amp;#34;tskey-auth-XXXXXX&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;triggering-machines-with-vpn-built-in&#34;&gt;Triggering machines (with VPN built in)&lt;/h3&gt;
&lt;p&gt;Initiating (to install providers, initiate backend etc)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;anurag@desktop ~/R/P/c/a/test (main)&amp;gt; tofu init

...

anurag@desktop ~/R/P/c/a/test (main)&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the deployment!&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;anurag@desktop ~/R/P/c/a/test (main)&amp;gt; tofu apply
data.hcloud_image.ubuntu: Reading...
data.hcloud_ssh_key.desktop: Reading...
data.hcloud_ssh_key.desktop: Read complete after 0s [name=desktop]
data.hcloud_image.ubuntu: Read complete after 0s [name=debian-13]

OpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with
the following symbols:
  + create

OpenTofu will perform the following actions:

  # hcloud_server.vms[&amp;#34;devops01&amp;#34;] will be created
  + resource &amp;#34;hcloud_server&amp;#34; &amp;#34;vms&amp;#34; {
      + allow_deprecated_images    = false
      + backup_window              = (known after apply)
      + backups                    = false
      + datacenter                 = (known after apply)
      + delete_protection          = false
      + firewall_ids               = (known after apply)
      + id                         = (known after apply)
      + ignore_remote_firewall_ids = false
      + image                      = &amp;#34;310554929&amp;#34;
...
...

Plan: 3 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + vm_ips = {
      + devops01 = (known after apply)
      + devops02 = (known after apply)
      + devops03 = (known after apply)
    }

Do you want to perform these actions?
  OpenTofu will perform the actions described above.
  Only &amp;#39;yes&amp;#39; will be accepted to approve.

  Enter a value: yes

hcloud_server.vms[&amp;#34;devops02&amp;#34;]: Creating...
hcloud_server.vms[&amp;#34;devops01&amp;#34;]: Creating...
hcloud_server.vms[&amp;#34;devops03&amp;#34;]: Creating...
hcloud_server.vms[&amp;#34;devops01&amp;#34;]: Still creating... [10s elapsed]
hcloud_server.vms[&amp;#34;devops03&amp;#34;]: Still creating... [10s elapsed]
hcloud_server.vms[&amp;#34;devops02&amp;#34;]: Still creating... [10s elapsed]
hcloud_server.vms[&amp;#34;devops01&amp;#34;]: Creation complete after 19s [id=117722922]
hcloud_server.vms[&amp;#34;devops02&amp;#34;]: Still creating... [20s elapsed]
hcloud_server.vms[&amp;#34;devops03&amp;#34;]: Still creating... [20s elapsed]
hcloud_server.vms[&amp;#34;devops02&amp;#34;]: Creation complete after 26s [id=117722920]
hcloud_server.vms[&amp;#34;devops03&amp;#34;]: Still creating... [30s elapsed]
hcloud_server.vms[&amp;#34;devops03&amp;#34;]: Creation complete after 35s [id=117722921]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Outputs:

vm_ips = {
  &amp;#34;devops01&amp;#34; = &amp;#34;2a01:4f8:1c1f:88df::1&amp;#34;
  &amp;#34;devops02&amp;#34; = &amp;#34;2a01:4ff:f0:7df7::1&amp;#34;
  &amp;#34;devops03&amp;#34; = &amp;#34;2a01:4f9:c013:f6e0::1&amp;#34;
}
anurag@desktop ~/R/P/c/a/test (main)&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;In the Hetzner console for this project, three VMs appear:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/opentofu-tailscale/hetzner-vms.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h4 id=&#34;reaching-devops01---devops02&#34;&gt;Reaching devops01 -&amp;gt; devops02&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@devops01:~# tailscale ping devops02
pong from devops02 (100.68.146.42) via [2a01:4ff:f0:7df7::1]:41641 in 111ms
root@devops01:~# 

root@devops01:~# ping -c 5 devops02
PING devops02.tail362a2.ts.net (100.116.50.72) 56(84) bytes of data.
64 bytes from devops02.tail362a2.ts.net (100.116.50.72): icmp_seq=1 ttl=64 time=106 ms
64 bytes from devops02.tail362a2.ts.net (100.116.50.72): icmp_seq=2 ttl=64 time=106 ms
64 bytes from devops02.tail362a2.ts.net (100.116.50.72): icmp_seq=3 ttl=64 time=106 ms
64 bytes from devops02.tail362a2.ts.net (100.116.50.72): icmp_seq=4 ttl=64 time=106 ms
64 bytes from devops02.tail362a2.ts.net (100.116.50.72): icmp_seq=5 ttl=64 time=106 ms

--- devops02.tail362a2.ts.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 105.735/106.012/106.243/0.197 ms
root@devops01:~# 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It can reach devops02 over IPv6 transport.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>NCMC design and technical limitations</title>
      <link>https://anuragbhatia.com/post/2026/ncmc-design-and-limitations/</link>
      <pubDate>Sun, 04 Jan 2026 00:16:00 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2026/ncmc-design-and-limitations/</guid>
      <description>&lt;p&gt;I was in Mumbai a few months ago for the Equinix India Peering forum. The event happened to be very near the airport &amp;amp; I found that the airport, conference venue, hotel, and a few other locations I was visiting were all near the newly built Mumbai Line 3 (Aqua Line). To save on hassle with regular tickets, I went for an NCMC (National Common Mobility Card). Most people travelling in the Delhi metro would be aware of it by now, thanks to a bit of marketing push inside the metro train with announcements. Mumbai line 3 has a tie-up with SBI for the card, and thus, I got the SBI card. Ended up using it in Mumbai, Delhi and Chennai over the last few months.&lt;/p&gt;
&lt;p&gt;Lately, I have been reading about way NCMC works, the limitations of the Indian NCMC design compared to other mass transit systems. In many countries, mass transit systems simply use MasterCard/Visa/Apple Pay tap and charge directly from the respective card (credit/debit card, etc.), like the London tube, Stockholm metro, HK airport express, Singapore, etc. Indian deployment is bit different.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;indian-ncmc-offline-wallet-concept&#34;&gt;Indian NCMC offline wallet concept&lt;/h3&gt;
&lt;p&gt;The whole idea of NCMC is to have a single card which can make payment for public transport, including metro, buses etc across the country digitally. It has to be fast and reliable, and this is where the whole tech differs from systems like UPI or Visa/MasterCard/Rupay POS payments. In case of UPI as well as credit/debit card payments on POS machines - entire transaction runs online. Money goes from the person paying the amount to the receiver as part of a settlement facilitated by NPCI. I don’t need to go in detailed steps involved there, but the key idea is that there’s an active involvement of 1) Payer’s APP 2) Payer’s bank 3) Receiver’s PSP 4) Receiver’s bank 5) NPCI UPI switch, etc. All these have to work and most important - internet has to work. 😀&lt;/p&gt;
&lt;p&gt;All this largely works well for casual payments across the vendors, but not for transit payments, especially at metro stations. It easily takes 2-3 seconds in best case scenario for these online payments, which can result in a massive queue at the metro station gate, besides the risk of it not working at all if “the internet goes down” or the app freezes and whatnot. To deal with these issues, most of the mass transit systems work in hybrid mode, where the money is collected locally offline, and details of such transactions are uploaded in bulk transactions (&lt;em&gt;which, if delayed, do not cause any major issue&lt;/em&gt;). A regular Delhi (or any other) metro card follows that. When money is added to the card, it is literally added to the card via an NFC operation with cryptography in place. One can add money to that card online but it won’t reflect unless a sync operation is performed at the metro station where online balance is literally written to the card. While there is of course UPI support where tickets can be bought online using UPI &amp;amp; processed by the gate via QR code but anyone who has used that would know it’s very slow. There has been some development at the UPI front with UPI Lite X supporting local on-device wallet with the option of offline transaction, but yet to see it in action. NCMC is much ahead compared to UPI Lite X for now.&lt;/p&gt;
&lt;p&gt;NPCI seems to have taken these same concepts of offline wallet into a rupay card. So one can have a prepaid/debit/credit Rupay card from any (supported) bank and can request the creation of a “service area” in the card, and then an offline wallet balance can be stored in that service area. So while this ensures there remains a single card for transit across India &lt;em&gt;(which I personally find very useful)&lt;/em&gt; but it’s not a simple &lt;em&gt;“you can use your Rupay card to tap and pay”&lt;/em&gt; concept that exists in some countries, etc. To pay for transit, existing debit/credit card one must have support on the card itself, the bank, metro station (to create a service area). That’s quite a lot of moving parts and feels a bit fragile. Adding insulting to injury - NCMC is often markted as card which can pay outside of transit systems as well on the POS machines. Credit/Debit could anyway do that but this projection is often made for the prepaid cards &amp;amp; all this adds to chaos KYC &amp;amp; extra steps.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;direct-use-of-visamastercardapple-pay&#34;&gt;Direct use of Visa/MasterCard/Apple Pay&lt;/h3&gt;
&lt;p&gt;While the Indian system doesn’t support Visa/MasterCard/Apple Pay for transit payments and rightfully so as the early days of Russia-Ukriane conflict have taught us, with Visa/Mastercard &lt;a href=&#34;https://www.reuters.com/business/finance/visa-suspends-operations-russia-over-ukraine-invasion-2022-03-05/&#34;&gt;suspending their operations in Russia&lt;/a&gt;, besides the high MDR rates. But concept-wise, these implementation are interesting. No special service account, no special permissions - just directly tap the card &amp;amp; go. And ofcourse they are not processing these payments in real time either (&lt;em&gt;same latency/uptime/performance challenge&lt;/em&gt;). What they do instead is that their system records each tap, and at the end of the day they do a batch settlement with the card issuer. The fun part implementation comes in how they detect fraud. Imagine someone tapping a debit card with no balance in a bank account or a credit card with no credit limit - they would let such a card pass initially, but once the system detects it during the batch settlement, they will simply block it and upload the blocked card data in batch operation across all terminals. Thus frauds can happen, but is largely contained. Unsure why NPCI didn’t go for a similar design with Rupay cards.&lt;/p&gt;
&lt;br &gt;
&lt;h3 id=&#34;ncmc-is-the-default-new-card&#34;&gt;NCMC is the default new card&lt;/h3&gt;
&lt;p&gt;Due to the “service account creation” process, use of Rupay debit/credit didn’t really picked up at metro stations, but prepaid NCMC with pre-created service area has become de-facto for the newly issued cards. Logically, that makes sense as that removes the metro operator from payment handling &amp;amp; puts an RBI authorized full fledged bank or payments bank to deal with the balance money. Delhi Metro went with Paytm initially and later moved to Airtel NCMC as RBI imposed restrictions on Paytm. Mumbai metro went for SBI, and many state transport systems did their own partership for issuing these cards.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;offline-balance-limitations&#34;&gt;Offline balance limitations&lt;/h3&gt;
&lt;p&gt;Since these NCMCs are holding an offline balance, there are some interesting and weird limitations in the way they work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Similar to older non-NCMC metro cards, these can be recharged online but a “sync” operation has to be performed either by metro station staff or newly installed machines or with the limited support in the Android app (&lt;em&gt;Apple’s NFC is still closed &amp;amp; yet not supported&lt;/em&gt;). This adds a bottleneck at busy stations.&lt;/li&gt;
&lt;li&gt;If a card is lost, the bank either cannot refund the balance at all or can only do so after the card actually expires. This is because the card has an offline balance &amp;amp; there’s no way for the bank to claim &amp;amp; credit it back unless the card cryptographically expires.&lt;/li&gt;
&lt;li&gt;For a credit/debit card, this is an entirely different account unrelated to their primary “online” balance. Money can be moved from an online balance to an offline balance, but again would require a sync operation by an NFC terminal.&lt;/li&gt;
&lt;li&gt;The apps/websites connected to an NCMC gets updated with a delay of days as the payments are processed.&lt;/li&gt;
&lt;li&gt;While the app/websites take time to update, card themselves hold recent transactions locally. I noticed this when I paid via NCMC in Chennai for a bus to the airport, that same transaction was visible at the DMRC terminal in Delhi metro, but not one the bank portal for the next few days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=o6l7tApYbag&amp;amp;feature=youtu.be&#34;&gt;This talk&lt;/a&gt; from Sandesh Kunder (NCPI) at Global Fintech Fest 23 covers the concept as well as ideas from NPCI’s point of view.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;fragile-system&#34;&gt;Fragile system&lt;/h3&gt;
&lt;p&gt;While there is a conceptual idea of full compatibility across NCMC - cards, terminals, etc., it’s not smooth. E.g initially I got “ECH_0007” error on DMRC terminals when doing a sync operation on the Mumbai metro-issued SBI card. It’s hard to know what went wrong since so many people were involved. Thus I could not move &amp;ldquo;online balance&amp;rdquo; which I paid via an UPI app to the card&amp;rsquo;s offline balance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2026/ncmc-design-and-limitations/ncnc-sync-error.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;I think at some point, NPCI will ditch this overly complicated system and will bring NCMC version 2 with a direct charge option for the Rupay card. That, along with a mix of tech like UPI Lite X with NFC, will act as a reliable, fast option for transit payments. Remember there are over 600 million rupay debit cards alone. Making them directly compatible while keeping single &amp;ldquo;online&amp;rdquo; balance which can be settled in batch operations.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Understanding multiple routes from same ASN</title>
      <link>https://anuragbhatia.com/post/2025/12/understanding-multiple-routes-from-same-asn/</link>
      <pubDate>Tue, 02 Dec 2025 00:24:58 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/12/understanding-multiple-routes-from-same-asn/</guid>
      <description>&lt;p&gt;A while back bgp.he.net added the feature of a live route propagation graph for a given prefix. Besides being near real-time, it is also specific to a prefix, e.g let&amp;rsquo;s look up for 2401:4900:87f0::/44 (Airtel mobility - 5G prefix):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/12/understanding-multiple-routes-from-same-asn/as45609.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://bgp.he.net/net/2401:4900:87f0::/44#_graph&#34;&gt;https://bgp.he.net/net/2401:4900:87f0::/44#_graph&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What sometimes confuses people is why there are multiple paths from a given ASN towards the originator ASN. Many people assume multiple paths exist for different prefixes only, and that is not true. Take e.g in the above route propagation graph AS3356 has a direct route to AS9498 as well as via AS2914, AS6939, AS6453, etc. And this kind of multiple paths is not limited just to AS3356 (&lt;em&gt;which is run by three companies as of now - Lumen in North America, Colt in the EU and Cirion in South America&lt;/em&gt;). Notice GTT AS3257 is also learning it via Cogent AS174 as well as Tata Comm AS6453. Which is actually &amp;ldquo;best path&amp;rdquo; as determined by the BGP? Quick short answer: Both!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-does-this-happen&#34;&gt;Why does this happen?&lt;/h2&gt;
&lt;p&gt;This kind of routing often happens when the other side is a large network with multiple routers doing eBGP with multiple other larger networks &amp;amp; not anywhere in the upstream path. Let&amp;rsquo;s take the GTT AS3257 example first before coming to AS3356 case (as AS3356 has something more to it as well, which I will cover after this one).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s query 2401:4900:87f0::/44 on Hurricane Electric&amp;rsquo;s super-lg and restrict output with AS3257 in the path - &lt;a href=&#34;https://bgp.he.net/super-lg/#2401:4900:87f0::/44?tob=brief&amp;amp;mt=include&amp;amp;ma=3257&amp;amp;els=exact&#34;&gt;output here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/12/understanding-multiple-routes-from-same-asn/gtt-lookup.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Path 2 shows GTT AS3257 learning it from Cogent AS174 but path 4 shows it&amp;rsquo;s learning it from Tata Comm AS6453. Both of these are &lt;strong&gt;&amp;ldquo;best paths&amp;rdquo;&lt;/strong&gt; as determined by BGP in the respective routers that feed the routes. Path 2 via Cogent is being fed into route-views.chicago while path 4 is being fed into RIPE RIS RRC12 (DE-CIX, Frankfurt).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the &lt;a href=&#34;https://www.as3257.net/lg/&#34;&gt;GTT looking glass&lt;/a&gt; and trace to this route in the Chicago and Frankfurt router:&lt;/p&gt;
&lt;h3 id=&#34;gtt-chicago--2401490087f01&#34;&gt;GTT Chicago &amp;gt; 2401:4900:87f0::1&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IPv6 traceroute to 2401:4900:87f0::1
HOST: cr1-chi1-re1                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 2001:668:0:2:ffff:0:d5c8:7ff  0.0%     5    0.5   1.2   0.5   1.9   0.6 &amp;lt;- GTT AS3257
 2. 2001:550:3::18d              40.0%     5    2.7   1.9   1.3   2.7   0.7 &amp;lt;- Cogent AS174
 3. 2001:550:0:1000::9a36:2eb1   40.0%     5    1.2   1.3   1.2   1.6   0.3
 4. ???                          100.0     5    0.0   0.0   0.0   0.0   0.0
 5. 2001:550:0:1000::9a36:5f6d   80.0%     5   31.9  31.9  31.9  31.9   0.0
 6. 2001:550:0:1000::9a36:5a15   80.0%     5   29.1  29.1  29.1  29.1   0.0
 7. 2001:550:0:1000::9a36:a3fa   60.0%     5   38.5  50.8  38.5  63.0  17.3
 8. 2001:550:0:1000::9a36:59a     0.0%     5  181.7 181.5 180.7 183.1   1.0
 9. 2001:550:0:1000::9a36:a8fd    0.0%     5  188.2 188.4 187.9 189.8   0.8
 10. 2001:550:0:1000::9a36:a902    0.0%     4  188.0 188.3 187.7 189.6   0.8
 11. 2001:550:0:1000::9a36:1996    0.0%     4  222.2 204.6 187.3 222.2  19.0
 12. 2001:550:0:1000::9a36:5e71   75.0%     4  182.2 182.2 182.2 182.2   0.0
 13. static-36-2-68-128.xxxxx.svi  0.0%     4  182.7 182.7 181.9 184.2   1.0
 14. 2404:a800::106                0.0%     4  280.8 270.9 266.9 280.8   6.6
 15. 2404:a800:1a00:800::72        0.0%     4  262.1 263.2 262.0 265.1   1.4
 16. ???                          100.0     4    0.0   0.0   0.0   0.0   0.0
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3 id=&#34;gtt-frankfurt--2401490087f01&#34;&gt;GTT Frankfurt &amp;gt; 2401:4900:87f0::1&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IPv6 traceroute to 2401:4900:87f0::1
HOST: cr10-fra2-re0               Loss%   Snt   Last   Avg  Best  Wrst StDev
1. 2001:668:0:2:ffff:0:8d88:6be  0.0%     5    1.3  20.2   1.3  89.5  38.8 &amp;lt;- GTT AS3257
2. 2001:668:0:3:ffff:0:9a0e:9aa  0.0%     5    1.1   1.1   1.0   1.2   0.1 &amp;lt;- GTT AS3257
3. 2a01:3e0:ff20::110           80.0%     5    7.3   7.3   7.3   7.3   0.0 &amp;lt;- Tata Comm AS6453
4. 2a01:3e0:ff20:110::3         80.0%     5    6.8   6.8   6.8   6.8   0.0
5. ???                          100.0     5    0.0   0.0   0.0   0.0   0.0
6. ???                          100.0     5    0.0   0.0   0.0   0.0   0.0
7. 2a01:3e0:3900::48             0.0%     5   15.6  15.7  15.5  16.0   0.3
8. 2a01:3e0:3900::17            80.0%     5  230.8 230.8 230.8 230.8   0.0
9. 2405:2000:d00:100::14         0.0%     5  231.1 231.1 230.9 231.3   0.1
10. 2001:5a0:2300:200::d2         0.0%     5  129.6 129.4 129.2 129.6   0.2
11. 2404:a800::106                0.0%     4  160.6 162.8 160.3 169.7   4.6
12. 2404:a800:1a00:800::72        0.0%     4  162.3 162.3 162.2 162.4   0.1
13. ???                          100.0     4    0.0   0.0   0.0   0.0   0.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Essentially, what is happening here is that for the GTT Chicago route via Cogent AS174 became the best path, while for GTT&amp;rsquo;s router in Frankfurt, the route via Tata Comm AS6453 became the best path.&lt;/p&gt;
&lt;p&gt;Revisiting the BGP route selection algorithm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weight - Cisco specific, higher weight wins&lt;/li&gt;
&lt;li&gt;Local preference, higher localpref wins&lt;/li&gt;
&lt;li&gt;Locally Originated wins (over externally originated)&lt;/li&gt;
&lt;li&gt;AS_Path - Shorter AS_PATH wins&lt;/li&gt;
&lt;li&gt;Origin code preference i&amp;gt;e&amp;gt;? - Not common these days&lt;/li&gt;
&lt;li&gt;MED, low MED wins (used in multiple sessions across the same set of ASNs)&lt;/li&gt;
&lt;li&gt;eBGP wins over iBGP (enables hot potato)&lt;/li&gt;
&lt;li&gt;Lowest IGP metric to next-hop&lt;/li&gt;
&lt;li&gt;Oldest route&lt;/li&gt;
&lt;li&gt;Lowest router-id&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So if weight is different, the higher weight wins; if weight is the same, localpref is matched etc. In this case #1, #2, #3, #4, #5, #6 and #7 are likely all the same as far as I can think. So, deal breaker becomes #8 which is the lowest IGP metric to the next-hop. If e.g for this specific router in Chicago, the IGP metric is lower to the router connected to Cogent vs. Tata Comm it will prefer Cogent and vice versa in Frankfurt. If the IGP metric is the same and if both Cogent &amp;amp; Tata Comm are on the same set of devices, then the next one #9, the oldest route will take over. It could be a case that the Chicago router first learnt this route from Cogent via the Frankfurt router learnt it from Tata Comm and hence the case.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 id=&#34;what-about-multiple-paths-to-as3356&#34;&gt;What about multiple paths to AS3356?&lt;/h4&gt;
&lt;p&gt;AS3356 is a rather interesting case because a direct path exists in this case as visible in the route propagation chart. So based on BGP route selection #4, the shortest AS_PATH wins should take over if everything else is the same.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s query 2401:4900:87f0::/44 again and filter all routes with 3356 in the path - &lt;a href=&#34;https://bgp.he.net/super-lg/#2401:4900:87f0::/44?tob=detail&amp;amp;mt=include&amp;amp;ma=3356&amp;amp;els=exact&#34;&gt;output here&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/12/understanding-multiple-routes-from-same-asn/as3356-lookup.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s compare a direct path vs an indirect path:&lt;/p&gt;
&lt;p&gt;2401:4900:87f0::/44 - 38008 3356 9498 45609 fed via rrc25.ripe.net (RIPE RRC in Amsterdam)&lt;/p&gt;
&lt;p&gt;This has BGP communities:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3356:4 - APAC
3356:666 - Peer route
3356:703 - Singapore
3356:2172 - SNG3 - Singapore3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So this is a &amp;ldquo;peer route&amp;rdquo; in Singapore.&lt;/p&gt;
&lt;p&gt;Vs&lt;/p&gt;
&lt;p&gt;2401:4900:87f0::/44 - 209 3356 174 9498 45609&lt;/p&gt;
&lt;p&gt;This has the following communities:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3356:3 - North America
3356:575 - USA
3356:666 - Peer route
3356:2003 - LAX1 - Los Angeles
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So both are &amp;ldquo;peer routes&amp;rdquo; - one learnt from a peer in Singapore (short AS_PATH) while the other learnt from a peer in the US (longer AS_PATH). The localpref has to be the same in these cases because if localpref is higher on any route, AS_PATH would not be compared at all and that path would become the best path. To find what is happening, let&amp;rsquo;s query the Los Angeles router of AS3356 via &lt;a href=&#34;https://lookingglass.centurylink.com/&#34;&gt;their looking glass&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Output is &lt;a href=&#34;https://cdn.anuragbhatia.com/web/post/2025/12/understanding-multiple-routes-from-same-asn/as3356-lookup-los.txt&#34;&gt;here&lt;/a&gt;. Basically, the Singapore route is not there at all. Hence it seems like a special setup where AS3356 peers with AS9498 in Singapore, keeps the route local for APAC and does not export them in US/EU PoPs, etc. The same is reflected by Asia Vs non-Asia downstreams of AS3356 when they feed routes to public collectors and hence multiple paths. Since there isn&amp;rsquo;t a peering in the US/EU with AS9498, they would pick one of the few upstreams of AS9498, depending on their lowest IGP metric cost (or the oldest route if IGP metric cost is the same).&lt;/p&gt;
&lt;p&gt;BGP is fascinating!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This is my personal blog, and hence, posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mapping Starlink&#39;s global IP transit providers</title>
      <link>https://anuragbhatia.com/post/2025/10/starlink-global-interconnection/</link>
      <pubDate>Fri, 24 Oct 2025 00:48:35 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/10/starlink-global-interconnection/</guid>
      <description>&lt;p&gt;A while back, I posted about &lt;a href=&#34;https://anuragbhatia.com/post/2025/08/starlink-upstreams-in-india/&#34;&gt;Starlink&amp;rsquo;s Indian upstream&lt;/a&gt;. It&amp;rsquo;s interesting that now their prefixes are not visible behind routed via Telstra - AS4637 anymore, but it seems like they are testing Mumbai-based Microscan - AS55352.&lt;/p&gt;
&lt;p&gt;I have always been curious about how they interconnect globally, particularly with which IP transit providers. To find out, I have to establish a relation between their GeoIP data and their BGP announcements globally. They have 2161 IP pools in the GeoIP sheet while originating an aggregate of 1109 prefixes from Starlink - AS14593.&lt;/p&gt;
&lt;p&gt;Hurricane Electric&amp;rsquo;s &lt;a href=&#34;https://bgp.he.net/AS14593#_graph4&#34;&gt;Graph_v4 for AS14593&lt;/a&gt; shows a rather complicated graph because they have different upstreams at different locations.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/starlink-global-interconnection/startlink-upstream-bgp-tools.png&#34; width=&#34;700&#34; height=&#34;120&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s the logic I can follow to map:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Their GeoIP is either /24 or smaller than /24. I created a unique pair for the aggregate /24-city pair and did a lookup only for that. E.g for Luxembourg they have 4 x /27 (87.251.24.0/27, 87.251.24.32/27, 87.251.24.192/27 and 87.251.24.224/27) coming from same /24 (87.251.24.0/24). That way, I match this with the BGP table only once and not 4 times to get the same result.&lt;/li&gt;
&lt;li&gt;Extract all routes from the global routing table dump I carry in my ClickHouse table for AS14593.&lt;/li&gt;
&lt;li&gt;Get a subset of routes which are visible behind known transit-free tier 1 networks (to filter out announcements via peering)&lt;/li&gt;
&lt;li&gt;Break BGP table prefix,as_path mappings to /24 ASNs - AS_PATH mappings to easily map the data.&lt;/li&gt;
&lt;li&gt;Look for ASN on the left side of AS_PATH as visible from various transit-free tier 1 networks. E.g. a few lines of output for 87.251.24.0/24, I get:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[28624,61568,2914,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[262462,12956,1299,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[20253,6762,2914,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[54309,1299,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[398465,3257,1299,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[49544,2914,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[13786,2914,14593]&amp;#34;
&amp;#34;87.251.24.0/24&amp;#34;,&amp;#34;[199524,3356,2914,14593]&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This means AS2914 and AS1299 are the upstreams here. This is just an example. Actual output has 1005 routes, and I cannot post that long list here.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;result&#34;&gt;Result&lt;/h3&gt;
&lt;br /&gt;
&lt;p&gt;Since the number of transits is smaller than the number of locations, I mapped each location to a given transit provider. Here&amp;rsquo;s what it looks like:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ASN&lt;/th&gt;
          &lt;th&gt;AS Name&lt;/th&gt;
          &lt;th&gt;Upstream for following locations&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;AS10075&lt;/td&gt;
          &lt;td&gt;Fiber@Home Global Limited&lt;/td&gt;
          &lt;td&gt;Dhaka (Bangladesh)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS12956&lt;/td&gt;
          &lt;td&gt;TELXIUS Cable&lt;/td&gt;
          &lt;td&gt;Buenos Aires (Argentina), Chicago (US), Dallas (US), Doha (Qatar), Guatemala City (Guatemala), Kuujjuaq (Canada), Lima (Peru), Managua (Nicaragua), Mexico City (Mexico), Montevideo (Uruguay), Panama City (Panama), Paris (France), Quito (Ecuador), San Jose (Costa Rica), San Salvador (El Salvador), Santiago (Chile), Sao Paulo (Brazil), Seattle (US), Stanley (Falkland Islands), Tegucigalpa (Honduras)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS1299&lt;/td&gt;
          &lt;td&gt;Arelion/Telia Carrier&lt;/td&gt;
          &lt;td&gt;Aden (Yemen), Amsterdam (Netherlands), Anchorage (US), Andorra la Vella (Andorra), Ashburn (US), Astana (Kazakhstan), Athens (Greece), Atlanta (US), Baku (Azerbaijan), Bamako (Mali), Basse-Terre (Guadeloupe), Beirut (Lebanon), Belgrade (Serbia), Berlin (Germany), Bratislava (Slovakia), Brucejack (Canada), Brussels (Belgium), Bucharest (Romania), Budapest (Hungary), Calgary (Canada), Cape Canaveral (US), Charlotte Amalie (U.S. Virgin Islands), Chicago (US), Chisinau (Moldova), Colombo (Sri Lanka), Copenhagen (Denmark), Dallas (US), Denver (US), Dhaka (Bangladesh), Doha (Qatar), Dublin (Ireland), Dushanbe (Tajikistan), Dutch Harbor (US), Fort-de-France (Martinique), Guatemala City (Guatemala), Gustavia (Saint Barthélemy), Helsinki (Finland), Jerusalem (Israel), Kansas City (US), Khartoum (Sudan), Kingston (Jamaica), Kuala Lumpur (Malaysia), Kukes (Albania), Kuujjuaq (Canada), Kyiv (Ukraine), Lisbon (Portugal), Ljubljana (Slovenia), London (United Kingdom), Longyearben (Svalbard, Norway), Luxembourg (Luxembourg), Madrid (Spain), Malé (Maldives), Managua (Nicaragua), Manila (Philippines), Mariehamn (Åland Islands, Finland), Marigot (Saint Martin), Mexico City (Mexico), Miami (US), Minneapolis (US), N&amp;rsquo;Djamena (Chad), Nassau (Bahamas), Nicosia (Cyprus), Nome (US), Oslo (Norway), Panama City (Panama), Paris (France), Philipsburg (Sint Maarten), Phoenix (US), Podgorica (Montenegro), Port-au-Prince (Haiti), Prague (Czech Republic), Praia (Cape Verde), Regina (Canada), Reykjavik (Iceland), Riga (Latvia), Rome (Italy), Roseau (Dominica), Saint John&amp;rsquo;s (Antigua and Barbuda), Saint Peter Port (Guernsey), Salt Lake City (US), San Jose (Costa Rica), San Juan (Puerto Rico), San Salvador (El Salvador), Santo Domingo (Dominican Republic), Sarajevo (Bosnia and Herzegovina), Seattle (US), Singapore (Singapore), Skopje (North Macedonia), Sofia (Bulgaria), Stockholm (Sweden), Tallinn (Estonia), Tbilisi (Georgia), Tegucigalpa (Honduras), Tempe (US), Thimphu (Bhutan), Tirana (Albania), Toronto (Canada), Valletta (Malta), Vancouver (Canada), Vienna (Austria), Vilnius (Lithuania), Warsaw (Poland), Winnipeg (Canada), Yangon (Myanmar), Yerevan (Armenia), Zagreb (Croatia), Zurich (Switzerland)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS137409&lt;/td&gt;
          &lt;td&gt;GSL Networks Pty LTD&lt;/td&gt;
          &lt;td&gt;Adamstown (Pitcairn Islands), Apia (Samoa), Auckland (New Zealand), Avarua District (Cook Islands), Brisbane (Australia), Chicago (US), Christchurch (New Zealand), Colombo (Sri Lanka), Dallas (US), Dhaka (Bangladesh), Dili (Timor-Leste), Doha (Qatar), Funafuti (Tuvalu), Hobart (Australia), Honiara (Solomon Islands), Honolulu (US), Kuala Lumpur (Malaysia), Malé (Maldives), Melbourne (Australia), Nuku&amp;rsquo;alofa (Tonga), Pago Pago (American Samoa), Paris (France), Perth (Australia), Port-Vila (Vanuatu), Seattle (US), Singapore (Singapore), Suva (Fiji), Sydney (Australia), Tarawa (Kiribati), Thimphu (Bhutan), Yangon (Myanmar), Yaren (Nauru)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS13786&lt;/td&gt;
          &lt;td&gt;SEABORN, US&lt;/td&gt;
          &lt;td&gt;Asuncion (Paraguay), Buenos Aires (Argentina), Cayenne (French Guiana), Fortaleza (Brazil), Georgetown (Guyana), Paramaribo (Suriname), Santiago (Chile), Sao Paulo (Brazil)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS21859&lt;/td&gt;
          &lt;td&gt;ZEN-ECN, US&lt;/td&gt;
          &lt;td&gt;Bandar Seri Begawan (Brunei), Hagatna (Guam), Kuala Lumpur (Malaysia), Manila (Philippines), Palikir (Federated States of Micronesia), Saipan (Northern Mariana Islands)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS2516&lt;/td&gt;
          &lt;td&gt;KDDI&lt;/td&gt;
          &lt;td&gt;Chicago (US), Dallas (US), Doha (Qatar), Honolulu (US), Majuro (Marshall Islands), Paris (France), Seattle (US), Seoul (South Korea), Tokyo (Japan), Ulaanbaatar (Mongolia), Yangon (Myanmar)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS267613&lt;/td&gt;
          &lt;td&gt;ELETRONET S.A., BR&lt;/td&gt;
          &lt;td&gt;Brasilia (Brazil), Kuala Lumpur (Malaysia)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS2914&lt;/td&gt;
          &lt;td&gt;NTT&lt;/td&gt;
          &lt;td&gt;London (United Kingdom), Longyearben (Svalbard, Norway), Luxembourg (Luxembourg), Madrid (Spain), Mariehamn (Åland Islands, Finland), Montreal (Canada), New York (US), Oslo (Norway), Paris (France), Prague (Czech Republic), Praia (Cape Verde), Reykjavik (Iceland), Saint Peter Port (Guernsey), Saint-Pierre (Saint Pierre and Miquelon), Seattle (US), Stockholm (Sweden), Toronto (Canada), Vienna (Austria), Warsaw (Poland), Zurich (Switzerland)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS30844&lt;/td&gt;
          &lt;td&gt;LIQUID-AS, GB&lt;/td&gt;
          &lt;td&gt;Aden (Yemen), Antananarivo (Madagascar), Chicago (US), Dallas (US), Doha (Qatar), Gaborone (Botswana), Gitega (Burundi), Harare (Zimbabwe), Johannesburg (South Africa), Juba (South Sudan), Khartoum (Sudan), Kigali (Rwanda), Kinshasa (Democratic Republic of the Congo), Lilongwe (Malawi), Lusaka (Zambia), Maputo (Mozambique), Mayotte (France), Mbabane (Eswatini), Mogadishu (Somalia), Nairobi (Kenya), Paris (France), Reunion (France), Seattle (US)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS3257&lt;/td&gt;
          &lt;td&gt;GTT&lt;/td&gt;
          &lt;td&gt;Ashburn (US), Astana (Kazakhstan), Athens (Greece), Baku (Azerbaijan), Basse-Terre (Guadeloupe), Beirut (Lebanon), Belgrade (Serbia), Berlin (Germany), Bratislava (Slovakia), Bucharest (Romania), Budapest (Hungary), Charlotte Amalie (U.S. Virgin Islands), Chicago (US), Chisinau (Moldova), Dallas (US), Doha (Qatar), Dushanbe (Tajikistan), Fort-de-France (Martinique), Fredericton (Canada), Gustavia (Saint Barthélemy), Halifax (Canada), Hawthorne (US), Honolulu (US), Iqaluit (Canada), Kansas City (US), Khartoum (Sudan), Kingston (Jamaica), Kukes (Albania), Kuujjuaq (Canada), Kyiv (Ukraine), Ljubljana (Slovenia), Los Angeles (US), Manila (Philippines), Marigot (Saint Martin), Mexico City (Mexico), Miami (US), Milan (Italy), Minneapolis (US), Montreal (Canada), N&amp;rsquo;Djamena (Chad), Nassau (Bahamas), New York (US), Nicosia (Cyprus), Paris (France), Philipsburg (Sint Maarten), Podgorica (Montenegro), Port-au-Prince (Haiti), Portland (US), Prague (Czech Republic), Regina (Canada), Riga (Latvia), Rome (Italy), Roseau (Dominica), Saigon (Vietnam), Saint John&amp;rsquo;s (Antigua and Barbuda), Saint-Pierre (Saint Pierre and Miquelon), San Jose (Costa Rica), San Juan (Puerto Rico), Santo Domingo (Dominican Republic), Sarajevo (Bosnia and Herzegovina), Seattle (US), Skopje (North Macedonia), Sofia (Bulgaria), Tallinn (Estonia), Tbilisi (Georgia), Tirana (Albania), Toronto (Canada), Vaduz (Liechtenstein), Valletta (Malta), Vienna (Austria), Vilnius (Lithuania), Warsaw (Poland), Winnipeg (Canada), Yerevan (Armenia), Zagreb (Croatia), Zurich (Switzerland)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS3356&lt;/td&gt;
          &lt;td&gt;Lumen/Colt/Level3&lt;/td&gt;
          &lt;td&gt;Anchorage (US), Asuncion (Paraguay), Atlanta (US), Bogota (Colombia), Brasilia (Brazil), Brasília (Brazil), Bridgetown (Barbados), Brucejack (Canada), Buenos Aires (Argentina), Calgary (Canada), Caracas (Venezuela), Castries (Saint Lucia), Chicago (US), Dallas (US), Denver (US), Doha (Qatar), Hawthorne (US), Honolulu (US), Kingstown (Saint Vincent and the Grenadines), Kralendijk (Bonaire), Kuala Lumpur (Malaysia), Lima (Peru), Los Angeles (US), Mexico City (Mexico), Montevideo (Uruguay), Nome (US), Panama City (Panama), Paris (France), Port of Spain (Trinidad and Tobago), Quito (Ecuador), Saint George&amp;rsquo;s (Grenada), San Jose (Costa Rica), Santiago (Chile), Sao Paulo (Brazil), Seattle (US), Stanley (Falkland Islands), Vancouver (Canada)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS37282&lt;/td&gt;
          &lt;td&gt;MAINONE, NG&lt;/td&gt;
          &lt;td&gt;Abdijan (Côte d&amp;rsquo;Ivoire), Accra (Ghana), Bissau (Guinea-Bissau), Freetown (Sierra Leone), Lagos (Nigeria), Monrovia (Liberia), N&amp;rsquo;Djamena (Chad), Niamey (Niger), Porto-Novo (Benin), Yaoundé (Cameroon)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS37662&lt;/td&gt;
          &lt;td&gt;WIOCC-AS, MU&lt;/td&gt;
          &lt;td&gt;Abdijan (Côte d&amp;rsquo;Ivoire), Accra (Ghana), Bissau (Guinea-Bissau), Dakar (Senegal), Freetown (Sierra Leone), Harare (Zimbabwe), Juba (South Sudan), Kinshasa (Democratic Republic of the Congo), Lagos (Nigeria), Maputo (Mozambique), Maseru (Lesotho), Monrovia (Liberia), N&amp;rsquo;Djamena (Chad), Niamey (Niger), Ouagadougou (Burkina Faso), Porto-Novo (Benin), Sao Tome (São Tomé and Príncipe), Yaoundé (Cameroon)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS4826&lt;/td&gt;
          &lt;td&gt;Vocus Connect&lt;/td&gt;
          &lt;td&gt;Brisbane (Australia), Dili (Timor-Leste), Hobart (Australia), Honiara (Solomon Islands), Honolulu (US), Melbourne (Australia), Nuku&amp;rsquo;alofa (Tonga), Perth (Australia), Suva (Fiji), Sydney (Australia), Yaren (Nauru)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS48728&lt;/td&gt;
          &lt;td&gt;VODAFONEQATAR, QA&lt;/td&gt;
          &lt;td&gt;No mapping to PoP but visible upstream for non-GeoIP tagged prefixes / might be up for testing&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS52468&lt;/td&gt;
          &lt;td&gt;UFINET PANAMA S.A., PA&lt;/td&gt;
          &lt;td&gt;Guatemala City (Guatemala), Kuujjuaq (Canada), Mexico City (Mexico), Panama City (Panama), San Jose (Costa Rica), San Salvador (El Salvador), Tegucigalpa (Honduras)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS5405&lt;/td&gt;
          &lt;td&gt;INTERDOTLINK powered by Inter.link, DE&lt;/td&gt;
          &lt;td&gt;Berlin (Germany), Chicago (US), Dallas (US), Doha (Qatar), Ljubljana (Slovenia), Milan (Italy), Paris (France), Seattle (US), Vaduz (Liechtenstein), Vienna (Austria), Zagreb (Croatia), Zurich (Switzerland)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS5416&lt;/td&gt;
          &lt;td&gt;Beyon&lt;/td&gt;
          &lt;td&gt;Manama (Bahrain)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS55352&lt;/td&gt;
          &lt;td&gt;Microscan&lt;/td&gt;
          &lt;td&gt;No mapping to PoP but visible upstream for non-GeoIP tagged prefixes / might be up for testing&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS55836&lt;/td&gt;
          &lt;td&gt;Reliance Jio&lt;/td&gt;
          &lt;td&gt;Mumbai (India)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS55850&lt;/td&gt;
          &lt;td&gt;Mercury NZ Limited&lt;/td&gt;
          &lt;td&gt;Adamstown (Pitcairn Islands), Apia (Samoa), Auckland (New Zealand), Avarua District (Cook Islands), Christchurch (New Zealand), Funafuti (Tuvalu), Honolulu (US), Pago Pago (American Samoa), Port-Vila (Vanuatu), Tarawa (Kiribati)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS58717&lt;/td&gt;
          &lt;td&gt;Summit Communications&lt;/td&gt;
          &lt;td&gt;Dhaka (Bangladesh)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS60849&lt;/td&gt;
          &lt;td&gt;ILEVANT-AS&lt;/td&gt;
          &lt;td&gt;Amman (Jordan)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS6327&lt;/td&gt;
          &lt;td&gt;SHAW&lt;/td&gt;
          &lt;td&gt;Billings (US), Calgary (Canada), Regina (Canada), Vancouver (Canada)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS63927&lt;/td&gt;
          &lt;td&gt;RISE-HK RISE, HK&lt;/td&gt;
          &lt;td&gt;Hagatna (Guam), Kuala Lumpur (Malaysia), Manila (Philippines), Palikir (Federated States of Micronesia), Saipan (Northern Mariana Islands)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS6453&lt;/td&gt;
          &lt;td&gt;Tata Comm&lt;/td&gt;
          &lt;td&gt;No mapping to PoP but visible upstream for non-GeoIP tagged prefixes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS6461&lt;/td&gt;
          &lt;td&gt;Zayo&lt;/td&gt;
          &lt;td&gt;Chicago (US), Dallas (US), Doha (Qatar), Fredericton (Canada), Halifax (Canada), Iqaluit (Canada), Kansas City (US), Kuujjuaq (Canada), Mexico City (Mexico), Montreal (Canada), Paris (France), Phoenix (US), Portland (US), Regina (Canada), Saint John&amp;rsquo;s (Canada), Salt Lake City (US), Seattle (US), Tempe (US), Toronto (Canada), Vancouver (Canada)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS6762&lt;/td&gt;
          &lt;td&gt;TELECOM ITALIA SPARKLE&lt;/td&gt;
          &lt;td&gt;Asuncion (Paraguay), Buenos Aires (Argentina), Cayenne (French Guiana), Chicago (US), Dallas (US), Doha (Qatar), Fortaleza (Brazil), Georgetown (Guyana), Paramaribo (Suriname), Paris (France), Santiago (Chile), Sao Paulo (Brazil), Seattle (US)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS7195&lt;/td&gt;
          &lt;td&gt;EDGEUNO&lt;/td&gt;
          &lt;td&gt;Bogota (Colombia), Bridgetown (Barbados), Caracas (Venezuela), Castries (Saint Lucia), Kingstown (Saint Vincent and the Grenadines), Kralendijk (Bonaire), Kuujjuaq (Canada), Mexico City (Mexico), Panama City (Panama), Port of Spain (Trinidad and Tobago), Quito (Ecuador), Saint George&amp;rsquo;s (Grenada), San Jose (Costa Rica), Sao Paulo (Brazil)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS8529&lt;/td&gt;
          &lt;td&gt;Zain Omantel International&lt;/td&gt;
          &lt;td&gt;Muscat (Oman)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS8551&lt;/td&gt;
          &lt;td&gt;Bezeqint Internet Backbone&lt;/td&gt;
          &lt;td&gt;Jerusalem (Israel), Ramallah (Palestine)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AS8781&lt;/td&gt;
          &lt;td&gt;Ooredoo&lt;/td&gt;
          &lt;td&gt;Chicago (US), Dallas (US), Doha (Qatar), Dubai (United Arab Emirates), Paris (France), Seattle (US)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;The above data has been mapped from raw data which is &lt;a href=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/starlink-global-interconnection/PoP-wise-result.txt&#34;&gt;posted here&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h4 id=&#34;misc-notes&#34;&gt;Misc notes:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Some providers are visible in the list as transit players like Tata Comm (AS6453), Vodafone Qatar (AS48728) and Microscan (AS55352), but no PoP is mapped to them. This is either because they are just testing and these are indeed their upstreams, but no mapping found in GeoIP data, OR they are upstream for a large number of prefixes as well as downstreams, which are again not in the GeoIP mapping.&lt;/li&gt;
&lt;li&gt;This table above is simply showing upstream for a PoP. In many cases, the drop is local, while in many cases, the drop is not local. E.g. Arelion (AS1299) seems to be upstream in Starlink Sri Lanka IPs, while actually that&amp;rsquo;s a drop for Arelion in Singapore.&lt;/li&gt;
&lt;li&gt;This post is going live on 24 Oct 2025, while I worked on most of this data on 14 Oct 2025. Routing might have changed a little bit in the last 10 days.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog, and hence, posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>BSNL drops IP transit from BSCCL Bangladesh</title>
      <link>https://anuragbhatia.com/post/2025/10/bsnl-drops-transit-from-bsccl/</link>
      <pubDate>Wed, 22 Oct 2025 01:23:54 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/10/bsnl-drops-transit-from-bsccl/</guid>
      <description>&lt;p&gt;Multiple news articles came earlier in the day in Bangladeshi media, suggesting that BSNL (AS9829) has dropped its 10G link from BSCCL (AS132602) at 00:00 on 21st Oct. This was in use for connectivity in North Eastern states of India.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Checking routing table for routes with AS_PATH &amp;ldquo;&lt;strong&gt;132602 9829&lt;/strong&gt;&amp;rdquo; from a combined view of various route-collectors.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/bsnl-drops-transit-from-bsccl/BSNL-routes-behind-BSCCL.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Date&lt;/th&gt;
          &lt;th&gt;BSNL prefixes behind BSSCL&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-06&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-07&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-08&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-09&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-10&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-11&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-12&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-13&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-14&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-15&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-16&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-17&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-18&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-19&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-20&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-21&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-10-22&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;So indeed seems to have gone for now &lt;a href=&#34;https://anuragbhatia.com/2016/04/networking/isp-column/india-bangladesh-bandwidth-agreement-bsnl-routing-more/&#34;&gt;after 9 years of the agreement&lt;/a&gt; between India and Bangladesh.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Large scale optical switching at Google - AS15169</title>
      <link>https://anuragbhatia.com/post/2025/10/large-scale-optical-switching-at-google/</link>
      <pubDate>Mon, 20 Oct 2025 03:55:52 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/10/large-scale-optical-switching-at-google/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s the day of Diwali. Happy Diwali 🪔 to everyone reading this post. 😀&lt;/p&gt;
&lt;p&gt;I am in holiday mode from couple of days and mostly reading (and binge watching). While reading paper on &lt;a href=&#34;https://arxiv.org/pdf/2208.10041&#34;&gt;Apollo - Google&amp;rsquo;s optical circuit switching&lt;/a&gt;, I looked around and came across a fascinating &lt;a href=&#34;https://youtu.be/tOzg-2kVfWs&#34;&gt;Google&amp;rsquo;s talk&lt;/a&gt; from last year. This talk covers how they made their own optical switches.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/tOzg-2kVfWs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;h2 id=&#34;quick-notes&#34;&gt;Quick notes&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Advanced warning: These are from eyes of network engineer working mostly at IP/ethernet layer with poor idea about optical layer)&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h4 id=&#34;architecture-design&#34;&gt;Architecture design&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/large-scale-optical-switching-at-google/jupier-dc-arch.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s Jupiter datacenter architecture had typical Spine, aggregation and TOR switches. The idea here is to have big fat switches on top forming the &amp;ldquo;spine&amp;rdquo;. Next, aggregation switches, which are meshed with spine switches and these aggregation switches serve top of the rack (TOR) switches where servers connect. This helps to aggregate all servers in a given rack within the ToR switch(es) within that rack. Because of the mesh between aggregation &amp;amp; spine, the actual connections here are very high. Around 8 years ago, Google started replacing these Spine switches with optical switches. This essentially gives them a way to mesh all switches within the aggregation layer and control that optical connectivity from software. If you are watching the above embedded video from YouTube, those bits are coming from one of these optically switched systems.&lt;/p&gt;
&lt;br /&gt;
&lt;h4 id=&#34;optical-switches&#34;&gt;Optical Switches&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/large-scale-optical-switching-at-google/optical-switch.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;(Image source &lt;a href=&#34;https://youtu.be/tOzg-2kVfWs?t=301&#34;&gt;here&lt;/a&gt;)&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;Oftentimes in the IP world, to actually call an Ethernet switch with SFP optical ports an &amp;ldquo;optical switch&amp;rdquo;, but this is a different case.
Imagine having a &amp;ldquo;hardware&amp;rdquo; where 100s of fibres land, say from Input 1, Input 2,&amp;hellip; Input 100 and next 100s of fibre going out - Output 1, output 2&amp;hellip;output 100. Next, this hardware can optically route a given input (say, e.g input 1) to any given output (e.g output 10). To do this, there are a few methods. Google&amp;rsquo;s one is based on MEMS mirrors. These are tiny (less than 1mm) mirror arrays which can steer a given optical input at a given angle to a pre-defined path. They do this within milli-second range which is crazy fast.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/large-scale-optical-switching-at-google/optical-mirrors.png&#34; width=&#34;800&#34; height=&#34;120&#34;&gt;
&lt;/figure&gt;

&lt;br /&gt;
&lt;figure&gt;&lt;img src=&#34;https://storage.googleapis.com/gweb-cloudblog-publish/images/2_Jupiter.max-2000x2000.jpg&#34; width=&#34;700&#34; height=&#34;120&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;(Image source &lt;a href=&#34;https://cloud.google.com/blog/topics/systems/the-evolution-of-googles-jupiter-data-center-network&#34;&gt;here&lt;/a&gt;)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/large-scale-optical-switching-at-google/design.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4 id=&#34;east-west-traffic-is-huge&#34;&gt;East-West traffic is huge&lt;/h4&gt;
&lt;p&gt;Google started deploying this 7 years ago, and all their datacenters are using it. A considerable part of it comes from modern workloads as datacenters have a lot of East-West traffic (within DC) these days, compared to North-South (outside of DC). Google Cloud largely defines Google&amp;rsquo;s network decisions these days, and besides internal traffic for analytics, logs, backups, replications, there would be a major traffic between GPUs, compute, storage, etc. Thus, they need a mesh of aggregation switches to ensure traffic goes directly between them instead of another layer on top, which would get quite hot and become the congestion point. To deal with that, they need to connect big fat switches with lots of ports in a mesh. It&amp;rsquo;s quite interesting how, back in 2015-2016, when traffic was shooting up due to streaming, a lot of them ended up going to / aggregating on CDNs. Now, in the next bandwidth jump, it&amp;rsquo;s all local traffic to AI-based workloads and not even hitting internet but staying mostly within a DC.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Remembering Shashank Dubey AKA Delhi Gateway</title>
      <link>https://anuragbhatia.com/post/2025/10/remembering-shashank-dubey/</link>
      <pubDate>Sat, 11 Oct 2025 20:23:53 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/10/remembering-shashank-dubey/</guid>
      <description>&lt;p&gt;On Wednesday, I received extremely sad news of the passing away of my good friend Shashank Dubey. We worked together in my previous job at Spectra (AS10029) and had both good and bad times as we navigated various challenges. Shashank was part of the NOC team when I joined the Network Planning &amp;amp; Ops team. We would often chat about networking whenever I worked out of Spectra&amp;rsquo;s Delhi office. This was my first job of working on JunOS, and I remember how I used to be afraid of changes and Shashank would chill out as we would go around making bulk changes. He used to work so much on one of the core routers in Delhi (Delhi gateway) that&amp;rsquo;s why we used to call him &amp;ldquo;&lt;strong&gt;Delhi Gateway&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/remembering-shashank-dubey/Anurag-Shashank.jpg&#34; width=&#34;500&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/remembering-shashank-dubey/Anurag-Shashank2.JPG&#34; width=&#34;600&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/remembering-shashank-dubey/Team-AS10029.jpg&#34; width=&#34;600&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Later, I left for Hurricane Electric, and Shashank stayed for a few more years and left for Extreme IX. We used to have long calls in the evening once in a few months, and also tried meeting once in a while. He told me a few times that he wanted to start an ISP back at home but eventually gave up due to market conditions as Airtel/Jio were selling super cheap FTTH and it didn&amp;rsquo;t made any financial sense for him to enter the market at that stage. Earlier this year, after spending some time at Extreme IX and some consulting, he joined Spectra. Last month he wanted to talk, but I was busy and thought to had a call after returning to India from APNIC 60. I missed calling him back and lost the opportunity to ever speak to him. 😟&lt;/p&gt;
&lt;p&gt;Will always be in my thoughts as a good friend. Om Shanti.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Meta using XGS-PON in the datacenter</title>
      <link>https://anuragbhatia.com/post/2025/10/pon-in-datacenter/</link>
      <pubDate>Tue, 07 Oct 2025 02:10:25 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/10/pon-in-datacenter/</guid>
      <description>&lt;p&gt;Earlier this year, Mike Joseph from Meta gave a very interesting talk at NANOG 94 in Denver. The title of his talk was &amp;ldquo;&lt;strong&gt;PON in the Datacenter: Hyperscale for Management and Console&lt;/strong&gt;&amp;rdquo; (slides &lt;a href=&#34;https://storage.googleapis.com/site-media-prod/meetings/NANOG94/5354/20250610_Joseph_Pon_In_The_v1.pdf&#34;&gt;here&lt;/a&gt;). Here&amp;rsquo;s a 41-minute video of this talk, and it is very much worth watching if you are in the datacenter / ISP space.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/qzI5r6_7uQA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;notes-from-metas-talk&#34;&gt;Notes from Meta&amp;rsquo;s talk:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;XGS PON seems good enough to replace copper for management traffic. Again, &lt;strong&gt;this is for management traffic only&lt;/strong&gt; and &lt;strong&gt;not the actual Meta content traffic&lt;/strong&gt;, which likely would be over 10G/40G/100G links within the datacenter.&lt;/li&gt;
&lt;li&gt;By using PON (Passive Optical Network), Meta has designed to terminate copper coming from devices within the rack so that outside of the rack is just (lighter) optical fibre (only). Copper, just for management alone at their scale, was quite a lot of cables. An end-of-row device mounted a &amp;ldquo;goalpost rack&amp;rdquo; on top. They had a rigid design to plan for Ethernet &amp;amp; serial drops in advance for each rack. Changes in that were harder due to the fixed design of copper cables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/pon-in-datacenter/meta-racks-copper.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;(Image source for all pictures: &lt;a href=&#34;https://storage.googleapis.com/site-media-prod/meetings/NANOG94/5354/20250610_Joseph_Pon_In_The_v1.pdf&#34;&gt;Meta&amp;rsquo;s slides&lt;/a&gt;)&lt;/p&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;With PON, they were able to get (20+20 - ethernet &amp;amp; console drops) or any other combination like (32+8) per rack. On a row basis, that&amp;rsquo;s up to 1280 Ethernet drops + 800 console connections - where a pair of them in a rack would aggregate within the rack.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They didn&amp;rsquo;t say the vendor name, but from the pictures, it&amp;rsquo;s quite clear they are using Cienna&amp;rsquo;s solution. The picture below shows 6 x 4 port ONUs stacked, giving 24 copper ports. This can be expanded to 12 x 4 ports = 48 ports easily, as visible on the chassis.
&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/pon-in-datacenter/Meta-ONU.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Meta also has a high availability on the PON network by making use of 2 x OLTs feeding a 2:8 or 2:4 splitter.
&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/pon-in-datacenter/High-availability-PON.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They also have an interesting headend. Instead of using traditional OLT, they are using &amp;ldquo;micro-OLTs&amp;rdquo;. These are OLTs implemented on an SFP+ module and plug into a layer 3 switch. I think from the picture (plus the fact they are using Cienna ONUs), this is Cienna&amp;rsquo;s Tibit pluggables.
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/10/pon-in-datacenter/Pluggable-micro-OLT.png&#34; width=&#34;300&#34; height=&#34;120&#34;&gt;
&lt;/figure&gt;

Image source: &lt;a href=&#34;https://www.ciena.com/interconnects/tibit-technologies&#34;&gt;Cienna Tibit&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These devices basically speak 10G Ethernet at one end and XGS PON on the other end. In the backend, they do Ethernet to PON MAC bridge.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;thoughts-on-pon-outside-of-the-last-mile&#34;&gt;Thoughts on PON outside of the last mile&lt;/h3&gt;
&lt;p&gt;I found this presentation fascinating because I have always wondered why PON is not being deployed outside of the FTTH last mile. I have asked this to a few friends working on enterprise networks and felt as if the product line is not developed yet, while technically it&amp;rsquo;s very much feasible, as we know from the FTTH world.
Go to any corporate office with 200-250 people sitting on each floor. These typically deploy Cat6 copper from each desk to a centralised switch. That&amp;rsquo;s a lot of copper, and the aggregation of that takes quite a bit of expensive real estate. A 4-port OLT with a 64-user per port can easily do 4 x 64 = 256 users. Likely much higher than that because optical power (unlike FTTH networks) won&amp;rsquo;t be an issue here. A mix of active Ethernet (&lt;em&gt;for high traffic&lt;/em&gt;) + PON + DC power (to power ONUs) running over the same physical cable + pre-terminated fibre can do quite a bit. Corning displayed these concepts at the Courtyard hotel 6 years ago (video &lt;a href=&#34;https://youtu.be/8ekwmPRFUuo&#34;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Once, I was at a hotel in Singapore, and at night, it was crazy loud right outside of my room. One can easily tell it was a switch placed in a telco closet. All these can be quite nice applications for PON going forward. Would save a ton of expensive, heavy copper Cat6 cable, along with real estate, electricity and more when offering drops. An XGS 10G symmetric uplink/downlink capacity can easily do 150Mbps per drop for a 1:64 split or 78Mbps for a 1:128 split. Most of the hotel&amp;rsquo;s Wi-Fi is inbound heavy (&lt;em&gt;streaming effect&lt;/em&gt;) while cameras are outbound heavy. Even at 10Mbps per stream, it can do many hundreds of cameras on the same PON port, where copper aggregates within a few meters on fibre and fibre aggregates per floor on the splitters.&lt;/p&gt;
&lt;p&gt;I think going forward, we will see wifi APs as well as IP cameras, printers, and IP phones with PON ONU (or even &lt;a href=&#34;https://x.com/dm4uz3/status/1974854415359307995&#34;&gt;PON based ATAs&lt;/a&gt; like this one!) tech built in, and it will essentially become a plug-and-play solution with pre-terminated hybrid copper-fibre, where copper will carry DC power and fibre will carry traffic.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Can we detect submarine cable cuts from BGP routing table?</title>
      <link>https://anuragbhatia.com/post/2025/09/detecting-submarine-cuts-from-bgp-routing-table/</link>
      <pubDate>Sat, 27 Sep 2025 02:41:11 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/09/detecting-submarine-cuts-from-bgp-routing-table/</guid>
      <description>&lt;h3 id=&#34;background&#34;&gt;Background&lt;/h3&gt;
&lt;p&gt;I wrote most of this post over a week ago, but I couldn&amp;rsquo;t complete it as I was down with a viral fever, which has disrupted my schedule a bit. Anyway, to the post now.
A University researcher recently sent me an email about my post on &lt;a href=&#34;https://anuragbhatia.com/post/2025/09/submarine-cable-failures/&#34;&gt;Submarine cable cuts at Jeddah&lt;/a&gt;. Their question was about how we can detect submarine cable cuts in detail from the BGP routing table. There was some hint to &amp;ldquo;how&amp;rdquo; in the last part of my earlier post, where a graph shows how the route announcement from Bharti Airtel (AS9498) went to zero at DE-CIX Frankfurt. Let&amp;rsquo;s find out if we can actually detect a large outage using just the BGP as the control plane. Using the data plane is always useful as one can spray packets around &amp;amp; find out latency/packet loss, but one can ultimately have limited source points. But for the BGP table, there are great projects collecting full routing table &amp;amp; publishing it for researchers like &lt;a href=&#34;https://www.ripe.net/analyse/internet-measurements/routing-information-service-ris/&#34;&gt;RIPE RIS&lt;/a&gt;, &lt;a href=&#34;https://www.routeviews.org/routeviews/&#34;&gt;Oregon Routeviews&lt;/a&gt;, besides quite nice &lt;a href=&#34;https://www.de-cix.net/en/services/looking-glass&#34;&gt;looking glass API&lt;/a&gt; from DE-CIX, AMS-IX, etc.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;who-is-expected-to-pull-announcements&#34;&gt;Who is expected to pull announcements?&lt;/h3&gt;
&lt;p&gt;Typically, tier 1 / transit-free networks, as well as other networks which may technically be tier 1 but have large downstream table &amp;amp; peerings, would not pull announcements in case of submarine cable failure. This is by design; they are expected to ensure they have enough transport capacity available to carry the traffic. If they cannot, they would arrange for that, but won&amp;rsquo;t pull off BGP announcement because pulling announcements in one region (like Europe in this case) may result in their peering partner using more capacity. This is typically not expected as per peering policies.&lt;/p&gt;
&lt;p&gt;Some examples of peering policy enforcing consistent announcements:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.gtt.net/us-en/peering/&#34;&gt;1. GTT AS3257 peering policy&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2.7. Each Internet Network must announce &lt;strong&gt;consistent routes across all interconnection points&lt;/strong&gt;, unless mutually agreed in writing by both parties.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a href=&#34;https://wholesale.orange.com/international/en/peering-policy.html&#34;&gt;2. Orange AS5511 peering policy&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;provide &lt;strong&gt;consistent routing announcements&lt;/strong&gt;, i.e., the same set of routes announced with the same autonomous system (“AS”) path length at all peering locations,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a href=&#34;https://www.arelion.com/dam/jcr:58bcf8cb-7cd2-4108-a5d9-e65bc2a01bb5/Arelion%20%20Peering%20Policy%20Clean%20(12.22.pdf&#34;&gt;3. Arelion AS1299 peering policy&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Routes: Interconnection Candidate must carry full customer routes in interconnect routers, and &lt;strong&gt;announce consistent routes&lt;/strong&gt; using BGP4 at all peering locations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thus, it&amp;rsquo;s clear that one should not look for announcement changes by any of the free networks from a viewpoint. A notable exception here will be tier 1 transit-free networks which peer at IXPs. :)&lt;/p&gt;
&lt;p&gt;However, tier 1 transit-free networks can be an interesting viewpoint to see changes in announcements coming from their downstream.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;de-cix-fra-announcements&#34;&gt;DE-CIX FRA announcements&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/detecting-submarine-cuts-from-bgp-routing-table/decix-all-routes.png&#34; width=&#34;1000&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This shows a major downfall on 5th Sep. Here&amp;rsquo;s the raw table:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Timestamp&lt;/th&gt;
          &lt;th&gt;Routes&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-05 19:30:44&lt;/td&gt;
          &lt;td&gt;294706&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-05 20:30:45&lt;/td&gt;
          &lt;td&gt;294755&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-05 21:31:02&lt;/td&gt;
          &lt;td&gt;294782&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-05 22:31:12&lt;/td&gt;
          &lt;td&gt;294627&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-05 23:30:44&lt;/td&gt;
          &lt;td&gt;282089&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-06 00:30:43&lt;/td&gt;
          &lt;td&gt;282422&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-06 01:31:05&lt;/td&gt;
          &lt;td&gt;282563&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2025-09-06 02:31:07&lt;/td&gt;
          &lt;td&gt;282532&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This shows a downfall of 12538 routes between 22:31 and 23:30. I am collecting this data from the Looking Glass API of DE-CIX, but I think the same should be visible (with more compute) from MRT dumps as RIPE RIS RRC12 carries routes fed from DE-CIX route servers on AS6695. There is a similar visible drop in routes at LINX London around the same period.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Here&amp;rsquo;s a summary of ASNs I can find from DE-CIX and LINX data which seem to be impacted:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;IXP&lt;/th&gt;
          &lt;th&gt;IXP Code&lt;/th&gt;
          &lt;th&gt;ASN&lt;/th&gt;
          &lt;th&gt;AS Name&lt;/th&gt;
          &lt;th&gt;address&lt;/th&gt;
          &lt;th&gt;Drop in routes_imported at IXP&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;3356&lt;/td&gt;
          &lt;td&gt;Century Link&lt;/td&gt;
          &lt;td&gt;185.1.8.41&lt;/td&gt;
          &lt;td&gt;21&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;8220&lt;/td&gt;
          &lt;td&gt;COLT Telecom Group plc&lt;/td&gt;
          &lt;td&gt;185.1.8.60&lt;/td&gt;
          &lt;td&gt;6823&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;185.1.8.51&lt;/td&gt;
          &lt;td&gt;3037&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;9583&lt;/td&gt;
          &lt;td&gt;Sify Technologies Ltd&lt;/td&gt;
          &lt;td&gt;185.1.8.57&lt;/td&gt;
          &lt;td&gt;165&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_dxb_ipv6&lt;/td&gt;
          &lt;td&gt;8220&lt;/td&gt;
          &lt;td&gt;COLT Telecom Group plc&lt;/td&gt;
          &lt;td&gt;2001:7f8:73::201c:0:1&lt;/td&gt;
          &lt;td&gt;771&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;80.81.196.112&lt;/td&gt;
          &lt;td&gt;9681&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;80.81.194.250&lt;/td&gt;
          &lt;td&gt;9144&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;18001&lt;/td&gt;
          &lt;td&gt;Dialog Axiata PLC&lt;/td&gt;
          &lt;td&gt;80.81.192.114&lt;/td&gt;
          &lt;td&gt;241&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;80.81.192.26&lt;/td&gt;
          &lt;td&gt;281&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;80.81.194.9&lt;/td&gt;
          &lt;td&gt;105&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv4&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;80.81.192.208&lt;/td&gt;
          &lt;td&gt;345&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::251a:0:2&lt;/td&gt;
          &lt;td&gt;5656&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::251a:0:1&lt;/td&gt;
          &lt;td&gt;3765&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv6&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;2001:7f8::8ba9:0:3&lt;/td&gt;
          &lt;td&gt;64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv6&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;2001:7f8::8ba9:0:4&lt;/td&gt;
          &lt;td&gt;16&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_fra_ipv6&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::e55d:0:1&lt;/td&gt;
          &lt;td&gt;86&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_ist_ipv4&lt;/td&gt;
          &lt;td&gt;6939&lt;/td&gt;
          &lt;td&gt;Hurricane Electric&lt;/td&gt;
          &lt;td&gt;185.1.48.16&lt;/td&gt;
          &lt;td&gt;89077&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_ist_ipv6&lt;/td&gt;
          &lt;td&gt;6939&lt;/td&gt;
          &lt;td&gt;Hurricane Electric&lt;/td&gt;
          &lt;td&gt;2001:7f8:3f::1b1b:0:1&lt;/td&gt;
          &lt;td&gt;60337&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_mrs_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;185.1.47.7&lt;/td&gt;
          &lt;td&gt;9149&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_mrs_ipv4&lt;/td&gt;
          &lt;td&gt;10075&lt;/td&gt;
          &lt;td&gt;Fiber Home Global Ltd&lt;/td&gt;
          &lt;td&gt;185.1.47.145&lt;/td&gt;
          &lt;td&gt;663&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::251a:0:1&lt;/td&gt;
          &lt;td&gt;3765&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;10075&lt;/td&gt;
          &lt;td&gt;Fiber Home Global Ltd&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::275b:0:1&lt;/td&gt;
          &lt;td&gt;349&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::e55d:0:1&lt;/td&gt;
          &lt;td&gt;1193&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_nyc_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;206.82.104.130&lt;/td&gt;
          &lt;td&gt;17062&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs1_nyc_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:504:36::251a:0:1&lt;/td&gt;
          &lt;td&gt;2495&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;3356&lt;/td&gt;
          &lt;td&gt;Century Link&lt;/td&gt;
          &lt;td&gt;185.1.8.41&lt;/td&gt;
          &lt;td&gt;21&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;8220&lt;/td&gt;
          &lt;td&gt;COLT Telecom Group plc&lt;/td&gt;
          &lt;td&gt;185.1.8.60&lt;/td&gt;
          &lt;td&gt;6823&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_dxb_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;185.1.8.51&lt;/td&gt;
          &lt;td&gt;3037&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_dxb_ipv6&lt;/td&gt;
          &lt;td&gt;8220&lt;/td&gt;
          &lt;td&gt;COLT Telecom Group plc&lt;/td&gt;
          &lt;td&gt;2001:7f8:73::201c:0:1&lt;/td&gt;
          &lt;td&gt;771&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;80.81.196.112&lt;/td&gt;
          &lt;td&gt;9681&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;80.81.194.250&lt;/td&gt;
          &lt;td&gt;9144&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;18001&lt;/td&gt;
          &lt;td&gt;Dialog Axiata PLC&lt;/td&gt;
          &lt;td&gt;80.81.192.114&lt;/td&gt;
          &lt;td&gt;241&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;80.81.192.26&lt;/td&gt;
          &lt;td&gt;281&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;80.81.194.9&lt;/td&gt;
          &lt;td&gt;105&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv4&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;80.81.192.208&lt;/td&gt;
          &lt;td&gt;345&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::251a:0:2&lt;/td&gt;
          &lt;td&gt;5656&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::251a:0:1&lt;/td&gt;
          &lt;td&gt;3765&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv6&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;2001:7f8::8ba9:0:3&lt;/td&gt;
          &lt;td&gt;64&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv6&lt;/td&gt;
          &lt;td&gt;35753&lt;/td&gt;
          &lt;td&gt;Integrated Telecom Company (ITC) / Salam.sa&lt;/td&gt;
          &lt;td&gt;2001:7f8::8ba9:0:4&lt;/td&gt;
          &lt;td&gt;16&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_fra_ipv6&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8::e55d:0:1&lt;/td&gt;
          &lt;td&gt;86&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_ist_ipv4&lt;/td&gt;
          &lt;td&gt;6939&lt;/td&gt;
          &lt;td&gt;Hurricane Electric&lt;/td&gt;
          &lt;td&gt;185.1.48.16&lt;/td&gt;
          &lt;td&gt;89066&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_ist_ipv6&lt;/td&gt;
          &lt;td&gt;6939&lt;/td&gt;
          &lt;td&gt;Hurricane Electric&lt;/td&gt;
          &lt;td&gt;2001:7f8:3f::1b1b:0:1&lt;/td&gt;
          &lt;td&gt;60337&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;185.1.47.7&lt;/td&gt;
          &lt;td&gt;9148&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv4&lt;/td&gt;
          &lt;td&gt;10075&lt;/td&gt;
          &lt;td&gt;Fiber Home Global Ltd&lt;/td&gt;
          &lt;td&gt;185.1.47.145&lt;/td&gt;
          &lt;td&gt;663&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv4&lt;/td&gt;
          &lt;td&gt;30990&lt;/td&gt;
          &lt;td&gt;DJIBOUTI TELECOM S.A.&lt;/td&gt;
          &lt;td&gt;185.1.47.25&lt;/td&gt;
          &lt;td&gt;709&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::251a:0:1&lt;/td&gt;
          &lt;td&gt;3765&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;10075&lt;/td&gt;
          &lt;td&gt;Fiber Home Global Ltd&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::275b:0:1&lt;/td&gt;
          &lt;td&gt;349&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_mrs_ipv6&lt;/td&gt;
          &lt;td&gt;58717&lt;/td&gt;
          &lt;td&gt;Summit Communications Limited&lt;/td&gt;
          &lt;td&gt;2001:7f8:36::e55d:0:1&lt;/td&gt;
          &lt;td&gt;1193&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_nyc_ipv4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;206.82.104.130&lt;/td&gt;
          &lt;td&gt;17067&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2_nyc_ipv6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Limited&lt;/td&gt;
          &lt;td&gt;2001:504:36::251a:0:1&lt;/td&gt;
          &lt;td&gt;2495&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2-bom-v4&lt;/td&gt;
          &lt;td&gt;3303&lt;/td&gt;
          &lt;td&gt;AS3303 - Swisscom (Switzerland) Ltd&lt;/td&gt;
          &lt;td&gt;103.27.170.87&lt;/td&gt;
          &lt;td&gt;2490&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DE-CIX&lt;/td&gt;
          &lt;td&gt;rs2-bom-v6&lt;/td&gt;
          &lt;td&gt;3303&lt;/td&gt;
          &lt;td&gt;AS3303 - Swisscom (Switzerland) Ltd&lt;/td&gt;
          &lt;td&gt;2401:7500:fff6::87&lt;/td&gt;
          &lt;td&gt;452&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX&lt;/td&gt;
          &lt;td&gt;rs1-in2-lon1-linx-net-v4&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Ltd&lt;/td&gt;
          &lt;td&gt;195.66.226.204&lt;/td&gt;
          &lt;td&gt;12071&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX&lt;/td&gt;
          &lt;td&gt;rs1-in2-lon1-linx-net-v6&lt;/td&gt;
          &lt;td&gt;9498&lt;/td&gt;
          &lt;td&gt;Bharti Airtel Ltd&lt;/td&gt;
          &lt;td&gt;2001:7f8:4::251a:2&lt;/td&gt;
          &lt;td&gt;5905&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX&lt;/td&gt;
          &lt;td&gt;rs2-in2-lon2-linx-net-v4&lt;/td&gt;
          &lt;td&gt;16637&lt;/td&gt;
          &lt;td&gt;MTN GlobalConnect Solutions LTD&lt;/td&gt;
          &lt;td&gt;195.66.236.18&lt;/td&gt;
          &lt;td&gt;1962&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX&lt;/td&gt;
          &lt;td&gt;rs1-in2-lon1-linx-net-v4&lt;/td&gt;
          &lt;td&gt;9583&lt;/td&gt;
          &lt;td&gt;Sify Technologies Ltd&lt;/td&gt;
          &lt;td&gt;195.66.226.6&lt;/td&gt;
          &lt;td&gt;1632&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX&lt;/td&gt;
          &lt;td&gt;rs1-in2-lon1-linx-net-v4&lt;/td&gt;
          &lt;td&gt;17494&lt;/td&gt;
          &lt;td&gt;Bangladesh Telecommunications Company Limited(BTCL)&lt;/td&gt;
          &lt;td&gt;195.66.226.78&lt;/td&gt;
          &lt;td&gt;157&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The impact here varies from a few hours to weeks. The above table does not reflect that.&lt;/li&gt;
&lt;li&gt;Routes going off from IXP aren&amp;rsquo;t necessarily a bad thing. Reduction in routes does not mean loss of connectivity because there will always be alternate (less direct) paths between the networks.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3 id=&#34;mrt-dumps&#34;&gt;MRT dumps&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s look at updates from &lt;a href=&#34;https://www.ris.ripe.net/peerlist/rrc12.shtml&#34;&gt;RIPE RIS RRC12&lt;/a&gt; in Frankfurt. Just the size of the MRT update files gives the hint:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;4.5M    updates.20250905.2200.gz
3.6M    updates.20250905.2205.gz
3.4M    updates.20250905.2210.gz
3.7M    updates.20250905.2215.gz
3.7M    updates.20250905.2220.gz
3.5M    updates.20250905.2225.gz
4.8M    updates.20250905.2230.gz
4.9M    updates.20250905.2235.gz
4.3M    updates.20250905.2240.gz
9.0M    updates.20250905.2245.gz
14M     updates.20250905.2250.gz
8.3M    updates.20250905.2255.gz
4.1M    updates.20250905.2300.gz
3.7M    updates.20250905.2305.gz
3.6M    updates.20250905.2310.gz
3.7M    updates.20250905.2315.gz
3.6M    updates.20250905.2320.gz
3.8M    updates.20250905.2325.gz
4.0M    updates.20250905.2330.gz
3.7M    updates.20250905.2335.gz
3.4M    updates.20250905.2340.gz
3.5M    updates.20250905.2345.gz
3.4M    updates.20250905.2350.gz
3.4M    updates.20250905.2355.gz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A detailed analysis of prefixes having withdrawal and re-announcement gives a clue on who is impacted.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;what-about-transit-free-tier-1-networks&#34;&gt;What about transit-free tier 1 networks?&lt;/h3&gt;
&lt;p&gt;As stated earlier, we cannot use these methods on transit-free tier 1 networks. Their route announcement is mostly consistent unless they suffer a massive failure, taking down routers or entire transport in a given region. For detecting issues within them, I think only hints can be announced from their downstream side. E.g. looking at routes tagged with EU or APAC customer BGP community besides just spraying measurement traffic to destinations on those networks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Submarine cable cuts at Jeddah impact connectivity in the Indian subcontinent</title>
      <link>https://anuragbhatia.com/post/2025/09/submarine-cable-failures/</link>
      <pubDate>Sun, 07 Sep 2025 05:48:53 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/09/submarine-cable-failures/</guid>
      <description>&lt;p&gt;I was away from my system since Friday evening, and as I look at various alerts, latency, packet loss and routing changes, it seems like quite a lot has happened since Saturday early morning. Latency from India to Europe has increased across all known large telcos - Airtel, Tata Comm, Jio, etc.&lt;/p&gt;
&lt;p&gt;One sample trace from my server in the EU on Contabo -&amp;gt; Airtel India:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HOST: server7.anuragbhatia.com                                                 Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. AS51167  ip-11-191-88-45.static.contabo.net (45.88.191.11)                 0.0%    10    0.3   0.3   0.3   0.5   0.1
 2. AS???    10.0.66.2                                                         0.0%    10    0.4   0.3   0.2   0.4   0.1
 3. AS3356   212.133.82.97                                                     0.0%    10    7.1  10.2   7.1  21.5   4.7
 4. AS???    ???                                                              100.0    10    0.0   0.0   0.0   0.0   0.0
 5. AS174    port-channel2813.ccr92.dca04.atlas.cogentco.com (154.54.82.2)     0.0%    10   90.0  90.0  89.9  90.1   0.1
 6. AS174    be3483.ccr42.atl01.atlas.cogentco.com (154.54.172.170)            0.0%    10  106.9 107.0 106.7 107.3   0.1
 7. AS174    port-channel3704.ccr92.jan02.atlas.cogentco.com (154.54.40.110)   0.0%    10  113.7 123.0 113.6 206.3  29.3
 8. AS174    be8122.ccr32.dfw01.atlas.cogentco.com (154.54.41.53)              0.0%    10  121.6 121.6 121.4 122.1   0.2
 9. AS174    be3846.ccr22.elp02.atlas.cogentco.com (154.54.165.30)             0.0%    10  134.8 134.6 134.4 134.8   0.1
 10. AS174    be5473.ccr32.phx01.atlas.cogentco.com (154.54.166.70)             0.0%    10  141.6 142.9 141.5 153.2   3.6
 11. AS174    be2932.ccr42.lax01.atlas.cogentco.com (154.54.45.162)             0.0%    10  152.1 152.0 151.8 152.2   0.1
 12. AS174    be3360.ccr41.lax04.atlas.cogentco.com (154.54.25.150)             0.0%    10  147.3 149.4 147.1 168.6   6.7
 13. AS174    38.122.147.122                                                    0.0%    10  146.6 147.5 146.5 150.5   1.3
 14. AS9498   116.119.112.26                                                    0.0%    10  320.9 321.0 320.6 323.2   0.8
 15. AS9498   152.52.190.90                                                     0.0%    10  335.3 335.3 335.2 335.4   0.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lumen EU &amp;gt; Cogent EU (likely on hop 4 - &lt;em&gt;remember hot potato routing&lt;/em&gt;) &amp;gt; Cogent Washington &amp;gt; Cogent Los Angeles &amp;gt; Bharti Airtel handover in Los Angeles -&amp;gt; India (via Pacific)&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an average latency graph of 3 EU sources -&amp;gt; 9 Airtel endpoints in India for the last 48 hours:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/submarine-cable-failures/Airtel-avg-latency-from-EU.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;As per this issue, it started at 04:00 IST  (GMT+5.5) on 06 Sept 2025. Jio as well as Tata Comm endpoints show similar latency. The same also matches the route drop across&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a combined graph of Airtel, Jio, ACT broadband and Excitel:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/submarine-cable-failures/Combined-latency-from-EU.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;what-caused-it&#34;&gt;What caused it?&lt;/h3&gt;
&lt;p&gt;The time of this latency jump seems to be related to news about &lt;a href=&#34;https://www.submarinecablemap.com/submarine-cable/imewe&#34;&gt;IMEWE&lt;/a&gt; and &lt;a href=&#34;https://www.submarinecablemap.com/submarine-cable/seamewe-4&#34;&gt;SMW4&lt;/a&gt; fibre cut near Jeddah, Saudi Arabia. While there&amp;rsquo;s not much reported in India, &lt;a href=&#34;https://x.com/PTCLOfficial/status/1964203180876521559&#34;&gt;PTCL Pakistan issued a statement on x&lt;/a&gt; about these outages. The cable cut point impacts Indian traffic as well. IMEWE lands in Mumbai, and both Airtel &amp;amp; Tata Comm are the consortium partners. SMW4 is an older cable and lands in both Mumbai &amp;amp; Chennai as it crosses over from the West to the East. As far as I can find, there&amp;rsquo;s no official report by Indian telcos about this, but time as well as latency/packet loss very much show that it is related.&lt;/p&gt;
&lt;p&gt;Another metric outside of latency/packet loss to view is the route announcement. Here&amp;rsquo;s the charge of AS9498 route announcement at DECIX Frankfurt:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/submarine-cable-failures/Airtel-routes-DECIX-FRA.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;impact-on-traffic&#34;&gt;Impact on traffic?&lt;/h3&gt;
&lt;p&gt;While only respective networks can tell how much of their capacity depends on it. Do keep in mind that over 90% of traffic for Indian retail-facing operators is local. That&amp;rsquo;s content to eyeball traffic. So whether there&amp;rsquo;s an impact or not would depend more on whether Google/Facebook/Microsoft/AWS store a lot of Indian accessed content in the EU or not. If not, it would be a small % of overall traffic, even though it may impact a higher percentage of international traffic. For anyone in businesses of connecting Indian endpoints with the EU (CRM, VoIP), etc, it may be 100% of their traffic. So it would depend on the kind of traffic profile.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog, and hence, posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;update-15-sep-2025&#34;&gt;Update: 15 Sep 2025&lt;/h3&gt;
&lt;p&gt;Seems like Bharti Airtel AS9498 capacity is getting restored. This is visible in reduced latency from EU to Airtel endpoints in India as well as their route announcements at DE-CIX FRA.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/submarine-cable-failures/Airtel-EU-India-latency-15-Sep-2025.png&#34; width=&#34;600&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/09/submarine-cable-failures/Airtel-DECIX-FRA-route-announcement-15-Sept-2025.png&#34; width=&#34;600&#34; height=&#34;320&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analysing ccTLD anycast</title>
      <link>https://anuragbhatia.com/post/2025/08/analysing-cctld-anycast/</link>
      <pubDate>Sat, 09 Aug 2025 01:43:56 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/08/analysing-cctld-anycast/</guid>
      <description>&lt;p&gt;In June, I attended NPNOG in Nepal. In the evening, I had a discussion with some friends about infra hosting ccTLD. We compared how some countries in the region host their ccTLD on their own while some outsource it to larger ccTLD operators. I have a feeling that it&amp;rsquo;s pretty hard to host a ccTLD these days, not because of the tech stack, but because of DDoS concerns. The only way to take care of DDoS at large-scale is to a) Over provision on the bandwidth and b) Spread the attack surface using anycast&lt;/p&gt;
&lt;p&gt;So to host a ccTLD reliably in 2025, one would need at least eight‑ten global locations near major data sources to take care of the attack. Something like Ashburn, Dallas, Palo Alto, Frankfurt, Amsterdam, Singapore, Hong Kong, etc. While we had the discussion - I wanted to check how many ccTLDs are actually anycasted and if my guess was correct. Seems like I was partially correct.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;understanding-anycast&#34;&gt;Understanding anycast&lt;/h3&gt;
&lt;p&gt;Anycast basically means having more than one node and using the same address. It is assumed/expected that BGP will take us to the nearest announcement. But in reality, BGP path selection is influenced by neighbor relationships. Slide 26-33 of my &lt;a href=&#34;https://cdn.anuragbhatia.com/web/pages/presentations/Routing-101.pdf&#34;&gt;presentation at INNOG&lt;/a&gt; covers this in detail. Essentially, network operators have the highest localpref on routes they learn from customers, the second highest on routes from peers, and the lowest on routes from upstream. Thus, if one does anycast with a mix and match of upstreams, it won&amp;rsquo;t work well. To deal with this, anycast is usually done with the same set of global upstream ISPs everywhere or with a very aggressive use of BGP action communities or a mix of global + local nodes. But even with all this, there can still be cases where some networks hit a local node, some hit far off anycast node.&lt;/p&gt;
&lt;p&gt;Thus, to deal with this specific part, I have to test from multiple providers in a given location. Anycast cannot be easily tested by just looking at the routing table. In theory, with location communities, one can get an idea, but it&amp;rsquo;s much easier to find it from latency/trace from different locations.&lt;/p&gt;
&lt;p&gt;So I ended up putting a script to look up for IPv4 and IPv6 latency to all ccTLD nameservers from the following providers/locations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Contabo - New York and Düsseldorf&lt;/li&gt;
&lt;li&gt;Hetzner - Falkenstein, Ashburn, and Singapore&lt;/li&gt;
&lt;li&gt;Vultr - Amsterdam, Los Angeles, and Singapore&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These nodes are in key cities where peering/interconnection happens. Latency from these to ccTLD auth ns can determine whether they are anycasted or not. Finding the exact number of anycast nodes is hard and need a lot more distributed measurements but one can safely assume that if an IP is anycasted across the US, EU, and Asia, one should be able to reach it in less than 80ms from these locations (more like within 40-50ms actually). If I get low latency from one provider and high from other, I consider that it proves that an anycast node exists and it&amp;rsquo;s just bad routing &lt;em&gt;(which I am not measuring here).&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;result-of-cctld-anycast-check&#34;&gt;Result of ccTLD anycast check&lt;/h3&gt;
&lt;p&gt;The table below reflects the results. I have categorized into three simple categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All NS anycasted - All nameservers for the given ccTLD are anycasted and reachable with low latency.&lt;/li&gt;
&lt;li&gt;At least one NS doing anycast - This is a case where I see some nameservers giving consistently low latency from the US, EU &amp;amp; Singapore, but some with high. In most cases, it&amp;rsquo;s basically non-anycasted own servers and anycasted servers of commercial/non-profit providers.&lt;/li&gt;
&lt;li&gt;None of the NS is doing anycast - All nameservers have above 80ms latency when checked from the US, EU, and Singapore &lt;em&gt;(at least two of these regions, usually lower latency where closer to the ccTLD origin country)&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ccTLD&lt;/th&gt;
          &lt;th&gt;Category&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;aw&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bh&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fm&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fo&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gd&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;in&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;la&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nl&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pw&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;to&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vg&lt;/td&gt;
          &lt;td&gt;All NS anycasted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ac&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ad&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ae&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;af&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ag&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ai&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;al&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;am&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ao&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;aq&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ar&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;as&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;at&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;au&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ax&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;az&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ba&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bb&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bd&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;be&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bf&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bi&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bj&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bl&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bo&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;br&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bs&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ca&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cd&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cf&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ch&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ci&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cl&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;co&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cv&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cx&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cy&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;de&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dj&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;do&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ec&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ee&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;eg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;er&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;es&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;eu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fi&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ga&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gb&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gf&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gi&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gl&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gp&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gq&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gy&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ht&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;id&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ie&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;il&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;im&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;io&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;iq&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ir&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;is&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;it&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;je&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jo&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jp&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ke&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kh&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ki&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ky&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lb&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;li&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ls&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lv&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ly&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ma&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;md&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;me&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mh&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ml&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mo&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mq&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ms&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mv&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mx&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;my&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;na&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ne&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nf&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ng&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ni&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;no&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;np&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;om&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pa&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pe&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ph&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pl&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ps&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;py&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;qa&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;re&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ro&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rs&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ru&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sa&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sb&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sd&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;se&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sh&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;si&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sj&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;so&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;st&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sv&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sx&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sy&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;td&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tg&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;th&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tj&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tl&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tr&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tv&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ua&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ug&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;uk&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;us&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;uy&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;uz&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;va&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vc&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ve&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vi&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vn&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vu&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wf&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ws&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ye&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;yt&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;za&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;zm&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;zw&lt;/td&gt;
          &lt;td&gt;Atleast one NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;by&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ck&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;et&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ge&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gh&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;km&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kr&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pf&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sr&lt;/td&gt;
          &lt;td&gt;None of NS doing anycast&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I was partially correct (and partially incorrect). The majority of ccTLDs are not using anycast on all their nameservers but are using anycast on atleast one of their nameserver. As per this list, nameservers of 11 ccTLDs have full anycast, 9 have no anycast, and the remaining 219 have partial anycast, with some nameservers doing anycast, some not. Also, some ccTLDs are skipped from the list where all nameservers have ICMP closed. I should have probably tested with DNS latency instead of ICMP latency only.&lt;/p&gt;
&lt;p&gt;The raw latency checks are &lt;a href=&#34;https://cdn.anuragbhatia.com/web/post/2025/08/analysing-ccTLD-anycast/ccTLD-lookup-data.csv&#34;&gt;posted here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analysing Starlink&#39;s upstreams in India</title>
      <link>https://anuragbhatia.com/post/2025/08/starlink-upstreams-in-india/</link>
      <pubDate>Thu, 07 Aug 2025 03:54:35 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/08/starlink-upstreams-in-india/</guid>
      <description>&lt;p&gt;On 10th July, Starlink was approved by the Indian Govt as reported in various &lt;a href=&#34;https://economictimes.indiatimes.com/industry/telecom/telecom-news/elon-musks-starlink-receives-indias-final-regulatory-nod-for-launch-sources-say/articleshow/122340614.cms?from=mdr&#34;&gt;news articles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In past I was tracking their GeoIP allocation sheet, but lost track of it over time as my tracking system was broken. Yesterday saw their IP allocations for Mumbai:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;anurag@desktop ~&amp;gt; curl -s https://geoip.starlinkisp.net/feed.csv | grep Mumbai
150.228.128.0/24,IN,IN-MH,Mumbai,
150.228.129.0/24,IN,IN-MH,Mumbai,
150.228.130.0/24,IN,IN-MH,Mumbai,
150.228.131.0/24,IN,IN-MH,Mumbai,
150.228.132.0/24,IN,IN-MH,Mumbai,
150.228.133.0/24,IN,IN-MH,Mumbai,
150.228.164.0/24,IN,IN-MH,Mumbai,
150.228.165.0/24,IN,IN-MH,Mumbai,
150.228.166.0/24,IN,IN-MH,Mumbai,
150.228.167.0/24,IN,IN-MH,Mumbai,
2406:2d40:2800::/40,IN,IN-MH,Mumbai,
2406:2d40:2900::/40,IN,IN-MH,Mumbai,
2406:2d40:2a00::/40,IN,IN-MH,Mumbai,
2406:2d40:2b00::/40,IN,IN-MH,Mumbai,
anurag@desktop ~&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As of now, they have 10 x /24s IPv4 and 4 x /40 IPv6. Let&amp;rsquo;s explore the BGP announcement of these prefixes:&lt;/p&gt;
&lt;p&gt;The first 4 are visible in the aggregate announcement of 150.228.128.0/22, the next four in 150.228.132.0/23 &amp;amp; 150.228.166.0/23. All these are visible in the global routing table. Due to Indian norms, these must be routed from within India. In simpler terms Starlink cannot beam internet in India while using ground stations from outside of India.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;upstream-for-starlink-gateway-in-india&#34;&gt;Upstream for Starlink gateway in India&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/08/starlink-upstreams-in-india/startlink-prefix1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&#34;https://bgp.he.net/net/150.228.128.0/22#_graph&#34;&gt;https://bgp.he.net/net/150.228.128.0/22#_graph&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/08/starlink-upstreams-in-india/startlink-prefix2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&#34;https://bgp.he.net/net/150.228.132.0/23#_graph&#34;&gt;https://bgp.he.net/net/150.228.132.0/23#_graph&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/08/starlink-upstreams-in-india/startlink-prefix3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&#34;https://bgp.he.net/net/150.228.166.0/23#_graph&#34;&gt;https://bgp.he.net/net/150.228.166.0/23#_graph&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thus they seem to be having &lt;strong&gt;Reliance Jio&lt;/strong&gt; (AS55836) and &lt;strong&gt;Telstra&lt;/strong&gt; (AS4637) as upstreams in India.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;quick-points-on-their-transit&#34;&gt;Quick points on their transit&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Starlink seems to be using Jio &amp;amp; Telstra both for global reach. For domestic routing with Jio, it is via their Jio transit.&lt;/li&gt;
&lt;li&gt;For domestic routing with other major networks - Airtel &amp;amp; Tata Comm - it seems to be via Telstra. I see announcements of Starlink behind Tata Comm AS4755 as well as to Airtel directly within India. All these are on the downstream side of Airtel &amp;amp; Tata Comm. So &lt;strong&gt;Startlink is an indirect customer of Airtel &amp;amp; Tata Comm in India&lt;/strong&gt; for now.&lt;/li&gt;
&lt;li&gt;Jio + Airtel + Tata Comm largely form the Indian routing table, as the majority of Indian routes are in the downstream of these networks. With these, they should be able to reach the majority of local networks. May still get some odd issues with Vodafone IDEA, Sify and BSNL, though, depending on whether the network of those prefixes is announced in domestic BGP sessions with Jio/Airtel/Tata Comm mix or not.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3 id=&#34;telstra-transit-location&#34;&gt;Telstra transit location&lt;/h3&gt;
&lt;p&gt;How to know if Telstra&amp;rsquo;s drop is within India? Well, their routing table as viewed from their &lt;a href=&#34;https://lg.telstraglobal.com/&#34;&gt;looking glass&lt;/a&gt; gives hints.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/08/starlink-upstreams-in-india/telstra-lg1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Notice the tag &lt;strong&gt;4637:30310&lt;/strong&gt;. This matches 4637:3xx10,India as listed in the Telstra BGP community reference &lt;a href=&#34;https://github.com/NLNOG/lg.ring.nlnog.net/blob/main/communities/as4637.txt&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;trace-from-airtel-to-starlink&#34;&gt;Trace from Airtel to Starlink&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a trace from Airtel FTTH in Haryana to Starlink Mumbai:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  1. AS???    172.16.36.1 (172.16.36.1)                             0.0%    10    0.2   0.3   0.2   0.4   0.1
  2. AS???    10.240.9.204 (10.240.9.204)                           0.0%    10    4.5   9.2   4.5  25.1   6.7
  3. AS???    172.31.0.195 (172.31.0.195)                           0.0%    10    5.2  16.8   5.2  56.7  15.0
  4. AS9498   173.168.18.125.dhcp.anaronline.net (125.18.168.173)   0.0%    10    5.3   6.4   4.7   8.4   1.3
  5. AS9498   116.119.33.34 (116.119.33.34)                         0.0%    10   31.1  35.4  29.4  47.8   6.9
  6. AS9498   nsg-static-042.114.72.182.airtel.in (182.72.114.42)   0.0%    10   29.8  30.6  29.3  32.0   0.9
  7. AS4637   194.50.57.210.adispace.co.jp (210.57.50.194)          0.0%    10   30.3  29.7  28.4  32.0   1.0
  8. AS14593  undefined.hostname.localhost (206.224.75.121)         0.0%    10   29.6  30.0  28.4  31.9   1.0
  9. AS14593  undefined.hostname.localhost (206.224.75.165)         0.0%    10   30.4  30.4  29.2  32.4   1.0
 10. AS???    ???                                                  100.0    10    0.0   0.0   0.0   0.0   0.0
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3 id=&#34;connectivity-with-tata-comm&#34;&gt;Connectivity with Tata Comm&lt;/h3&gt;
&lt;p&gt;Telstra AS4637 outside of India usually seems to be a peer of Tata Comm AS6453; however, in this setup, they seem to be a customer of Tata Comm domestic AS4755 to route these prefixes.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SELECT prefix, as_path
FROM bgp.table
WHERE toDate(timestamp) = today() AND hasAll(as_path, [14593, 4755]) AND as_path[1] = 6453

Query id: 10b94036-1549-4111-817e-2bd59a6454b8

   ┌─prefix──────────────┬─as_path────────────────┐
1. │ 2406:2d40:2800::/40 │ [6453,4755,4637,14593] │
2. │ 2406:2d40:2900::/40 │ [6453,4755,4637,14593] │
3. │ 2406:2d40:2a00::/40 │ [6453,4755,4637,14593] │
4. │ 2406:2d40:2b00::/40 │ [6453,4755,4637,14593] │
   └─────────────────────┴────────────────────────┘
   ┌─prefix──────────────┬─as_path────────────────┐
5. │ 2605:59c0:5035::/48 │ [6453,4755,4637,14593] │
   └─────────────────────┴────────────────────────┘
   ┌─prefix───────────┬─as_path────────────────┐
6. │ 144.126.110.0/24 │ [6453,4755,4637,14593] │
7. │ 144.126.77.0/24  │ [6453,4755,4637,14593] │
8. │ 144.126.78.0/24  │ [6453,4755,4637,14593] │
   └──────────────────┴────────────────────────┘
    ┌─prefix───────────┬─as_path────────────────┐
 9. │ 150.228.128.0/22 │ [6453,4755,4637,14593] │
10. │ 150.228.132.0/23 │ [6453,4755,4637,14593] │
    └──────────────────┴────────────────────────┘
    ┌─prefix──────────────┬─as_path────────────────┐
11. │ 2406:2d40:2800::/40 │ [6453,4755,4637,14593] │
12. │ 2406:2d40:2900::/40 │ [6453,4755,4637,14593] │
13. │ 2406:2d40:2a00::/40 │ [6453,4755,4637,14593] │
14. │ 2406:2d40:2b00::/40 │ [6453,4755,4637,14593] │
    └─────────────────────┴────────────────────────┘
    ┌─prefix───────────┬─as_path────────────────┐
15. │ 144.126.110.0/24 │ [6453,4755,4637,14593] │
16. │ 144.126.77.0/24  │ [6453,4755,4637,14593] │
17. │ 144.126.78.0/24  │ [6453,4755,4637,14593] │
    └──────────────────┴────────────────────────┘
    ┌─prefix──────────────┬─as_path────────────────┐
18. │ 2605:59c0:5035::/48 │ [6453,4755,4637,14593] │
    └─────────────────────┴────────────────────────┘
    ┌─prefix───────────┬─as_path────────────────┐
19. │ 150.228.128.0/22 │ [6453,4755,4637,14593] │
20. │ 150.228.132.0/23 │ [6453,4755,4637,14593] │
    └──────────────────┴────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog and hence posts made here are in my personal capacity. These do not represent the views of my employer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Understanding erasure coding</title>
      <link>https://anuragbhatia.com/post/2025/07/understanding-erasure-coding/</link>
      <pubDate>Sun, 27 Jul 2025 14:38:17 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/07/understanding-erasure-coding/</guid>
      <description>&lt;p&gt;Over time, I went down the rabbit hole of reading about erasure coding on cloud platforms. It&amp;rsquo;s quite interesting how these players promise 99.999999999% (that’s eleven 9s) of durability for the stored data.&lt;/p&gt;
&lt;p&gt;While Backblaze &lt;a href=&#34;https://www.backblaze.com/docs/cloud-storage-resiliency-durability-and-availability&#34;&gt;documents this&lt;/a&gt; to great detail on their 17+3 (or 15+5) storage design, AWS S3 so far has been a mystery. They provide extensive documentation on their user-facing APIs and interfaces, but offer little insight into the limitations behind their design choices. Their presentation at AWS re:Invent 2024 talks about some of it in detail. Must say that their re:Invent is way more interesting than their documentation. 😀&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/NXehLy7IiPM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=2275&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;erasure-coding&#34;&gt;Erasure coding&lt;/h3&gt;
&lt;p&gt;The basic idea behind erasure coding is that drives can fail at any time, and hence, redundancy is needed. One way to have redundancy is to have an exact copy on another disk.&lt;/p&gt;
&lt;p&gt;Imagine disk01 and disk02 - both holding the exact same set of bits. Now, if disk01 fails, disk02 will be the only one holding the data. Single disk failures are quite common at scale, and it&amp;rsquo;s too risky to be holding critical data on disk02 alone for now and that too when it has to be completely read to rebuild the copy. This brings the idea to three copies - store data in disk01, disk02 and disk03.&lt;/p&gt;
&lt;p&gt;This works in theory, but has two major challenges:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If two disks go down, data will be at major risk&lt;/li&gt;
&lt;li&gt;Storage cost has gone 3x.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To address the first challenge, one can add another disk, and now we have disk01, disk02, disk03 and disk04 - each holding the exact same data, and one can lose up to three of them, which is quite reasonable, but this worsens the other issue as now to store x, we are using 4x capacity. To solve this, most storage systems at scale use erasure coding. The idea is to break data into chunks &amp;amp; pass through a pre-defined algorithm and mathematically calculate parity data (often called shards).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/07/understanding-erasure-coding/Data-Parity-shards1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the case of Backblaze design, they break files into 17 pieces (17 data shards) and calculate 3 parity bits (3 data shards). Each of these shards (whether data or parity) is of the same size as the others, and any 17 of these in any mix can reproduce the original data. Thus, storing 20 (17+3) shards across 20 different disks gives the ability to lose up to three drives without losing data. This provides the same fault tolerance as storing 4 identical copies, but &lt;strong&gt;instead of 4x storage, it&amp;rsquo;s just 1.18x storage, which is the real magic&lt;/strong&gt;. Thus, for around 17.65% overhead on storage, this gives the ability to lose up to three drives without losing data.&lt;/p&gt;
&lt;p&gt;In case of AWS S3 (as given in the presentation), they do a 5+4 design (5 data shards, 4 parity shards), giving them 9 shards. They likely went for this because of a number of factors, with one being a number which can be evenly divided by 3. That way, they can store 3+3+3 shards across three different data centres and need only any 5 shards to rebuild the original data.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;tradeoff-between-shard-count-and-storage-overhead&#34;&gt;Tradeoff between shard count and storage overhead&lt;/h3&gt;
&lt;p&gt;This 5+4 = 9 shards may make one wonder - why not 5+1 = 6 and store 2 + 2 + 2 in each failure zone and store 6 in each zone. Each design: More shards vs Fewer shards — has its own advantages.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s compare a 5+4 Vs 5+1. The number of shards needed to recover data in 5+4 is 5, while in 5+1 it is also 5. This means if all shards are spread around different hard disks, one can lose 4 HDDs in a 5+4 design but only 1 in a 5+1 design. More than 1 HDD loss will cause data loss. Thus, the number of shards fewer than 3 - 4 can be hard (as that&amp;rsquo;s what defines acceptable HDD failure).&lt;/p&gt;
&lt;p&gt;What about high shard count? Why not 11+7 = 18 shards, with 6 going to each failure zone? In case of 11+7, they can lose up to 7 disks with no data loss; however, it will take much more CPU. Also, spreading data to more disks will risk overloading I/O across many disks without much return. Another factor is storage overhead.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a table to calculate overhead in these configs:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Scheme&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Data Shards&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Parity Shards&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Disk Failure Tolerance&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Storage Overhead&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;17+3&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;17&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;3&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;3&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;17.65% (3/17)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;15+5&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;15&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;33.33% (5/15)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5+4&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;4&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;4&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;80% (4/5)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;11+7&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;11&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;7&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;7&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;63.64% (7/11)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;11+10&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;11&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;10&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;10&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;90.91% (10/11)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;Backblaze once in &lt;a href=&#34;https://www.backblaze.com/blog/how-backblaze-scales-our-storage-cloud/&#34;&gt;their post&lt;/a&gt; in 2024 mentioned:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The ratios of data shards to parity shards we currently use are 17/3, 16/4, and 15/5, depending primarily on the size of the drives being used to store the data—the larger the drive, the higher the parity.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This had to do with restore times. For higher capacity drives (16TB), restore time is much higher than a 4TB drive. Thus, when a drive fails in a 17+3 design, they are effectively on 17+2 for a few days. Doing a 15+5 allows them to have tolerance up to 5 disk failures, but for 33.3% overhead (instead of 17.6%).&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;playing-with-erasure-coding&#34;&gt;Playing with erasure coding&lt;/h3&gt;
&lt;p&gt;Most of these systems are built on &lt;a href=&#34;http://www.cs.cmu.edu/~guyb/realworld/reedsolomon/reed_solomon_codes.html&#34;&gt;Reed-Solomon codes&lt;/a&gt;. There are many open source implementations available for it, including from Backblaze - &lt;a href=&#34;https://github.com/Backblaze/JavaReedSolomon&#34;&gt;JavaReedSolomon&lt;/a&gt;, &lt;a href=&#34;https://github.com/egbakou/reedsolomon&#34;&gt;Go implementation&lt;/a&gt; and Python library - &lt;a href=&#34;https://pypi.org/project/pyeclib/#description&#34;&gt;pyeclib&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Product-wise, these concepts are available in open source &lt;a href=&#34;https://min.io/docs/minio/container/operations/concepts/erasure-coding.html&#34;&gt;Minio&lt;/a&gt; if one is planning to self-host with erasure coding.&lt;/p&gt;
&lt;p&gt;I picked up pyeclib and tried with &lt;a href=&#34;https://github.com/openstack/pyeclib/tree/master/tools&#34;&gt;tools from openstack&lt;/a&gt;, which provide scripts for simple encode/decode etc.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; python3 pyeclib_encode.py --help
usage: pyeclib_encode.py [-h] k m ec_type file_dir filename fragment_dir

Encoder for PyECLib.

positional arguments:
  k             number of data elements
  m             number of parity elements
  ec_type       EC algorithm used
  file_dir      directory with the file
  filename      file to encode
  fragment_dir  directory to drop encoded fragments

options:
  -h, --help    show this help message and exit 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s generate a dummy 1GB file, calculate its checksum, break it into 17+3, restore and do checksum again.&lt;/p&gt;
&lt;br /&gt;
&lt;h4 id=&#34;create-a-test-file&#34;&gt;Create a test file&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; dd if=/dev/zero of=output_1GB_file.bin bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.1953 s, 898 MB/s

&amp;gt; sha256sum output_1GB_file.bin 
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14  output_1GB_file.bin
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Now let&amp;rsquo;s create shards for it based on &lt;a href=&#34;https://github.com/openstack/liberasurecode&#34;&gt;liberasurecode&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; mkdir shards_17_3

&amp;gt; python3 pyeclib_encode.py 17 3 liberasurecode_rs_vand . output_1GB_file.bin shards_17_3
k = 17, m = 3
ec_type = liberasurecode_rs_vand
filename = output_1GB_file.bin

&amp;gt; ls shards_17_3
output_1GB_file.bin.0   output_1GB_file.bin.11  output_1GB_file.bin.14  output_1GB_file.bin.17  output_1GB_file.bin.2  output_1GB_file.bin.5  output_1GB_file.bin.8
output_1GB_file.bin.1   output_1GB_file.bin.12  output_1GB_file.bin.15  output_1GB_file.bin.18  output_1GB_file.bin.3  output_1GB_file.bin.6  output_1GB_file.bin.9
output_1GB_file.bin.10  output_1GB_file.bin.13  output_1GB_file.bin.16  output_1GB_file.bin.19  output_1GB_file.bin.4  output_1GB_file.bin.7

&amp;gt; du -s output_1GB_file.bin
1048580	output_1GB_file.bin

&amp;gt; du -s shards_17_3
1233684	shards_17_3
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Thus, size went up by 185104 bytes (&lt;strong&gt;17.65% overhead&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s randomly delete three shards and recover data:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; rm shards_17_3/output_1GB_file.bin.0 
&amp;gt; rm shards_17_3/output_1GB_file.bin.10
&amp;gt; rm shards_17_3/output_1GB_file.bin.19 

&amp;gt; python3 pyeclib_decode.py 17 3 liberasurecode_rs_vand shards_17_3/output_1GB_file.bin.1 shards_17_3/output_1GB_file.bin.2 shards_17_3/output_1GB_file.bin.3 shards_17_3/output_1GB_file.bin.4 shards_17_3/output_1GB_file.bin.5 shards_17_3/output_1GB_file.bin.6 shards_17_3/output_1GB_file.bin.7 shards_17_3/output_1GB_file.bin.8 shards_17_3/output_1GB_file.bin.9 shards_17_3/output_1GB_file.bin.11 shards_17_3/output_1GB_file.bin.12 shards_17_3/output_1GB_file.bin.13 shards_17_3/output_1GB_file.bin.14 shards_17_3/output_1GB_file.bin.15 shards_17_3/output_1GB_file.bin.16 shards_17_3/output_1GB_file.bin.17 shards_17_3/output_1GB_file.bin.18 recovered-output_1GB_file.bin
k = 17, m = 3
ec_type = liberasurecode_rs_vand
fragments = [&amp;#39;shards_17_3/output_1GB_file.bin.1&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.2&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.3&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.4&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.5&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.6&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.7&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.8&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.9&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.11&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.12&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.13&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.14&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.15&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.16&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.17&amp;#39;, &amp;#39;shards_17_3/output_1GB_file.bin.18&amp;#39;]
filename = recovered-output_1GB_file.bin

&amp;gt; sha256sum recovered-output_1GB_file.bin.decoded 
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14  recovered-output_1GB_file.bin.decoded
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;And here&amp;rsquo;s one similar to what AWS S3 uses:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; mkdir shards_5_4

&amp;gt; python3 pyeclib_encode.py 5 4 liberasurecode_rs_vand . output_1GB_file.bin shards_5_4/
k = 5, m = 4
ec_type = liberasurecode_rs_vand
filename = output_1GB_file.bin

&amp;gt; du -s shards_5_4/
1887448	shards_5_4/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1887448 bytes (&lt;strong&gt;80% overhead&lt;/strong&gt;), which may seem high, but once we consider it&amp;rsquo;s better than 4x storage and with distribution of 3+3+3 shards in each failure zone, AWS can bear the loss of a full zone and even an additional loss of one shard in the remaining DC and still recover the data.&lt;/p&gt;
&lt;p&gt;Storage is fascinating. 😀&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloudflare DNS outage &amp; BGP route hijack</title>
      <link>https://anuragbhatia.com/post/2025/07/cloudflare-dns-outage/</link>
      <pubDate>Wed, 16 Jul 2025 01:40:00 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/07/cloudflare-dns-outage/</guid>
      <description>&lt;p&gt;Yesterday was quite an eventful day on the internet with an outage on Cloudflare&amp;rsquo;s public DNS - 1.1.1.1. One can say impact is high when even Indian media starts reporting it (like &lt;a href=&#34;https://www.hindustantimes.com/world-news/cloudflare-dns-outage-multiple-websites-on-1-1-1-1-server-down-company-reacts-101752533050143.html&#34;&gt;this&lt;/a&gt; and &lt;a href=&#34;https://www.timesnownews.com/world/cloudflare-dns-outage-latest-update-thousands-affected-as-1-1-1-1-public-resolver-faces-issues-article-152280432&#34;&gt;this&lt;/a&gt;). 😀&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/07/Cloudflare-DNS-outage/cf-outage.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href=&#34;https://community.cloudflare.com/t/issues-with-1-1-1-1-public-resolver/816872&#34;&gt;Cloudflare community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Status doesn&amp;rsquo;t tell much and there has been speculation on BGP hijack by Tata Comm Indian network AS4755 causing it. Cloudflare&amp;rsquo;s own tool (unrelated to their DNS) &lt;a href=&#34;https://radar.cloudflare.com/routing/anomalies/hijack-107469&#34;&gt;reported&lt;/a&gt; that Tata Comm AS4755 originated 1.1.1.0/24 for a period of 7 minutes. The timeline here is interesting. Tata Comm&amp;rsquo;s hijack ended at 22:01 while Cloudflare reports issues with 1.1.1.1 at 22:13 but routing-wise it doesn&amp;rsquo;t make any sense. Hijack of Cloudflare prefix by Tata Comm cannot cause such a widespread outage.&lt;/p&gt;
&lt;p&gt;For prefix hijack it always makes sense to look at the AS_PATH before coming to a conclusion as in theory one can hijack a prefix by using AS4755 in origin in the AS_PATH and if BGP adjacencies do not filter, they will pick it up. Let&amp;rsquo;s look for 1.1.1.0/24 via RIPE BGPPlay for this duration. &lt;a href=&#34;https://stat.ripe.net/bgplay/1.1.1.0%2F24#starttime=1752530040&amp;amp;endtime=1752530519&amp;amp;rrcs=0%2C1%2C3%2C4%2C5%2C6%2C7%2C10%2C11%2C12%2C13%2C15%2C16%2C18%2C19%2C20%2C21%2C22%2C23%2C24%2C25%2C26&amp;amp;instant=934%2C1752530095&#34;&gt;This link&lt;/a&gt; should load BGPplay with an exact time filter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/07/Cloudflare-DNS-outage/AS6453-AS4755-cf.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;RIPE RIS Collector RRC03 - Amsterdam shows 1.1.1.0/24 with path 6453 4755. This is a real route as AS6453 directly feeds RRC03.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;limited-route-propagation&#34;&gt;Limited route propagation&lt;/h3&gt;
&lt;p&gt;While the announcement was bad but the impact would be extremely low and cannot cause a global outage. Here&amp;rsquo;s why:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cloudflare AS13335 is directly connected to all major backbones and announcing 1.1.1.0/24 directly. The only exception to this is German Deutsche Telekom - DTAG AS3320. Most of them consider Cloudflare as a customer (some as a peer). All of them consider Tata Comm a peer. Thus they would either have high local pref on Cloudflare (where Cloudflare is downstream) compared to Tata Comm (a peer) or the same localpref on Cloudflare (a peer) vs Tata Comm (also a peer).&lt;/li&gt;
&lt;li&gt;RPKI validation would drop invalid hijacked announcement by many large networks.&lt;/li&gt;
&lt;li&gt;The majority of small to mid-sized networks are peered to Cloudflare directly &amp;amp; hence would pick that route over the route of Cloudflare coming via AS6453 &amp;gt; AS4755 path except &lt;strong&gt;a)&lt;/strong&gt; Non-Cloudflare peer downstream networks of Tata Comm AS4755 in India and &lt;strong&gt;b)&lt;/strong&gt; DTAG AS3320.&lt;/li&gt;
&lt;li&gt;Tata Comm would normally treat both - their domestic Indian network AS4755 and Cloudflare AS13335 as downstream of AS6453 and hence with the same local preference. Thus if AS13335 announcement is up, likely AS4755 route will not show up outside of India.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;domestic-indian-routing-with-as4755&#34;&gt;Domestic Indian routing with AS4755&lt;/h3&gt;
&lt;p&gt;This is a classic case of hijack of the route of a well-peered network (Cloudflare) by a transit-free network (selective peering) and hence quite tricky to detect. As long as the Cloudflare announcement is up, the majority of public collectors outside of India will not get it.&lt;/p&gt;
&lt;p&gt;Since it&amp;rsquo;s from AS4755, route announcement at NIXI Chennai by AS4755 as picked by PCH collector on 14 July 2025 - &lt;a href=&#34;https://www.pch.net/resources/Raw_Routing_Data/route-collector.maa.pch.net/2025/07/14/&#34;&gt;route-collector.maa.pch.net&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Timestamp (GMT)&lt;/th&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;BGP Adjacency&lt;/th&gt;
          &lt;th&gt;Prefix&lt;/th&gt;
          &lt;th&gt;AS_PATH&lt;/th&gt;
          &lt;th&gt;BGP Communities&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;9:50:07 PM&lt;/td&gt;
          &lt;td&gt;Announcement&lt;/td&gt;
          &lt;td&gt;24029&lt;/td&gt;
          &lt;td&gt;1.1.1.0/24&lt;/td&gt;
          &lt;td&gt;24029 4755 13335&lt;/td&gt;
          &lt;td&gt;4755:25 4755:44 4755:199 4755:888 4755:2000 4755:40018 4755:47556 6453:9636&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9:53:06 PM&lt;/td&gt;
          &lt;td&gt;Withdrawal&lt;/td&gt;
          &lt;td&gt;24029&lt;/td&gt;
          &lt;td&gt;1.1.1.0/24&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9:53:38 PM&lt;/td&gt;
          &lt;td&gt;Announcement&lt;/td&gt;
          &lt;td&gt;24029&lt;/td&gt;
          &lt;td&gt;1.1.1.0/24&lt;/td&gt;
          &lt;td&gt;24029 4755&lt;/td&gt;
          &lt;td&gt;4755:44 4755:99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10:19:53 PM&lt;/td&gt;
          &lt;td&gt;Announcement&lt;/td&gt;
          &lt;td&gt;24029&lt;/td&gt;
          &lt;td&gt;1.1.1.0/24&lt;/td&gt;
          &lt;td&gt;24029 4755 13335&lt;/td&gt;
          &lt;td&gt;4755:25 4755:44 4755:199 4755:888 4755:2000 4755:40018 4755:47556 6453:9636&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10:19:55 PM&lt;/td&gt;
          &lt;td&gt;Announcement&lt;/td&gt;
          &lt;td&gt;24029&lt;/td&gt;
          &lt;td&gt;1.1.1.0/24&lt;/td&gt;
          &lt;td&gt;24029 4755 13335&lt;/td&gt;
          &lt;td&gt;4755:25 4755:44 4755:199 4755:888 4755:2000 4755:40018 4755:47556 6453:9636&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BGP community 4755:44 - 44 here is likely Chennai (STD code of Chennai - Tata Comm &amp;amp; Airtel both use STD codes in their BGP communities).  This is a bit strange as there is clearly visible withdrawal of Cloudflare&amp;rsquo;s announcement at 9:53:06 PM and within 22 seconds there was origination by AS4755. This cannot be manual and as already guessed my friend Doug Madory in &lt;a href=&#34;https://x.com/DougMadory/status/1944914535518765492&#34;&gt;his tweet&lt;/a&gt; - I also think that AS4755 announcement was already there and was normally suppressed. It showed up when AS13335 pulled its announcement for whatever internal issue they had. Possibly Tata Comm AS4755 has high localpref on eBGP routes compared to locally originated routes. The majority of networks set high localpref on downstream routes but sometimes do not match localpref on locally originated routes.&lt;/p&gt;
&lt;p&gt;Likely that announcement is still there inside AS4755 but just suppressed for now. In past, I have seen 1.1.1.1 Anycast broken on Tata Comm. It always routes it via Chennai. Wonder if it&amp;rsquo;s related. Hard to know for sure since the AS4755 looking glass has been broken for years.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;run-your-own-dns-resolvers&#34;&gt;Run your own DNS resolvers!&lt;/h3&gt;
&lt;p&gt;This is also a reminder to various network operators, datacenter and Cloud players - run your own DNS resolvers. There&amp;rsquo;s no good reason to use 1.1.1.1 or 8.8.8.8 for your customers since there&amp;rsquo;s no SLA, no contact point involved with Cloudflare or Google. They may go down and worst - they can rate limit you anytime. A couple of unbound instances with anycast within your network can take you very far.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Disclaimer: This is my personal blog and hence posts made here are in my personal capacity.
These do not represent the views of my employer.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;update---15-july-2025&#34;&gt;Update - 15 July 2025&lt;/h3&gt;
&lt;p&gt;Cloudflare has shared some details of outage in &lt;a href=&#34;https://blog.cloudflare.com/cloudflare-1-1-1-1-incident-on-july-14-2025/&#34;&gt;this post&lt;/a&gt;. This confirms that their outage was not related to route hijack by AS4755.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On June 6, during a release to prepare a service topology for a future DLS service, a configuration error was introduced: the prefixes associated with the 1.1.1.1 Resolver service were inadvertently included alongside the prefixes that were intended for the new DLS service. This configuration error sat dormant in the production network as the new DLS service was not yet in use,  but it set the stage for the outage on July 14.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Change in Google&#39;s peering policy</title>
      <link>https://anuragbhatia.com/post/2025/07/change-in-googles-peering-policy/</link>
      <pubDate>Wed, 02 Jul 2025 03:49:10 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/07/change-in-googles-peering-policy/</guid>
      <description>&lt;p&gt;In the last few months, there&amp;rsquo;s been a constant discussion around Google&amp;rsquo;s change of peering policy. This has been across various ISP groups, NOG meetings etc. For those who may not know - Google has gone from &amp;ldquo;Open peering policy&amp;rdquo; into a &amp;ldquo;Selective peering policy&amp;rdquo; sometimes between &lt;a href=&#34;https://web.archive.org/web/20250214092615/https://www.peeringdb.com/net/433&#34;&gt;14 Feb 2025&lt;/a&gt; - &lt;a href=&#34;https://web.archive.org/web/20250306125300/https://www.peeringdb.com/net/433&#34;&gt;06 Mar 2025&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This initially started as &lt;a href=&#34;https://anuragbhatia.com/post/2024/04/google-to-stop-peering-via-rs/&#34;&gt;Google stop peering over the IXPs&lt;/a&gt; and that actually made technical sense.
Later more &amp;amp; more ISPs, content players started complaining about Google being closed on the peering front by either not responding, delaying and in some rare cases even rejecting peering requests. Today Dr. Peering on X pointed to Google&amp;rsquo;s presentation at NANOG 94 about the change in the peering policy.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Dave Schwartz from Google explaining Google’s peering policy and Verified Peering Provider (VPP) program at &lt;a href=&#34;https://twitter.com/hashtag/NANOG94?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#NANOG94&lt;/a&gt;. Found via LinkedIn, video here … &lt;a href=&#34;https://t.co/EGEVAR6MJc&#34;&gt;https://t.co/EGEVAR6MJc&lt;/a&gt; &lt;a href=&#34;https://t.co/z0suA2wlFJ&#34;&gt;pic.twitter.com/z0suA2wlFJ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Dr. Peering (@DrPeering) &lt;a href=&#34;https://twitter.com/DrPeering/status/1940159392571330973?ref_src=twsrc%5Etfw&#34;&gt;July 1, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;br /&gt;
&lt;p&gt;This is interesting as finally there&amp;rsquo;s an &lt;a href=&#34;https://storage.googleapis.com/site-media-prod/meetings/NANOG94/5452/20250609_Schwartz_Inside_Google_Peering__v1.pdf&#34;&gt;official presentation by Dave Schwartz&lt;/a&gt; on some of the challenges they had and what triggered them in this direction.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Yg-qV6Fktjw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;what-has-changed&#34;&gt;What has changed&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Google is not going to do bilateral peering over an IXP with any new network.&lt;/li&gt;
&lt;li&gt;They prefer 100G PNIs with networks with at least 10G traffic (Google -&amp;gt; Other network direction, peak 10G flow).&lt;/li&gt;
&lt;li&gt;For everyone who doesn&amp;rsquo;t fit into the 100G port model, they suggest coming via &lt;a href=&#34;https://peering.google.com/#/options/verified-peering-provider&#34;&gt;VPP&lt;/a&gt; which is simply a certification from Google that the given network is peered to them with different grades of redundancy (as defined by silver Vs gold status) or respective upstream IP transit provider.&lt;/li&gt;
&lt;li&gt;Google will not deploy (expensive) YouTube edge at smaller peering locations anymore.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3 id=&#34;some-quick-points-around-why-google-is-not-openly-anymore&#34;&gt;Some quick points around why Google is not openly anymore&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Ten years ago (2015) they were expanding, traffic flows were unpredictable and they needed a massive amount of bandwidth. In that mix, peering made sense (&lt;em&gt;besides many other things&lt;/em&gt;). Now in 2025, traffic growth is predictable, they already have a massive amount of peering with many players and (my guess) the peering situation of AS15169 is reaching a diminishing return.&lt;/li&gt;
&lt;li&gt;Google Cloud is now at the centre of everything - from investment to growth, from product to AI adoption. Essentially more peering with lower capacities is causing them planning issues as explained in slides 6 &amp;amp; 7. Running a small 10G port at an IX or even doing remote peering with a small transport wavelength can get parts of their edge congested at times.&lt;/li&gt;
&lt;li&gt;Their network expansion is driven by Google Cloud &amp;amp; not by YouTube anymore.&lt;/li&gt;
&lt;li&gt;Many of their Cloud customers are running VPN concentrators in Google Cloud and expect stable latency. They seem to be having transport challenges within the metro during (planned/unplanned) outages as well as random traffic spikes.&lt;/li&gt;
&lt;li&gt;They are pushing layer 2 IXPs to become layer 3 partial transit providers by enrolling in VPP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;does-it-make-technical-sense&#34;&gt;Does it make technical sense?&lt;/h3&gt;
&lt;p&gt;Things which he said technically make sense if we see them in isolation. But if we see the internet at large, many of those things are questionable.
Take e.g his latency spike case from NSW-IX (&lt;em&gt;New South Wales Internet Exchange&lt;/em&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/07/change-in-googles-peering-policy/AS15169-NSW-IX.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Surely Google can get edge port congested if they run a 10G port at an IX with at least 24 participants with over 100G capacity, 7 players with 40G and many players with 10G ports. It&amp;rsquo;s unclear from Dave&amp;rsquo;s presentation when this issue occurred but even if I check now their port size is just 20G at this IXP. If they simply do not add any new peers anymore - a congestion issue can still come from existing peers, especially from the internal transport network of their large peers which maintain a backbone.&lt;/p&gt;
&lt;p&gt;Why layer 2 peering was better than transit or even partial transit/layer 3 peering in the first place? That is because if we take a 100G wavelength or run 100G over dark fibre to Google, we know for sure that capacity exists and can be used. If I try to do the same via another layer 3 network in between (or even an MPLS circuit), there is no guarantee of the capacities involved. The link might be over an oversold transport.&lt;/p&gt;
&lt;p&gt;Technically VPP is simply &amp;ldquo;&lt;strong&gt;offloading congestion problem&lt;/strong&gt;&amp;rdquo; to someone else (large to mid-sized networks).&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;commercial-angle&#34;&gt;Commercial angle&lt;/h3&gt;
&lt;p&gt;Ultimately there&amp;rsquo;s a clear commercial angle to these decisions. Dave hints at that in his talk multiple times. From hints as well as from what we know from public data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cloud and AI growth needs massive networking resources in terms of engineering manpower, hardware, datacenter capacity etc and Google is trying to divert some of that from its peering ecosystem. Remember AI needs massive bandwidth within DC and super tiny with the internet-facing edge.&lt;/li&gt;
&lt;li&gt;The cost of borrowing money in the US has gone up significantly. 2015 was the time when everyone from Google to CDN players like Akamai/Fastly and many more were expanding fast. Money was &amp;ldquo;cheap&amp;rdquo; and hence many things were possible back then but not anymore.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://anuragbhatia.com/post/2024/05/analysis-of-google-routing-backbone/&#34;&gt;While Google may not be technically a tier 1 transit-free network&lt;/a&gt;, for all practical reasons it is. Their traffic volume numbers are not known but I would guess a super-tiny part of their traffic goes via their transit. Thus whether they peer with a smaller network or not, it has virtually no impact on their transit traffic. Only their traffic volume with the dominant incumbent would increase in that market.&lt;/li&gt;
&lt;li&gt;The cost of IP transit, peering, and hardware has declined over time but the cost of manpower has gone crazy. I am writing this post when &lt;a href=&#34;https://www.reuters.com/business/meta-hires-three-openai-researchers-wsj-reports-2025-06-26/&#34;&gt;just 5 days ago Meta hired three OpenAI researchers&lt;/a&gt; with bonuses of as high as $100 million. For Google spending $300k - $500k on engineers, the manpower cost is just huge compared to the money going on the other aspects of the network including peering.&lt;/li&gt;
&lt;li&gt;More and more traffic is getting concentrated over the years. Take e.g my home country India - Jio &amp;amp; Airtel have massive eyeballs. Google&amp;rsquo;s traffic once we exclude Airtel/Jio and a few other PNIs, is likely a low single-digit percentage. I can imagine it won&amp;rsquo;t be very different in many countries around the world with a very high concentration of eyeballs on a limited set of players. Imagine traffic in the US once you exclude AT&amp;amp;T, Verizon, T-Mobile. Comcast &amp;amp; a dozen more networks which already have the PNI.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;p&gt;So ultimately it will degrade things for a small set of networks (and their users) and it&amp;rsquo;s a calculated loss Google has decided to take with this strategic shift in peering. Many of us have seen a vibrant IXP ecosystem develop because of Google&amp;rsquo;s aggressive peering push. An interesting note 2015-2016 was such a crazy growth time that Mr Geoff Huston (&lt;em&gt;Scientist at APNIC and my good friend&lt;/em&gt;) even declared &amp;ldquo;&lt;a href=&#34;https://blog.apnic.net/2016/10/28/the-death-of-transit/&#34;&gt;death of transit&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;:
This is my personal blog and hence posts made here are in my personal capacity. &lt;br /&gt;
These do not represent the views of my employer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Common misconceptions about peering ecosystem in India</title>
      <link>https://anuragbhatia.com/post/2025/06/india-peering-misconceptions/</link>
      <pubDate>Wed, 11 Jun 2025 03:58:29 +0530</pubDate>
      
      <guid>https://anuragbhatia.com/post/2025/06/india-peering-misconceptions/</guid>
      <description>&lt;p&gt;Last week I attended &lt;a href=&#34;https://www.medianama.com/2025/06/223-peering-roadshow-india-2025/&#34;&gt;ISOC-Medianama peering roadshow&lt;/a&gt; in New Delhi. The core idea for the discussion was about &lt;a href=&#34;https://www.pib.gov.in/PressReleasePage.aspx?PRID=2104157&#34;&gt;TRAI&amp;rsquo;s recommendation to bring authorization&lt;/a&gt; to IXPs in India.&lt;/p&gt;
&lt;p&gt;Somehow during the discussion, the point about incumbents not peering in India kept on coming up. One of the presenters casually commented on how incumbents are not peering in India with smaller networks and thus smaller networks have to buy transit. This is technically incorrect and confuses peering with transit. During the panel discussion things again went in the direction of how the peering ecosystem is failing because incumbents do not peer at the local IXPs. In this post, I am going to explain these misconceptions in detail.&lt;/p&gt;
&lt;br /&gt;
&lt;h3 id=&#34;misconception-1-small-isps-need-transit-because-large-players-do-not-peer&#34;&gt;Misconception #1: Small ISPs need transit because large players do not peer&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s important to first understand the difference between peering and transit. Let&amp;rsquo;s say we have two networks: A and B. Here&amp;rsquo;s what happens if A peers with B Vs A buys IP transit from B:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Peering&lt;/th&gt;
          &lt;th&gt;IP Transit&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;A can only reach B (and customers of B). B can only reach A and customers A.&lt;/td&gt;
          &lt;td&gt;A can reach any network in the world via B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;A would get B&amp;rsquo;s own routes + customer routes only&lt;/td&gt;
          &lt;td&gt;A would get B&amp;rsquo;s own routes + B&amp;rsquo;s customer routes + B&amp;rsquo;s peer routes + B&amp;rsquo;s upstream routes&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I covered this concept long back in Oct 2020 at the INNOG Tech session. &lt;a href=&#34;https://cdn.anuragbhatia.com/web/pages/presentations/Routing-101.pdf&#34;&gt;Slides 6-11 here&lt;/a&gt; cover the difference in detail. By just peering a couple of Indian operators one would not get access to the full routing table and transit would still be needed. The only situation where peering will get access to the full routing table would be to peer with &lt;a href=&#34;https://en.wikipedia.org/wiki/Tier_1_network#List_of_Tier_1_networks&#34;&gt;all known transit-free tier 1 networks&lt;/a&gt; and all (except Tata Comm) in the list are not present in India let alone the closed peering policies. So the idea of someone serving within a city, state or even a single country would not be practical.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&#34;misconception-2-indian-peering-ecosystem-is-not-good-because-telcos-do-not-peer&#34;&gt;Misconception #2: Indian peering ecosystem is not good because telcos do not peer&lt;/h3&gt;
&lt;p&gt;Again, this point keeps coming up. It is often suggested that peering is bad because large telcos do not peer with smaller ISPs. In reality, the majority of traffic goes from content to eyeball ISP networks. The majority of content players present in India have an open peering policy &amp;amp; peer with a mix of PNI (Private Network Interconnect) and IX peering. Interestingly majority are peers of large incumbent networks. Thus their routes won&amp;rsquo;t even be visible to an ISP peer technically even if say Airtel/Jio agree to peer with a small ISP who is expecting content traffic.&lt;/p&gt;
&lt;p&gt;I am a supporter of an open peering policy, I prefer to buy my own home, and server connectivity from players with an open peering policy. But with that being said whether incumbent peers openly or not should not impact the peering ecosystem. Pick any large IXP in the world and see if incumbents in those countries are peering openly.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s pick some example IXPs from &lt;a href=&#34;https://github.com/tking/OneTeraBitClub&#34;&gt;Terabit club page&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;IXP&lt;/th&gt;
          &lt;th&gt;Dominant Incumbent&lt;/th&gt;
          &lt;th&gt;Peering policy of incumbent&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;DECIX Frankfurt&lt;/td&gt;
          &lt;td&gt;Deutsche Telekom&lt;/td&gt;
          &lt;td&gt;Restrictive (&lt;a href=&#34;https://www.peeringdb.com/asn/3320&#34;&gt;peeringdb&lt;/a&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Equinix Singapore&lt;/td&gt;
          &lt;td&gt;Singtel&lt;/td&gt;
          &lt;td&gt;Selective (&lt;a href=&#34;https://www.peeringdb.com/net/901&#34;&gt;peeringdb&lt;/a&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;LINX London&lt;/td&gt;
          &lt;td&gt;British Telecom&lt;/td&gt;
          &lt;td&gt;Restrictive (&lt;a href=&#34;https://www.peeringdb.com/net/118&#34;&gt;peeringdb&lt;/a&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;France IX&lt;/td&gt;
          &lt;td&gt;Orange&lt;/td&gt;
          &lt;td&gt;Restrictive (&lt;a href=&#34;https://www.peeringdb.com/net/495&#34;&gt;peeringdb&lt;/a&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Namex IXP Italy&lt;/td&gt;
          &lt;td&gt;Telecom Italia&lt;/td&gt;
          &lt;td&gt;Restrictive (&lt;a href=&#34;https://www.peeringdb.com/net/31&#34;&gt;peeringdb&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I can go on and on here. Whether incumbents have open or restrictive peering policies - the impact of that is on outbound heavy content players and not the eyeball ISPs in the ecosystem. This is specially true for hosting companies, smaller cloud players, VPS providers, datacenters etc.&lt;/p&gt;
&lt;p&gt;Decisions to peer or not should be left to free market decsion making. The only situation where it makes sense to force peering should be if ISPs have an exclusive last mile/termination monopoly (like some of the countries in the EU). In India, I guess BSNL at one point had it (&lt;em&gt;much before content peering even came into existence&lt;/em&gt;) but for now no one - BSNL, Airtel, Jio, ACT etc has termination monopoly rights in an area (as far as I know).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.anuragbhatia.com/web/post/2025/06/india-peering-misconceptions/peering-in-india.png&#34; width=&#34;720&#34; height=&#34;180&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Indian IX peering ecosystem has low traffic (&lt;em&gt;not the peering system outside of IXP&lt;/em&gt;) for the scale and size of the country because:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Low numbers of end users outside of PNI capacity&lt;/strong&gt; - There are close to 900 million mobile broadband users compared to just 41 million fixed-line users. And even in the fixed-line userbase of 41 million, 27.8% is Jio, 20.7% is Airtel, 10.5% BSNL, and 5.6% ACT and hence these top 4 players carry 67.6% of the broadband market. So what is left is just 32.4% of fixed-line or barely 13.2 million users on smaller players where IX peering would be useful. For the top 4 it&amp;rsquo;s mostly 100G PNIs with large content networks. It would probably extend to some players in that 32.4% bracket like my ex-employer Spectra, Excitel, Ishaan, Sify, Microscan etc. In the overall scheme of things ISPs serving 13.2 million need IX peering which accounts for just 1.4% of the overall user base (wireless+fixedline).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Availability of circuits &amp;amp; regulation&lt;/strong&gt; - More and more options should be encouraged to promote peering. One major roadblock to it is active infra-sharing. Take e.g if an ISP serving me in Haryana is building its dark fibre to Delhi to peer, they can light fibre for their own usage and peer but they cannot run DWDM and sell capacity without an expensive NLD / access license. Govt. should try to design a way to make 10G/100G wavelengths available in a radius of say 500-600Km from existing large peering hubs like Delhi, Mumbai, and Chenna over a mix of NOFN, Railtel, BSNL, Powergrid etc. The rest private sector would immediately put that sort of capacity to use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lack of India international peering hub&lt;/strong&gt; - Find out who peers at IXPs I put the above list - non-local networks!
Take e.g. DECIX Frankfurt where the majority of networks from Asia, the Middle East and Africa peer with content hosted in the EU. We should promote peering of ISPs from Nepal, Bhutan, Sri Lanka, UAE, Singapore (and Bangladesh once it&amp;rsquo;s stable again) at Indian IXPs. As of now some of it happens, some of it is grey area in Indian regulation, some of it is grey area in those respective countries regulation.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3 id=&#34;misconception-3-there-is-no-peering-outside-of-the-ixp-ecosystem-in-india&#34;&gt;Misconception #3: There is no peering outside of the IXP ecosystem in India&lt;/h3&gt;
&lt;p&gt;There is a massive amount of peering &amp;amp; caching outside of the IXP ecosystem in India. I often post about the growth of Facebook FNA caches. &lt;a href=&#34;https://anuragbhatia.com/post/2024/05/facebook-fna-update-2024-and-backbone-analysis/&#34;&gt;Last post from May 2024&lt;/a&gt; points out that Facebook FNA caches exist at 79 unique airport codes. The real number city-wise is much higher because many cities do not have airport codes. Take e.g. Airtel. They recently set up BNG in Ambala to serve users from Haryana moving off from the Mohali / Chandigarh tri-city area. Both the Mohali node and Ambala node carry the airport code of IXC (Chandigarh). As of now Airtel + Jio have Google/Facebook caches in almost all state capitals / large cities with BNG, along with quite a lot of Akamai nodes followed by PNIs for peering with large content players. The same is true for players like ACT Broadband. Thus it&amp;rsquo;s safe to say majority (80%+) of bit delivered in India come from a mix local caches within ISPs as well as their content peerings.&lt;/p&gt;
&lt;p&gt;Remember: Someone up the transit path there is always peering! &lt;br /&gt;
With hope that you reach one of my CDN edge caches hosted on VMs via peering to read this blog post, time for me to end this post.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: The views expressed on this blog are my own and do not reflect those of my employer.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>