stale echo packets don't keep a session up
(self)
| 1851 | self.assert_equal(len(events), 0, "number of bfd events") |
| 1852 | |
| 1853 | def test_stale_echo(self): |
| 1854 | """stale echo packets don't keep a session up""" |
| 1855 | |
| 1856 | if self.multihop: |
| 1857 | self.skipTest( |
| 1858 | f"Skipping because echo functionality is not supported with multihop" |
| 1859 | ) |
| 1860 | |
| 1861 | bfd_session_up(self) |
| 1862 | self.test_session.update(required_min_echo_rx=150000) |
| 1863 | self.vapi.bfd_udp_set_echo_source(sw_if_index=self.loopback0.sw_if_index) |
| 1864 | self.test_session.send_packet() |
| 1865 | # should be turned on - loopback echo packets |
| 1866 | echo_packet = None |
| 1867 | timeout_at = None |
| 1868 | timeout_ok = False |
| 1869 | for dummy in range(10 * self.vpp_session.detect_mult): |
| 1870 | p = self.pg0.wait_for_packet(1) |
| 1871 | if p[UDP].dport == BFD.udp_dport_echo: |
| 1872 | if echo_packet is None: |
| 1873 | self.logger.debug(ppp("Got first echo packet:", p)) |
| 1874 | echo_packet = p |
| 1875 | timeout_at = ( |
| 1876 | time.time() |
| 1877 | + self.vpp_session.detect_mult |
| 1878 | * self.test_session.required_min_echo_rx |
| 1879 | / USEC_IN_SEC |
| 1880 | ) |
| 1881 | else: |
| 1882 | self.logger.debug(ppp("Got followup echo packet:", p)) |
| 1883 | self.logger.debug(ppp("Looping back first echo packet:", p)) |
| 1884 | echo_packet[Ether].dst = self.pg0.local_mac |
| 1885 | self.pg0.add_stream(echo_packet) |
| 1886 | self.pg_start() |
| 1887 | elif p.haslayer(BFD): |
| 1888 | self.logger.debug(ppp("Got packet:", p)) |
| 1889 | if "P" in p.sprintf("%BFD.flags%"): |
| 1890 | final = self.test_session.create_packet() |
| 1891 | final[BFD].flags = "F" |
| 1892 | self.test_session.send_packet(final) |
| 1893 | if p[BFD].state == BFDState.down: |
| 1894 | self.assertIsNotNone( |
| 1895 | timeout_at, |
| 1896 | "Session went down before first echo packet received", |
| 1897 | ) |
| 1898 | now = time.time() |
| 1899 | self.assertGreaterEqual( |
| 1900 | now, |
| 1901 | timeout_at, |
| 1902 | "Session timeout at %s, but is expected at %s" |
| 1903 | % (now, timeout_at), |
| 1904 | ) |
| 1905 | self.assert_equal( |
| 1906 | p[BFD].diag, BFDDiagCode.echo_function_failed, BFDDiagCode |
| 1907 | ) |
| 1908 | events = self.vapi.collect_events() |
| 1909 | self.assert_equal(len(events), 1, "number of bfd events") |
| 1910 | self.assert_equal(events[0].state, BFDState.down, BFDState) |
nothing calls this directly
no test coverage detected