@@ -892,9 +892,55 @@ static int parse_eid(const char *str, mctp_eid_t *eid)
892892 return 0 ;
893893}
894894
895+ static int parse_eid_range (const char * str , mctp_eid_t * eid ,
896+ unsigned int * extent )
897+ {
898+ char tmp [10 ]; /* sufficient length to handle "100-101" */
899+ mctp_eid_t min , max ;
900+ size_t len ;
901+ char * sep ;
902+ int rc ;
903+
904+ len = strlen (str );
905+ if (len >= sizeof (tmp ) - 1 )
906+ return -1 ;
907+
908+ strncpy (tmp , str , sizeof (tmp ) - 1 );
909+ tmp [sizeof (tmp ) - 1 ] = '\0' ;
910+
911+ sep = strchr (tmp , '-' );
912+ if (sep ) {
913+ rc = parse_eid (sep + 1 , & max );
914+ if (rc )
915+ return rc ;
916+
917+ if (max >= 0xff )
918+ return -1 ;
919+
920+ * sep = '\0' ;
921+ }
922+
923+ rc = parse_eid (tmp , & min );
924+ if (rc )
925+ return rc ;
926+
927+ * eid = min ;
928+ if (sep ) {
929+ if (max < min )
930+ return -1 ;
931+ * extent = max - min ;
932+ } else {
933+ * extent = 0 ;
934+ }
935+
936+ return 0 ;
937+ }
938+
939+
895940static int parse_route_args (struct ctx * ctx , int argc , const char * * argv ,
896- mctp_eid_t * eidp , const char * * linkstrp ,
897- struct mctp_fq_addr * gwp , unsigned int * mtup )
941+ mctp_eid_t * eidp , unsigned int * extent ,
942+ const char * * linkstrp , struct mctp_fq_addr * gwp ,
943+ unsigned int * mtup )
898944{
899945 const char * eidstr , * linkstr = NULL ;
900946 struct mctp_fq_addr gw = { 0 };
@@ -907,9 +953,9 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
907953 return -1 ;
908954
909955 eidstr = argv [0 ];
910- rc = parse_eid (eidstr , & eid );
956+ rc = parse_eid_range (eidstr , & eid , extent );
911957 if (rc ) {
912- warnx ("Invalid EID '%s'" , eidstr );
958+ warnx ("Invalid EID/range '%s'" , eidstr );
913959 return -1 ;
914960 }
915961
@@ -972,35 +1018,37 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
9721018static int cmd_route_add (struct ctx * ctx , int argc , const char * * argv )
9731019{
9741020 struct mctp_fq_addr gw = { 0 };
1021+ unsigned int extent , mtu = 0 ;
9751022 const char * linkstr = NULL ;
976- unsigned int mtu = 0 ;
9771023 mctp_eid_t eid ;
9781024 int rc ;
9791025
980- rc = parse_route_args (ctx , argc - 1 , argv + 1 , & eid , & linkstr , & gw , & mtu );
1026+ rc = parse_route_args (ctx , argc - 1 , argv + 1 , & eid , & extent ,
1027+ & linkstr , & gw , & mtu );
9811028 if (rc ) {
9821029 warnx ("add: invalid command line arguments" );
9831030 return -1 ;
9841031 }
9851032
986- return mctp_nl_route_add (ctx -> nl , eid , linkstr , & gw , mtu );
1033+ return mctp_nl_route_add (ctx -> nl , eid , extent , linkstr , & gw , mtu );
9871034}
9881035
9891036static int cmd_route_del (struct ctx * ctx , int argc , const char * * argv )
9901037{
9911038 struct mctp_fq_addr gw = { 0 };
1039+ unsigned int extent , mtu = 0 ;
9921040 const char * linkstr = NULL ;
993- unsigned int mtu = 0 ;
9941041 mctp_eid_t eid ;
9951042 int rc ;
9961043
997- rc = parse_route_args (ctx , argc - 1 , argv + 1 , & eid , & linkstr , & gw , & mtu );
1044+ rc = parse_route_args (ctx , argc - 1 , argv + 1 , & eid , & extent ,
1045+ & linkstr , & gw , & mtu );
9981046 if (rc ) {
9991047 warnx ("del: invalid command line arguments" );
10001048 return -1 ;
10011049 }
10021050
1003- return mctp_nl_route_del (ctx -> nl , eid , linkstr , & gw );
1051+ return mctp_nl_route_del (ctx -> nl , eid , extent , linkstr , & gw );
10041052}
10051053
10061054static int cmd_route (struct ctx * ctx , int argc , const char * * argv )
@@ -1009,11 +1057,14 @@ static int cmd_route(struct ctx *ctx, int argc, const char **argv)
10091057 if (argc == 2 && !strcmp (argv [1 ], "help" )) {
10101058 fprintf (stderr , "%s route\n" , ctx -> top_cmd );
10111059 fprintf (stderr , "%s route show [net <network>]\n" , ctx -> top_cmd );
1012- fprintf (stderr , "%s route add <eid> via <dev> [mtu <mtu>]\n" , ctx -> top_cmd );
1013- fprintf (stderr , "%s route add <eid> gw <eid> [net <net>] [mtu <mtu>]\n" ,
1060+ fprintf (stderr , "%s route add <eid>[-<eid>] via <dev> [mtu <mtu>]\n" ,
1061+ ctx -> top_cmd );
1062+ fprintf (stderr , "%s route add <eid>[-<eid>] gw <eid> [net <net>] [mtu <mtu>]\n" ,
1063+ ctx -> top_cmd );
1064+ fprintf (stderr , "%s route del <eid>[-<eid>] via <dev>\n" ,
1065+ ctx -> top_cmd );
1066+ fprintf (stderr , "%s route del <eid>[-<eid>] gw <eid> [net <net>]\n" ,
10141067 ctx -> top_cmd );
1015- fprintf (stderr , "%s route del <eid> via <dev>\n" , ctx -> top_cmd );
1016- fprintf (stderr , "%s route del <eid> gw <eid> [net <net>]\n" , ctx -> top_cmd );
10171068 return 255 ;
10181069 }
10191070
0 commit comments