ripd: fix ip rip send/receive version command

Now the vtysh will reject illegal command `ip rip send/receive version 2 1`, instead accept command `ip rip send/receive version 1 2` as shown in doc.
Add topotest `rip_send_recv_version` test.
Signed-off-by: Shbinging <bingshui@smail.nju.edu.cn>
This commit is contained in:
Shbinging 2025-02-21 16:49:52 +08:00
parent bf8e4a3b83
commit 58f9bbb1c7
4 changed files with 104 additions and 4 deletions

View file

@ -744,18 +744,20 @@ void cli_show_ip_rip_v2_broadcast(struct vty *vty, const struct lyd_node *dnode,
*/
DEFPY_YANG (ip_rip_receive_version,
ip_rip_receive_version_cmd,
"ip rip receive version <{1$v1|2$v2}|none>",
"ip rip receive version <1$v1|2$v2|1 2$v3|none>",
IP_STR
"Routing Information Protocol\n"
"Advertisement reception\n"
"Version control\n"
"RIP version 1\n"
"RIP version 2\n"
"RIP version 1&2\n"
"RIP version 1&2\n"
"None\n")
{
const char *value;
if (v1 && v2)
if (v3)
value = "both";
else if (v1)
value = "1";
@ -814,18 +816,20 @@ void cli_show_ip_rip_receive_version(struct vty *vty,
*/
DEFPY_YANG (ip_rip_send_version,
ip_rip_send_version_cmd,
"ip rip send version <{1$v1|2$v2}|none>",
"ip rip send version <1$v1|2$v2|1 2$v3|none>",
IP_STR
"Routing Information Protocol\n"
"Advertisement transmission\n"
"Version control\n"
"RIP version 1\n"
"RIP version 2\n"
"RIP version 1&2\n"
"RIP version 1&2\n"
"None\n")
{
const char *value;
if (v1 && v2)
if (v3)
value = "both";
else if (v1)
value = "1";

View file

@ -0,0 +1,17 @@
!
int r1-eth0
ip address 192.168.1.1/24
ip rip send version 2 1
ip rip receive version 2 1
!
!
int r1-eth1
ip address 192.168.1.2/24
ip rip send version 1 2
ip rip receive version 1 2
!
router rip
network r1-eth0
network r1-eth1
exit

View file

@ -0,0 +1,79 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
# Copyright (c) 2025 by
# Bing Shui <bingshui@smail.nju.edu.cn>
#
"""
Test if RIP `ip rip send version` and `ip rip receive version`
works as expected.
"""
import os
import sys
import json
import pytest
import functools
import re
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
# pylint: disable=C0413
from lib import topotest
from lib.topogen import Topogen, get_topogen
from lib.common_config import step
pytestmark = [pytest.mark.ripd]
def setup_module(mod):
topodef = {"s1": ("r1")}
tgen = Topogen(topodef, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
for _, (rname, router) in enumerate(router_list.items(), 1):
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
tgen.start_router()
def teardown_module():
tgen = get_topogen()
tgen.stop_topology()
def get_conf_of_interface(i_name, text):
pattern = f'!\ninterface {i_name}(.*?)!'
matches = re.findall(pattern, text, re.DOTALL)
for match in matches:
return match.strip()
return None
def test_rip_version():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
st = r1.vtysh_cmd("show running-config")
r1_eth0 = get_conf_of_interface("r1-eth0", st)
assert r1_eth0 != None
assert "ip rip send version 1 2" not in r1_eth0
assert "ip rip receive version 1 2" not in r1_eth0
r1_eth1 = get_conf_of_interface("r1-eth1", st)
assert r1_eth1 != None
assert "ip rip send version 1 2" in r1_eth1
assert "ip rip receive version 1 2" in r1_eth1
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))