Skip to content
Snippets Groups Projects
ethsw.c 26.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* find all the keywords in the command */
    static int keywords_find(int argc, char * const argv[],
    			 struct ethsw_command_def *parsed_cmd)
    {
    	int i;
    	int j;
    	int argc_val;
    	int rc = CMD_RET_SUCCESS;
    
    	for (i = 1; i < argc; i++) {
    		for (j = 0; j < ethsw_id_count; j++) {
    			if (keyword[j].match(j, argc, argv, &i, parsed_cmd))
    				break;
    		}
    	}
    
    	/* if there is no keyword match for a word, the command is invalid */
    	for (i = 1; i < argc; i++)
    		if (parsed_cmd->cmd_to_keywords[i] == ethsw_id_key_end)
    			rc = CMD_RET_USAGE;
    
    	parsed_cmd->cmd_keywords_nr = argc;
    	argc_val = 1;
    
    	/* get optional parameters first */
    	cmd_keywords_opt_check(parsed_cmd, &argc_val);
    
    	if (argc_val == parsed_cmd->cmd_keywords_nr)
    		return CMD_RET_USAGE;
    
    	/*
    	 * check the keywords and if a match is found,
    	 * get the function to call
    	 */
    	cmd_keywords_check(parsed_cmd, &argc_val);
    
    	/* error if not all commands' parameters were matched */
    	if (argc_val == parsed_cmd->cmd_keywords_nr) {
    		if (!parsed_cmd->cmd_function) {
    			printf("Command not available for: %s\n", ethsw_name);
    			rc = CMD_RET_FAILURE;
    		}
    	} else {
    		rc = CMD_RET_USAGE;
    	}
    
    	return rc;
    }
    
    static void command_def_init(struct ethsw_command_def *parsed_cmd)
    {
    	int i;
    
    	for (i = 0; i < ETHSW_MAX_CMD_PARAMS; i++)
    		parsed_cmd->cmd_to_keywords[i] = ethsw_id_key_end;
    
    	parsed_cmd->port = ETHSW_CMD_PORT_ALL;
    
    	parsed_cmd->vid = ETHSW_CMD_VLAN_ALL;
    
    	parsed_cmd->aggr_grp = ETHSW_CMD_AGGR_GRP_NONE;
    
    	parsed_cmd->cmd_function = NULL;
    
    
    	/* We initialize the MAC address with the Broadcast address */
    	memset(parsed_cmd->ethaddr, 0xff, sizeof(parsed_cmd->ethaddr));
    
    }
    
    /* function to interpret commands starting with "ethsw " */
    static int do_ethsw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    {
    	struct ethsw_command_def parsed_cmd;
    	int rc = CMD_RET_SUCCESS;
    
    	if (argc == 1 || argc >= ETHSW_MAX_CMD_PARAMS)
    		return CMD_RET_USAGE;
    
    	command_def_init(&parsed_cmd);
    
    	rc = keywords_find(argc, argv, &parsed_cmd);
    
    	if (rc == CMD_RET_SUCCESS)
    		rc = parsed_cmd.cmd_function(&parsed_cmd);
    
    	return rc;
    }
    
    #define ETHSW_PORT_CONF_HELP "[port <port_no>] { enable | disable | show } " \
    
    "- enable/disable a port; show a port's configuration"
    
    
    U_BOOT_CMD(ethsw, ETHSW_MAX_CMD_PARAMS, 0, do_ethsw,
    	   "Ethernet l2 switch commands",
    	   ETHSW_PORT_CONF_HELP"\n"
    
    	   ETHSW_PVID_HELP"\n"
    	   ETHSW_VLAN_HELP"\n"
    	   ETHSW_PORT_UNTAG_HELP"\n"
    	   ETHSW_EGR_VLAN_TAG_HELP"\n"
    
    	   ETHSW_PORT_AGGR_HELP"\n"