Skip to content

Commit 8a80a13

Browse files
mohan-selvarajkuanyu99
authored andcommitted
JIRA-SONIC-1512: Broadcast Unknown-multicast and Unknown-unicast Storm-control (sonic-net#928)
CLICK CLI - Configuration and show commands for BUM Storm-control feature. configuration commands ---------------------- config interface storm-control broadcast add Ethernet0 10000 config interface storm-control unknown-multicast add Ethernet0 10000 config interface storm-control unknown-unicast add Ethernet0 10000 config interface storm-control broadcast del Ethernet0 config interface storm-control unknown-multicast del Ethernet0 config interface storm-control unknown-unicast del Ethernet0 show commands ------------- show storm-control all show storm-control interface Ethernet0 Sample output ------------- show storm-control interface Ethernet0 +------------------+-------------------+---------------+ | Interface Name | Storm Type | Rate (kbps) | +==================+===================+===============+ | Ethernet0 | broadcast | 10000 | +------------------+-------------------+---------------+ | Ethernet0 | unknown-unicast | 10000 | +------------------+-------------------+---------------+ | Ethernet0 | unknown-multicast | 10000 | +------------------+-------------------+---------------+
1 parent 9fdb39b commit 8a80a13

File tree

2 files changed

+216
-1
lines changed

2 files changed

+216
-1
lines changed

config/main.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,72 @@ def _change_hostname(hostname):
736736
run_command('sed -i "/\s{}$/d" /etc/hosts'.format(current_hostname), display_cmd=True)
737737
run_command('echo "127.0.0.1 {}" >> /etc/hosts'.format(hostname), display_cmd=True)
738738

739+
def storm_control_interface_validate(port_name):
740+
if get_interface_naming_mode() == "alias":
741+
port_name = interface_alias_to_name(port_name)
742+
if port_name is None:
743+
click.echo("'port_name' is None!")
744+
return False
745+
746+
if (port_name.startswith("Ethernet")):
747+
if interface_name_is_valid(port_name) is False:
748+
click.echo("Interface name %s is invalid. Please enter a valid interface name" %(port_name))
749+
return False
750+
else:
751+
click.echo("Storm-control is supported only on Ethernet interfaces. Not supported on %s" %(port_name))
752+
return False
753+
754+
return True
755+
756+
def storm_control_bps_validate(bps):
757+
# if bps not in range(0,100000000001):
758+
# click.echo("bps value must be in range 0-100000000000")
759+
# return False
760+
return True
761+
762+
def storm_control_set_entry(port_name, kbps, storm_type):
763+
764+
if storm_control_interface_validate(port_name) is False:
765+
return False
766+
767+
if storm_control_bps_validate(kbps) is False:
768+
return False
769+
770+
config_db = ConfigDBConnector()
771+
config_db.connect()
772+
key = port_name + '|' + storm_type
773+
entry = config_db.get_entry('PORT_STORM_CONTROL',key)
774+
775+
if len(entry) == 0:
776+
config_db.set_entry('PORT_STORM_CONTROL', key, {'kbps':kbps})
777+
else:
778+
kbps_value = int(entry.get('kbps',0))
779+
click.echo("Existing value of bps %d"%(kbps_value))
780+
if kbps_value != kbps:
781+
config_db.mod_entry('PORT_STORM_CONTROL',key,{'kbps':kbps})
782+
783+
return True
784+
785+
def storm_control_delete_entry(port_name, storm_type):
786+
787+
if storm_control_interface_validate(port_name) is False:
788+
return False
789+
790+
config_db = ConfigDBConnector()
791+
config_db.connect()
792+
key = port_name + '|' + storm_type
793+
entry = config_db.get_entry('PORT_STORM_CONTROL',key)
794+
795+
if len(entry) == 0:
796+
click.echo("%s storm-control not enabled on interface %s"%(storm_type, port_name))
797+
return False
798+
else:
799+
config_db.set_entry('PORT_STORM_CONTROL',key,None)
800+
click.echo("deleted %s storm-control from interface %s"%(storm_type, port_name))
801+
802+
return True
803+
804+
739805
def _clear_qos():
740806
QOS_TABLE_NAMES = [
741807
'TC_TO_PRIORITY_GROUP_MAP',
@@ -3690,6 +3756,90 @@ def enable(enable):
36903756
command = "ztp enable"
36913757
run_command(command, display_cmd=True)
36923758

3759+
@interface.group('storm-control')
3760+
@click.pass_context
3761+
def storm_control(ctx):
3762+
""" Configure storm-control"""
3763+
pass
3764+
3765+
@storm_control.group('broadcast')
3766+
def broadcast():
3767+
""" Configure broadcast storm-control"""
3768+
pass
3769+
3770+
@broadcast.command('add')
3771+
@click.argument('port_name',metavar='<port_name>', required=True)
3772+
@click.argument('kbps',metavar='<kbps_value>', required=True, type=click.IntRange(0,100000000))
3773+
@click.pass_context
3774+
def add_broadcast_storm(ctx,port_name,kbps):
3775+
print"add broadcast storm-control"
3776+
3777+
if storm_control_set_entry(port_name, kbps, 'broadcast') is False:
3778+
ctx.fail("Unable to add broadcast storm-control")
3779+
3780+
@broadcast.command('del')
3781+
@click.argument('port_name',metavar='<port_name>', required=True)
3782+
#@click.argument('bps',metavar='<bps_value>', required=True, type=int)
3783+
@click.pass_context
3784+
#def del_broadcast_storm(ctx,port_name,bps):
3785+
def del_broadcast_storm(ctx,port_name):
3786+
print"del broadcast storm-control"
3787+
3788+
if storm_control_delete_entry(port_name, 'broadcast') is False:
3789+
ctx.fail("Unable to delete broadcast storm-control")
3790+
3791+
@storm_control.group('unknown-unicast')
3792+
def unknown_unicast():
3793+
""" Configure unknown-unicast storm-control"""
3794+
pass
3795+
3796+
@unknown_unicast.command('add')
3797+
@click.argument('port_name',metavar='<port_name>', required=True)
3798+
@click.argument('kbps',metavar='<kbps_value>', required=True, type=click.IntRange(0,100000000))
3799+
@click.pass_context
3800+
def add_unknown_unicast_storm(ctx,port_name,kbps):
3801+
print"add unknown-unicast storm-control"
3802+
3803+
if storm_control_set_entry(port_name, kbps, 'unknown-unicast') is False:
3804+
ctx.fail("Unable to add unknown-unicast storm-control")
3805+
3806+
@unknown_unicast.command('del')
3807+
@click.argument('port_name',metavar='<port_name>', required=True)
3808+
#@click.argument('bps',metavar='<bps_value>', required=True, type=int)
3809+
@click.pass_context
3810+
#def del_unknown_unicast_storm(ctx,port_name,bps):
3811+
def del_unknown_unicast_storm(ctx,port_name):
3812+
print"del unknown-unicast storm-control"
3813+
3814+
if storm_control_delete_entry(port_name, 'unknown-unicast') is False:
3815+
ctx.fail("Unable to delete unknown-unicast storm-control")
3816+
3817+
@storm_control.group('unknown-multicast')
3818+
def unknown_multicast():
3819+
""" Configure unknown-multicast storm-control"""
3820+
pass
3821+
3822+
@unknown_multicast.command('add')
3823+
@click.argument('port_name',metavar='<port_name>', required=True)
3824+
@click.argument('kbps',metavar='<kbps_value>', required=True, type=click.IntRange(0,100000000))
3825+
@click.pass_context
3826+
def add_unknown_multicast_storm(ctx,port_name,kbps):
3827+
print"add unknown-multicast storm-control"
3828+
3829+
if storm_control_set_entry(port_name, kbps, 'unknown-multicast') is False:
3830+
ctx.fail("Unable to add unknown-multicast storm-control")
3831+
3832+
@unknown_multicast.command('del')
3833+
@click.argument('port_name',metavar='<port_name>', required=True)
3834+
#@click.argument('bps',metavar='<bps_value>', required=True, type=int)
3835+
@click.pass_context
3836+
#def del_unknown_multicast_storm(ctx,port_name,bps):
3837+
def del_unknown_multicast_storm(ctx,port_name):
3838+
print"del unknown-multicast storm-control"
3839+
3840+
if storm_control_delete_entry(port_name, 'unknown-multicast') is False:
3841+
ctx.fail("Unable to delete unknown-multicast storm-control")
3842+
36933843
#
36943844
# 'syslog' group ('config syslog ...')
36953845
#

show/main.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,6 @@ def alias(interfacename):
814814

815815
click.echo(tabulate(body, header))
816816

817-
818817
#
819818
# 'breakout' group ###
820819
#
@@ -908,6 +907,72 @@ def currrent_mode(ctx, interface):
908907
body.append([name, str(curBrkout_tbl[name]['brkout_mode'])])
909908
click.echo(tabulate(body, header, tablefmt="grid"))
910909

910+
@cli.group('storm-control')
911+
def storm_control():
912+
""" show storm-control """
913+
pass
914+
915+
@storm_control.command('all')
916+
def storm_control_all():
917+
""" Show storm-control """
918+
919+
header = ['Interface Name', 'Storm Type', 'Rate (kbps)']
920+
body = []
921+
922+
config_db = ConfigDBConnector()
923+
config_db.connect()
924+
925+
table = config_db.get_table('PORT_STORM_CONTROL')
926+
927+
#To avoid further looping below
928+
if not table:
929+
return
930+
931+
sorted_table = natsorted(table)
932+
933+
for storm_key in sorted_table:
934+
interface_name = storm_key[0]
935+
storm_type = storm_key[1]
936+
#interface_name, storm_type = storm_key.split(':')
937+
data = config_db.get_entry('PORT_STORM_CONTROL', storm_key)
938+
939+
if not data:
940+
return
941+
942+
kbps = data['kbps']
943+
944+
body.append([interface_name, storm_type, kbps])
945+
946+
click.echo(tabulate(body, header, tablefmt="grid"))
947+
948+
@storm_control.command('interface')
949+
@click.argument('interfacename', required=True)
950+
def storm_control_interface(interfacename):
951+
""" Show storm-control """
952+
953+
storm_type_list = ['broadcast','unknown-unicast','unknown-multicast']
954+
955+
header = ['Interface Name', 'Storm Type', 'Rate (kbps)']
956+
body = []
957+
958+
config_db = ConfigDBConnector()
959+
config_db.connect()
960+
961+
table = config_db.get_table('PORT_STORM_CONTROL')
962+
963+
#To avoid further looping below
964+
if not table:
965+
return
966+
967+
for storm_type in storm_type_list:
968+
storm_key = interfacename + '|' + storm_type
969+
data = config_db.get_entry('PORT_STORM_CONTROL', storm_key)
970+
971+
if data:
972+
kbps = data['kbps']
973+
body.append([interfacename, storm_type, kbps])
974+
975+
click.echo(tabulate(body, header, tablefmt="grid"))
911976

912977
#
913978
# 'neighbor' group ###

0 commit comments

Comments
 (0)