Esempio n. 1
0
void NanodeUIP::get_gateway_str(char *buf) {
  format_ipaddr(buf, &uip_draddr);
}
Esempio n. 2
0
void NanodeUIP::get_netmask_str(char *buf) {
  format_ipaddr(buf, &uip_netmask);
}
Esempio n. 3
0
void NanodeUIP::get_ip_addr_str(char *buf) {
  format_ipaddr(buf, &uip_hostaddr);
}
Esempio n. 4
0
File: ipfix.c Progetto: ariavie/bcm
cmd_result_t
cmd_ipfix(int unit, args_t *arg)
{
    char *subcmd;
    parse_table_t pt;
    bcm_ipfix_config_t config;
    int rv, i;
    int port = 0;
    bcm_ip_t src_ip4_mask = 0, dst_ip4_mask = 0;
    bcm_ip_t tunnel_src_ip4_mask = 0, tunnel_dst_ip4_mask = 0;
    bcm_ip6_t src_ip6_mask, dst_ip6_mask;
    bcm_ip6_t tunnel_src_ip6_mask, tunnel_dst_ip6_mask;
    int enable_l2 = 0, enable_ip4 = 0, enable_ip6 = 0;
    int record_non_discard = 1, record_discard = 0, check_flow_end = 0;
    int use_l2_for_ip4 = 0, use_l2_for_ip6 = 0;
    int key_src_ip = 0, key_dst_ip = 0; 
    int  key_ip_prot = 0, key_ip_dscp = 0, key_ip_ecn = 0;
    int key_l4_src_port = 0, key_l4_dst_port = 0, key_ip6_flow = 0;
    int key_icmp_type = 0, key_icmp_code = 0, key_macda = 0, key_macsa = 0;
    int key_vlan_id = 0, key_vlan_pri = 0, key_ether_type = 0; 
    int key_vlan_tagged = 0, key_source_port = 0;
    int stage = 0, dscp_idx = 0, entry_limit = 8191;
    int min_time = 0, max_time = 0;
    int max_idle_time = 32767, sample_rate = 1;
    char str[IP6ADDR_STR_LEN];

    if (!ARG_CNT(arg)) {                  /* Nothing passed */
        cli_out("IPFIX Deamon Status: %s.\n",
                (ipfix_is_running[unit]) ? "Running" : "Not Running");

        cli_out("Reporting is enabled for: ");
        parse_mask_format(80, ipfix_report_table, ipfix_report[unit]);
        cli_out("Reporting is disabled for: ");
        parse_mask_format(80, ipfix_report_table, ipfix_report[unit] ^ ~0);

        cli_out("Number of records received: %d\n", ipfix_report_count[unit]);
        return(CMD_OK);
    }

    subcmd = ARG_GET(arg);
    if (subcmd == NULL) {
        return CMD_USAGE;
    }

    rv = BCM_E_NONE;
    sal_memset(src_ip6_mask, 0, sizeof(bcm_ip6_t));
    sal_memset(dst_ip6_mask, 0, sizeof(bcm_ip6_t));
    sal_memset(tunnel_src_ip6_mask, 0, sizeof(bcm_ip6_t));
    sal_memset(tunnel_dst_ip6_mask, 0, sizeof(bcm_ip6_t));

    if (!sal_strcasecmp(subcmd, "start")) {
        if (ipfix_is_running[unit]) {
            cli_out("%s: IPFIX thread already running.\n", ARG_CMD(arg));
            return CMD_OK;
        }
        ipfix_report_count[unit] = 0;
        ipfix_is_running[unit] = 1;
        rv = bcm_ipfix_export_fifo_control(unit, 1000000);
        if (rv < 0) {
            cli_out("%s: ERROR: %s\n", ARG_CMD(arg), bcm_errmsg(rv));
            return CMD_FAIL;
        }
        rv = bcm_ipfix_register(unit, _ipfix_callback, NULL);
    } else if (!sal_strcasecmp(subcmd, "stop")) {
        if (!ipfix_is_running[unit]) {
            cli_out("%s: ERROR: IPFIX thread already stopped.\n", ARG_CMD(arg));
            return CMD_FAIL;
        }
        ipfix_is_running[unit] = 0;
        rv = bcm_ipfix_export_fifo_control(unit, 0);
        if (rv < 0) {
            cli_out("%s: ERROR: %s\n", ARG_CMD(arg), bcm_errmsg(rv));
            return CMD_FAIL;
        }
        rv = bcm_ipfix_unregister(unit, _ipfix_callback, NULL);
    } else if (!sal_strcasecmp(subcmd, "set")) {
        parse_table_init(unit, &pt);
        parse_table_add(&pt, "Port", PQ_DFL | PQ_INT, (void *)-1, &port, 0);
        parse_table_add(&pt, "Stage", PQ_DFL | PQ_INT, (void *)0, &stage, 0);
        parse_table_add(&pt, "EnableL2", PQ_DFL | PQ_INT, (void *)0,
                        &enable_l2, 0);
        parse_table_add(&pt, "EnableIp4", PQ_DFL | PQ_INT, (void *)0,
                        &enable_ip4, 0);
        parse_table_add(&pt, "EnableIp6", PQ_DFL | PQ_INT, (void *)0,
                        &enable_ip6, 0);
        parse_table_add(&pt, "RecordNonDiscard", PQ_DFL | PQ_INT, (void *)0,
                        &record_non_discard, 0);
        parse_table_add(&pt, "RecordDiscard", PQ_DFL | PQ_INT, (void *)0,
                        &record_discard, 0);
        parse_table_add(&pt, "CheckFlowEnd", PQ_DFL | PQ_INT, (void *)0,
                        &check_flow_end, 0);
        parse_table_add(&pt, "UseL2ForIp4", PQ_DFL | PQ_INT, (void *)0,
                        &use_l2_for_ip4, 0);
        parse_table_add(&pt, "UseL2ForIp6", PQ_DFL | PQ_INT, (void *)0,
                        &use_l2_for_ip6, 0);
        parse_table_add(&pt, "KeySrcIp", PQ_DFL | PQ_INT, (void *)0,
                        &key_src_ip, 0);
        parse_table_add(&pt, "KeyIpProt", PQ_DFL | PQ_INT, (void *)0,
                        &key_ip_prot, 0);
        parse_table_add(&pt, "KeyIpDscp", PQ_DFL | PQ_INT, (void *)0,
                        &key_ip_dscp, 0);
        parse_table_add(&pt, "KeyIpEcn", PQ_DFL | PQ_INT, (void *)0,
                        &key_ip_ecn, 0);
        parse_table_add(&pt, "KeyDstIp", PQ_DFL | PQ_INT, (void *)0,
                        &key_dst_ip, 0);
        parse_table_add(&pt, "KeyIpEcn", PQ_DFL | PQ_INT, (void *)0,
                        &key_ip_ecn, 0);
        parse_table_add(&pt, "KeyL4SrcPort", PQ_DFL | PQ_INT, (void *)0,
                        &key_l4_src_port, 0);
        parse_table_add(&pt, "KeyL4DstPort", PQ_DFL | PQ_INT, (void *)0,
                        &key_l4_dst_port, 0);
        parse_table_add(&pt, "KeyIp6Flow", PQ_DFL | PQ_INT, (void *)0,
                        &key_ip6_flow, 0);
        parse_table_add(&pt, "KeyIcmpType", PQ_DFL | PQ_INT, (void *)0,
                        &key_icmp_type, 0);
        parse_table_add(&pt, "KeyIcmpCode", PQ_DFL | PQ_INT, (void *)0,
                        &key_icmp_code, 0);
        parse_table_add(&pt, "KeyMacDa", PQ_DFL | PQ_INT, (void *)0,
                        &key_macda, 0);
        parse_table_add(&pt, "KeyMacSa", PQ_DFL | PQ_INT, (void *)0,
                        &key_macsa, 0);
        parse_table_add(&pt, "KeyVlanId", PQ_DFL | PQ_INT, (void *)0,
                        &key_vlan_id, 0);
        parse_table_add(&pt, "KeyVlanPri", PQ_DFL | PQ_INT, (void *)0,
                        &key_vlan_pri, 0);
        parse_table_add(&pt, "KeyEtherType", PQ_DFL | PQ_INT, (void *)0,
                        &key_ether_type, 0);
        parse_table_add(&pt, "KeyVlanTagged", PQ_DFL | PQ_INT, (void *)0,
                        &key_vlan_tagged, 0);
        parse_table_add(&pt, "KeySourcePort", PQ_DFL | PQ_INT, (void *)0,
                        &key_source_port, 0);
        parse_table_add(&pt, "Ip4SrcMask", PQ_DFL | PQ_IP, 0, &src_ip4_mask,
                        0);
        parse_table_add(&pt, "Ip4DstMask", PQ_DFL | PQ_IP, 0, &dst_ip4_mask,
                        0);
        parse_table_add(&pt, "TunnelIp4SrcMask", PQ_DFL | PQ_IP, 0,
                        &tunnel_src_ip4_mask, 0);
        parse_table_add(&pt, "TunnelIp4DstMask", PQ_DFL | PQ_IP, 0,
                        &tunnel_dst_ip4_mask, 0);
        parse_table_add(&pt, "Ip6SrcMask", PQ_DFL | PQ_IP6, 0, &src_ip6_mask,
                        0);
        parse_table_add(&pt, "Ip6DstMask", PQ_DFL | PQ_IP6, 0, &dst_ip6_mask,
                        0);
        parse_table_add(&pt, "TunnelIp6SrcMask", PQ_DFL | PQ_IP6, 0,
                        &tunnel_src_ip6_mask, 0);
        parse_table_add(&pt, "TunnelIp6DstMask", PQ_DFL | PQ_IP6, 0,
                        &tunnel_dst_ip6_mask, 0);
        parse_table_add(&pt, "DscpMap", PQ_DFL | PQ_MULTI, 0, &dscp_idx,
                        dscp_names);
        parse_table_add(&pt, "Limit", PQ_DFL | PQ_INT, (void *)0,
                        &entry_limit, 0);
        parse_table_add(&pt, "MinTime", PQ_DFL | PQ_INT, (void *)0,
                        &min_time, 0);
        parse_table_add(&pt, "MaxTime", PQ_DFL | PQ_INT, (void *)0,
                        &max_time, 0);
        parse_table_add(&pt, "MaxIdleTime", PQ_DFL | PQ_INT, (void *)0,
                        &max_idle_time, 0);
        parse_table_add(&pt, "SampleRate", PQ_DFL | PQ_INT, (void *)0,
                        &sample_rate, 0);

        if (parse_arg_eq(arg, &pt) < 0) {
            parse_arg_eq_done(&pt);
            return CMD_USAGE;
        }
        parse_arg_eq_done(&pt);

        sal_memset(&config, 0, sizeof(config));
        config.flags |= enable_l2 ? BCM_IPFIX_CONFIG_ENABLE_NON_IP : 0;
        config.flags |= enable_ip4 ? BCM_IPFIX_CONFIG_ENABLE_IP4 : 0;
        config.flags |= enable_ip6 ? BCM_IPFIX_CONFIG_ENABLE_IP6 : 0;
        config.flags |= check_flow_end ? BCM_IPFIX_CONFIG_TCP_END_DETECT : 0;
        config.flags |= record_non_discard ?
            BCM_IPFIX_CONFIG_RECORD_NON_DISCARD_PKT : 0;
        config.flags |= record_discard ?
            BCM_IPFIX_CONFIG_RECORD_DISCARD_PKT : 0;
        config.flags |= use_l2_for_ip4 ? BCM_IPFIX_CONFIG_KEY_IP4_USE_L2 : 0;
        config.flags |= use_l2_for_ip6 ? BCM_IPFIX_CONFIG_KEY_IP6_USE_L2 : 0;
        config.flags |= key_src_ip ? BCM_IPFIX_CONFIG_KEY_SRC_IP : 0;
        config.flags |= key_dst_ip ? BCM_IPFIX_CONFIG_KEY_DST_IP : 0;
        config.flags |= key_ip_prot ? BCM_IPFIX_CONFIG_KEY_IP_PROT : 0;
        config.flags |= key_ip_dscp ? BCM_IPFIX_CONFIG_KEY_IP_DSCP : 0;
        config.flags |= key_ip_ecn ? BCM_IPFIX_CONFIG_KEY_IP_ECN : 0;
        config.flags |= key_l4_src_port ? BCM_IPFIX_CONFIG_KEY_L4_SRC_PORT : 0;
        config.flags |= key_l4_dst_port ? BCM_IPFIX_CONFIG_KEY_L4_DST_PORT : 0;
        config.flags |= key_ip6_flow ? BCM_IPFIX_CONFIG_KEY_IP6_FLOW : 0;
        config.flags |= key_icmp_type ? BCM_IPFIX_CONFIG_KEY_ICMP_TYPE : 0;
        config.flags |= key_icmp_code ? BCM_IPFIX_CONFIG_KEY_ICMP_CODE : 0;
        config.flags |= key_macda ? BCM_IPFIX_CONFIG_KEY_MACDA : 0;
        config.flags |= key_macsa ? BCM_IPFIX_CONFIG_KEY_MACSA : 0;
        config.flags |= key_vlan_id ? BCM_IPFIX_CONFIG_KEY_VLAN_ID : 0;
        config.flags |= key_vlan_pri ? BCM_IPFIX_CONFIG_KEY_VLAN_PRI : 0;
        config.flags |= key_ether_type ? BCM_IPFIX_CONFIG_KEY_ETHER_TYPE : 0;
        config.flags |= key_vlan_tagged ? BCM_IPFIX_CONFIG_KEY_VLAN_TAGGED : 0;
        config.flags |= key_source_port ?
            BCM_IPFIX_CONFIG_KEY_SOURCE_PORT_OR_INTERFACE : 0;

        if (dscp_idx == 0) {
            for (i = 0; i < 64; i++) {
                config.dscp_mask[i] = i;
            }
        } else {
            for (i = 0; i < 64; i++) {
                config.dscp_mask[i] = 0;
            }
        }
        config.src_ip4_mask = src_ip4_mask;
        config.dst_ip4_mask = dst_ip4_mask;
        config.tunnel_src_ip4_mask = tunnel_src_ip4_mask;
        config.tunnel_dst_ip4_mask = tunnel_dst_ip4_mask;
        SAL_IP6_ADDR_TO_UINT32(src_ip6_mask, (uint32 *)config.src_ip6_mask);
        SAL_IP6_ADDR_TO_UINT32(dst_ip6_mask, (uint32 *)config.dst_ip6_mask);
        SAL_IP6_ADDR_TO_UINT32(tunnel_src_ip6_mask,
                               (uint32 *)config.tunnel_src_ip6_mask);
        SAL_IP6_ADDR_TO_UINT32(tunnel_dst_ip6_mask,
                               (uint32 *)config.tunnel_dst_ip6_mask);
        config.entry_limit = entry_limit;
        config.min_time = min_time;
        config.max_time = max_time;
        config.max_idle_time = max_idle_time;
        config.sample_rate = sample_rate;
        rv = bcm_ipfix_config_set(unit, stage, port, &config);
    } else if (!sal_strcasecmp(subcmd, "get")) {
        parse_table_init(unit, &pt);
        parse_table_add(&pt, "Port", PQ_DFL | PQ_INT, (void *)-1, &port, 0);
        parse_table_add(&pt, "Stage", PQ_DFL | PQ_INT, (void *)0, &stage, 0);
        if (parse_arg_eq(arg, &pt) < 0) {
            parse_arg_eq_done(&pt);
            return CMD_USAGE;
        }
        parse_arg_eq_done(&pt);

        rv = bcm_ipfix_config_get(unit, stage, port, &config);
        if (rv >= 0) {
            if (config.flags & BCM_IPFIX_CONFIG_ENABLE_NON_IP) {
                cli_out("BCM_IPFIX_CONFIG_ENABLE_NON_IP\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_ENABLE_IP4) {
                cli_out("BCM_IPFIX_CONFIG_ENABLE_IP4\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_ENABLE_IP6) {
                cli_out("BCM_IPFIX_CONFIG_ENABLE_IP6\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_TCP_END_DETECT) {
                cli_out("BCM_IPFIX_CONFIG_TCP_END_DETECT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_RECORD_NON_DISCARD_PKT) {
                cli_out("BCM_IPFIX_CONFIG_RECORD_NON_DISCARD_PKT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_RECORD_DISCARD_PKT) {
                cli_out("BCM_IPFIX_CONFIG_RECORD_DISCARD_PKT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP4_USE_L2) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP4_USE_L2\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP6_USE_L2) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP6_USE_L2\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_SRC_IP) {
                cli_out("BCM_IPFIX_CONFIG_KEY_SRC_IP\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_DST_IP) {
                cli_out("BCM_IPFIX_CONFIG_KEY_DST_IP\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP_PROT) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP_PROT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP_DSCP) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP_DSCP\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP_ECN) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP_ECN\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_L4_SRC_PORT) {
                cli_out("BCM_IPFIX_CONFIG_KEY_L4_SRC_PORT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_L4_DST_PORT) {
                cli_out("BCM_IPFIX_CONFIG_KEY_L4_DST_PORT\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_IP6_FLOW) {
                cli_out("BCM_IPFIX_CONFIG_KEY_IP6_FLOW\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_ICMP_TYPE) {
                cli_out("BCM_IPFIX_CONFIG_KEY_ICMP_TYPE\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_ICMP_CODE) {
                cli_out("BCM_IPFIX_CONFIG_KEY_ICMP_CODE\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_MACDA) {
                cli_out("BCM_IPFIX_CONFIG_KEY_MACDA\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_MACSA) {
                cli_out("BCM_IPFIX_CONFIG_KEY_MACSA\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_VLAN_ID) {
                cli_out("BCM_IPFIX_CONFIG_KEY_VLAN_ID\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_VLAN_PRI) {
                cli_out("BCM_IPFIX_CONFIG_KEY_VLAN_PRI\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_ETHER_TYPE) {
                cli_out("BCM_IPFIX_CONFIG_KEY_ETHER_TYPE\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_KEY_VLAN_TAGGED) {
                cli_out("BCM_IPFIX_CONFIG_KEY_VLAN_TAGGED\n");
            }
            if (config.flags & BCM_IPFIX_CONFIG_TCP_FLAGS_LAST) {
                cli_out("BCM_IPFIX_CONFIG_TCP_FLAGS_LAST\n");
            }
            cli_out("entry_limit=%d min_time=%d max_time=%d\n",
                    config.entry_limit, config.min_time, config.max_time);
            cli_out("max_idle_time=%d sample_rate=%d\n",
                    config.max_idle_time, config.sample_rate);
            format_ipaddr(str, config.src_ip4_mask);
            cli_out("src_ip4_mask %s\n", str);
            format_ipaddr(str, config.dst_ip4_mask);
            cli_out("dst_ip4_mask %s\n", str);
            format_ip6addr(str, config.src_ip6_mask);
            cli_out("src_ip6_mask %s\n", str);
            format_ip6addr(str, config.dst_ip6_mask);
            cli_out("dst_ip6_mask %s\n", str);
        }
    } else if (!sal_strcasecmp(subcmd, "report")) {
        if (ARG_CNT(arg)) {
            while ((subcmd = ARG_CUR(arg)) != NULL &&
                   !parse_mask(subcmd, ipfix_report_table, &ipfix_report[unit])) {
                ARG_NEXT(arg);        /* Bump arg if matched report */
            }
        } else {                    /* Print values */
            cli_out("IPFIX Reporting on for: ");
            parse_mask_format(50, ipfix_report_table, ipfix_report[unit]);
            cli_out("IPFIX Reporting off for: ");
            parse_mask_format(50, ipfix_report_table, ~ipfix_report[unit]);
        }
    } else {
        return CMD_USAGE;
    }

    if (rv < 0) {
        cli_out("%s: ERROR: %s\n", ARG_CMD(arg), bcm_errmsg(rv));
        return CMD_FAIL;
    }

    return CMD_OK;
}
Esempio n. 5
0
File: if.c Progetto: ariavie/bcm
cmd_result_t
cmd_if_config(int u, args_t *a)
/*
 * Function: 	if_config
 * Purpose:	Perform a variety of configuration functions on an interface.
 * Parameters:	u - unit number to act on.
 *		a - Parameters.
 * Returns:	CMD_USAGE/CMD_FAIL/CMD_OK.
 */
{
    if_soc_t	*ifs;
    int		interface;
    cmd_result_t rv;
    if_soc_t	newif;
#if VX_VERSION == 66 || VX_VERSION == 68
    char gw_cfg_str[32];
#endif

    /*
     * Just dump all of our information.
     */
    if (0 == ARG_CNT(a)) {
	if_dump_table(u, -1, FALSE);
	return(CMD_OK);
    }

    /* Pick up interface number */

    if (!isint(ARG_CUR(a))) {
        cli_out("%s: Invalid interface number: %s\n",
                ARG_CMD(a), ARG_CUR(a));
        return(CMD_FAIL);
    }

    interface = parse_integer(ARG_GET(a));
    if (interface >= MAX_INTERFACE) {
        cli_out("%s: ERROR: Interface # too high, only permitted %d\n",
                ARG_CMD(a), MAX_INTERFACE);
        return(CMD_FAIL);
    }

    /* If no parameters left now, display information on the port */

    if (0 == ARG_CNT(a)) {
	if_dump_table(u, interface, TRUE);
	return(CMD_OK);
    }

    if (if_table[u] == NULL) {
	sal_memset(&newif, 0, sizeof(newif));
	ifs = &newif;
    } else {
	ifs = &if_table[u][interface];
    }
    ifs->ifs_net_name = SOC_END_NAME;
    ifs->ifs_net_interface = interface;

    /* Check for UP/DOWN */

    if (sal_strcasecmp("up", _ARG_CUR(a)) == 0) {
	ARG_NEXT(a);			/* Passed UP */

	if (ifs->ifs_sal) {
	    cli_out("%s: ERROR: Interface %d already running\n",
                    ARG_CMD(a), interface);
	    return(CMD_FAIL);
	}

	/* Parse the Parameters and try to configure the device */

	if (CMD_OK != (rv = if_config_parse(u, ifs, a))) {
	    return(rv);
	}
	if (ARG_CNT(a)) {
	    return(CMD_USAGE);
	}

	ifs->ifs_sal = sal_if_config(ARG_CMD(a), u,
				     ifs->ifs_net_name,
				     ifs->ifs_net_interface,
				     ifs->ifs_net_host,
				     ifs->ifs_net_mac,
				     ifs->ifs_net_vlan,
				     ifs->ifs_net_ip,
				     ifs->ifs_net_mask);

	if (ifs->ifs_sal == NULL) {
	    return CMD_FAIL;
	}
	if (if_table[u] == NULL) {
	    if_table[u] = sal_alloc(sizeof(*ifs) * MAX_INTERFACE, "if_table");
	    if (if_table[u] == NULL) {
		cli_out("%s: ERROR: cannot allocate interface table\n",
                        ARG_CMD(a));
		return CMD_FAIL;
	    }
	    sal_memset(if_table[u], 0, sizeof(*ifs) * MAX_INTERFACE);
	    if_table[u][interface] = *ifs;
	}

        /* Add default gateway */
        if (ifs->ifs_gateway != 0) {
            char          gateway_str[SAL_IPADDR_STR_LEN];

           format_ipaddr(gateway_str, ifs->ifs_gateway);
#if VX_VERSION == 66 || VX_VERSION == 68
            sprintf(gw_cfg_str, "add default %s", gateway_str);
            LOG_INFO(BSL_LS_APPL_END,
                     (BSL_META_U(u,
                                 "Default gateway: %s\n"), gw_cfg_str));
            if (ERROR == routec(gw_cfg_str)) {
                cli_out("Warning: Failed to add default route gatway = %s\n",
                        gateway_str);
            }
#else        
#ifdef VXWORKS_NETWORK_STACK_6_5
#ifdef VXWORKS_NETWORK_STACK_FIXME_SHOW
#error VXWORKS_NETWORK_STACK_FIXME_SHOW
#endif 
#else
           if (OK != routeAdd("0.0.0.0", gateway_str)) {
                cli_out("Warning: Failed to add default route gatway = %s\n",
                        gateway_str);
           }
#endif /* VXWORKS_NETWORK_STACK_6_5 */
#endif
        }
	return CMD_OK;
    } else if (sal_strcasecmp("down", _ARG_CUR(a)) == 0) {
	ARG_NEXT(a);

#if VX_VERSION == 66 || VX_VERSION == 68
        if (ifs->ifs_gateway != 0) {
           char          gateway_str[SAL_IPADDR_STR_LEN];

           format_ipaddr(gateway_str, ifs->ifs_gateway);
           sprintf(gw_cfg_str, "delete default %s", gateway_str);
           if (OK != routec(gw_cfg_str)) {
                cli_out("Warning: Failed to delete default route gatway = %s\n", 
                        gateway_str);
           }
        }
#endif /* VX_VERSION == 66 || VX_VERSION == 68 */

	if (!ifs->ifs_sal) {
	    cli_out("%s: Interface %d not running\n",
                    ARG_CMD(a), interface);
	    return(CMD_FAIL);
	}
	if (sal_if_deconfig(ARG_CMD(a), ifs->ifs_sal, ifs->ifs_net_name,
			    ifs->ifs_net_interface)) {
	    ifs->ifs_sal = NULL;
	    return CMD_FAIL;
	}
	ifs->ifs_sal = NULL;
	return CMD_OK;
    }
    cli_out("%s: ERROR: Invalid option %s: [up|down] expected\n",
            ARG_CMD(a), ARG_CUR(a));
    return(CMD_USAGE);
}
Esempio n. 6
0
File: if.c Progetto: ariavie/bcm
static void *
sal_if_config(char *pfx, int u, char *if_name, int if_unit, 
	      char *if_host, sal_mac_addr_t if_mac, int if_vlan, 
	      sal_ip_addr_t if_ip, sal_ip_addr_t if_netmask)
/*
 * Function: 	sal_if_config
 * Purpose:	Configure a network device (load driver and start)
 * Parameters:	pfx - string printed for error messages.
 *		name - device name ("sn" for "sn0")
 *		unit - unint number (0 for "sn0")
 * Returns:	NULL - failed
 *		!NULL - opaque pointer.
 */
{
#ifdef INCLUDE_DRIVERS
    extern END_OBJ *socend_load(char *is, void *);
    char	if_name_str[END_NAME_MAX];
    char	if_init_str[64];
    char 	if_ip_str[SAL_IPADDR_STR_LEN];
    char	if_mac_str[SAL_MACADDR_STR_LEN];
    END_OBJ	*eo;			/* END object  */
#if VX_VERSION == 64 || VX_VERSION == 65 || VX_VERSION == 66 || VX_VERSION == 68
#else
    M2_INTERFACETBL	m2;
#endif
#if VX_VERSION == 66 || VX_VERSION == 68
    char if_cfg_str[256];
    char if_mask_str[SAL_IPADDR_STR_LEN];
#endif

    SAL_MAP_NETUNIT(if_unit);
    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META_U(u,
                         "%s: sal_if_config *** if_name=%s if_unit=%d\n"), 
              pfx, if_name, if_unit));
    /* Build vxWorks device name */
    sprintf(if_name_str, "%s%d", if_name, if_unit);

    /* Check to see if end device already loaded */

    if (NULL == (eo = endFindByName(if_name, if_unit))) {
	LOG_INFO(BSL_LS_APPL_END,
                 (BSL_META_U(u,
                             "%s: End device not loaded: if %s if_unit %d\n"), 
                  pfx, if_name, if_unit));
	format_macaddr(if_mac_str, if_mac);
	sprintf(if_init_str, "%d:%s:%d", u, if_mac_str, if_vlan);
	if (NULL == (eo = muxDevLoad(if_unit, socend_load, 
				     if_init_str, 0, NULL))) {
	    cli_out("%s: muxDevLoad failed: Unit %d\n", pfx, u);
	    return(NULL);
	}

	LOG_INFO(BSL_LS_APPL_END,
                 (BSL_META_U(u,
                             "%s: muxDevLoad successful: 0x%x\n"), pfx, (int)eo));
	if (ERROR == muxDevStart(eo)) {
	    cli_out("%s: muxDevStart failed: Unit %d\n", pfx, u);
	    (void)muxDevUnload(if_name, if_unit);
	    return(NULL);
	}
	LOG_INFO(BSL_LS_APPL_END,
                 (BSL_META_U(u,
                             "%s: muxDevStart successful: 0x%x\n"), pfx, (int)eo));
    }
#if VX_VERSION == 64 || VX_VERSION == 65 || VX_VERSION == 66 || VX_VERSION == 68
#else
    /*
     * Configure device....
     */
    if (OK != muxIoctl(eo, EIOCGMIB2, (caddr_t)&m2)) {
        cli_out("%s: muxIoctl failed: Unit %d\n", pfx, u);
	(void)sal_if_do_deconfig(pfx, eo, if_name, if_unit);
	return(NULL);
    }
    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META_U(u,
                         "%s: muxIOCTL successful: Unit %d\n"), pfx, u));
#endif /* VX_VERSION */

    /*
     * Setup interface in following order:
     *		[1] Attach TCP/IP to END device
     *		[2] Set Netmask (if non-0)
     *		[3] Set IP address
     *		[4] Set host name associated with interface (if given).
     */
    if (OK != ipAttach(if_unit, if_name)) { /* [1] */
        cli_out("%s: ipAttach failed: Unit %d (interface %s)\n", 
                pfx, u, if_name_str);
	(void)sal_if_do_deconfig(pfx, eo, if_name, if_unit);
	return(NULL);
    }
    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META_U(u,
                         "%s: ipAttach successful: if_name %s if_unit %d\n"), 
              pfx, if_name, if_unit));

#if VX_VERSION == 66 || VX_VERSION == 68

    format_ipaddr(if_ip_str, if_ip);	/* [3] */

    if (0 != if_netmask) {		/* [2] */
        format_ipaddr(if_mask_str, if_netmask);	/* [3] */
    }

    sprintf(if_cfg_str, "%s up inet add %s netmask %s", if_name_str, if_ip_str, if_mask_str);
   
    if (ERROR == ifconfig(if_cfg_str)) {
        cli_out("%s: ifconfig failed: %s%d: %s\n",
                pfx, if_name, if_unit, if_cfg_str);
        (void)sal_if_do_deconfig(pfx, eo, if_name, if_unit);
        return(NULL);
    }
    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META_U(u,
                         "%s: ifconfig: if %s, cfg str %s\n"),
              pfx, if_name_str, if_cfg_str));
#else
    if (0 != if_netmask) {		/* [2] */
#ifdef VXWORKS_NETWORK_STACK_6_5
#ifdef VXWORKS_NETWORK_STACK_FIXME_SHOW
#error VXWORKS_NETWORK_STACK_FIXME     
#endif   
#else 
	if (ERROR == ifMaskSet(if_name_str, if_netmask)) {
	    cli_out("%s: ifMaskSet failed: %s 0x%x\n", 
                    pfx, if_name_str, if_netmask);
	    (void)sal_if_do_deconfig(pfx, eo, if_name, if_unit);
	    return(NULL);
	}
#endif 
    }

    format_ipaddr(if_ip_str, if_ip);	/* [3] */
#ifdef VXWORKS_NETWORK_STACK_6_5
#ifdef VXWORKS_NETWORK_STACK_FIXME_SHOW
#error VXWORKS_NETWORK_STACK_FIXME
#endif
#else
    if (OK != ifAddrSet(if_name_str, (char *)if_ip_str)) {
	cli_out("%s: ifAddrSet failed: %s <-- %s\n", pfx, if_name, if_ip_str);
	(void)sal_if_do_deconfig(pfx, eo, if_name, if_unit);
	return(NULL);
    }
#endif 

    LOG_INFO(BSL_LS_APPL_END,
             (BSL_META_U(u,
                         "%s: ifAddrSet successful: if %s\n"), pfx, if_name_str));
#endif

    if (if_host && *if_host) {		/* [4] */
	LOG_INFO(BSL_LS_APPL_END,
                 (BSL_META_U(u,
                             "%s: Setting hostname: %s\n"), pfx, if_host));
	if (OK != hostAdd (if_host, if_ip_str)) {
	    cli_out("%s: Warning: Failed to set hostname %s for device %s\n", 
                    pfx, if_host, if_name_str);
	}
    }

    return((void *)eo);			/* This is our opaque value */
#else /* !defined(INCLUDE_DRIVERS) */
    cli_out("sal_if_config: Interface configuration not compiled in\n");
    return(NULL);
#endif /* !defined(INCLUDE_DRIVERS) */
}