Ejemplo n.º 1
0
int
test_version(void)
{
	const char *version = rte_version();
	if (version == NULL)
		return -1;
	printf("Version string: '%s'\n", version);
	if (*version == '\0' ||
			strncmp(version, RTE_VER_PREFIX, sizeof(RTE_VER_PREFIX)-1) != 0)
		return -1;
	return 0;
}
Ejemplo n.º 2
0
void
copy_datapath_info(char *buf, int len) {
  snprintf(buf, (size_t)len, "Lagopus datapath %s (%s%s) %s flowcache",
           LAGOPUS_DATAPLANE_VERSION,
#ifdef HAVE_DPDK
           "DPDK ", rte_version(),
           app.no_cache ? "without" : "with CRC32"
#else
           "raw socket", "",
           "without"
#endif /* HAVE_DPDK */
          );
}
Ejemplo n.º 3
0
/* Parse the argument given in the command line of the application */
static int
eal_parse_args(int argc, char **argv)
{
	int opt, ret, i;
	char **argvopt;
	int option_index;
	int coremask_ok = 0;
	char *prgname = argv[0];
	static struct option lgopts[] = {
		{OPT_NO_HUGE, 0, 0, 0},
		{OPT_NO_PCI, 0, 0, 0},
		{OPT_NO_HPET, 0, 0, 0},
		{OPT_VMWARE_TSC_MAP, 0, 0, 0},
		{OPT_HUGE_DIR, 1, 0, 0},
		{OPT_NO_SHCONF, 0, 0, 0},
		{OPT_PROC_TYPE, 1, 0, 0},
		{OPT_FILE_PREFIX, 1, 0, 0},
		{OPT_SOCKET_MEM, 1, 0, 0},
		{OPT_PCI_WHITELIST, 1, 0, 0},
		{OPT_PCI_BLACKLIST, 1, 0, 0},
		{OPT_VDEV, 1, 0, 0},
		{OPT_SYSLOG, 1, NULL, 0},
		{OPT_VFIO_INTR, 1, NULL, 0},
		{OPT_BASE_VIRTADDR, 1, 0, 0},
		{OPT_XEN_DOM0, 0, 0, 0},
		{OPT_CREATE_UIO_DEV, 1, NULL, 0},
		{0, 0, 0, 0}
	};
	struct shared_driver *solib;

	argvopt = argv;

	internal_config.memory = 0;
	internal_config.force_nrank = 0;
	internal_config.force_nchannel = 0;
	internal_config.hugefile_prefix = HUGEFILE_PREFIX_DEFAULT;
	internal_config.hugepage_dir = NULL;
	internal_config.force_sockets = 0;
	internal_config.syslog_facility = LOG_DAEMON;
	internal_config.xen_dom0_support = 0;
	/* if set to NONE, interrupt mode is determined automatically */
	internal_config.vfio_intr_mode = RTE_INTR_MODE_NONE;
#ifdef RTE_LIBEAL_USE_HPET
	internal_config.no_hpet = 0;
#else
	internal_config.no_hpet = 1;
#endif
	/* zero out the NUMA config */
	for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
		internal_config.socket_mem[i] = 0;

	/* zero out hugedir descriptors */
	for (i = 0; i < MAX_HUGEPAGE_SIZES; i++)
		internal_config.hugepage_info[i].lock_descriptor = -1;

	internal_config.vmware_tsc_map = 0;
	internal_config.base_virtaddr = 0;

	while ((opt = getopt_long(argc, argvopt, "b:w:c:d:m:n:r:v",
				  lgopts, &option_index)) != EOF) {

		switch (opt) {
		/* blacklist */
		case 'b':
			if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
					optarg) < 0) {
				eal_usage(prgname);
				return (-1);
			}
			break;
		/* whitelist */
		case 'w':
			if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
					optarg) < 0) {
				eal_usage(prgname);
				return -1;
			}
			break;
		/* coremask */
		case 'c':
			if (eal_parse_coremask(optarg) < 0) {
				RTE_LOG(ERR, EAL, "invalid coremask\n");
				eal_usage(prgname);
				return -1;
			}
			coremask_ok = 1;
			break;
		/* force loading of external driver */
		case 'd':
			solib = malloc(sizeof(*solib));
			if (solib == NULL) {
				RTE_LOG(ERR, EAL, "malloc(solib) failed\n");
				return -1;
			}
			memset(solib, 0, sizeof(*solib));
			strncpy(solib->name, optarg, PATH_MAX-1);
			solib->name[PATH_MAX-1] = 0;
			TAILQ_INSERT_TAIL(&solib_list, solib, next);
			break;
		/* size of memory */
		case 'm':
			internal_config.memory = atoi(optarg);
			internal_config.memory *= 1024ULL;
			internal_config.memory *= 1024ULL;
			break;
		/* force number of channels */
		case 'n':
			internal_config.force_nchannel = atoi(optarg);
			if (internal_config.force_nchannel == 0 ||
			    internal_config.force_nchannel > 4) {
				RTE_LOG(ERR, EAL, "invalid channel number\n");
				eal_usage(prgname);
				return -1;
			}
			break;
		/* force number of ranks */
		case 'r':
			internal_config.force_nrank = atoi(optarg);
			if (internal_config.force_nrank == 0 ||
			    internal_config.force_nrank > 16) {
				RTE_LOG(ERR, EAL, "invalid rank number\n");
				eal_usage(prgname);
				return -1;
			}
			break;
		case 'v':
			/* since message is explicitly requested by user, we
			 * write message at highest log level so it can always be seen
			 * even if info or warning messages are disabled */
			RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
			break;

		/* long options */
		case 0:
			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
				internal_config.no_hugetlbfs = 1;
			}
			if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
		#ifdef RTE_LIBRTE_XEN_DOM0
				internal_config.xen_dom0_support = 1;
		#else
				RTE_LOG(ERR, EAL, "Can't support DPDK app "
					"running on Dom0, please configure"
					" RTE_LIBRTE_XEN_DOM0=y\n");
				return -1;
		#endif
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
				internal_config.no_pci = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
				internal_config.no_hpet = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
				internal_config.vmware_tsc_map = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
				internal_config.no_shconf = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
				internal_config.hugepage_dir = optarg;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
				internal_config.process_type = eal_parse_proc_type(optarg);
			}
			else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
				internal_config.hugefile_prefix = optarg;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
				if (eal_parse_socket_mem(optarg) < 0) {
					RTE_LOG(ERR, EAL, "invalid parameters for --"
							OPT_SOCKET_MEM "\n");
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
				printf("The --use-device option is deprecated, please use\n"
					"--whitelist or --vdev instead.\n");
				eal_usage(prgname);
				return -1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
				if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
						optarg) < 0) {
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_PCI_WHITELIST)) {
				if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
						optarg) < 0) {
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
				if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
						optarg) < 0) {
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
				if (eal_parse_syslog(optarg) < 0) {
					RTE_LOG(ERR, EAL, "invalid parameters for --"
							OPT_SYSLOG "\n");
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
				if (eal_parse_base_virtaddr(optarg) < 0) {
					RTE_LOG(ERR, EAL, "invalid parameter for --"
							OPT_BASE_VIRTADDR "\n");
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
				if (eal_parse_vfio_intr(optarg) < 0) {
					RTE_LOG(ERR, EAL, "invalid parameters for --"
							OPT_VFIO_INTR "\n");
					eal_usage(prgname);
					return -1;
				}
			}
			else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
				internal_config.create_uio_dev = 1;
			}
			break;

		default:
			eal_usage(prgname);
			return -1;
		}
	}

	/* sanity checks */
	if (!coremask_ok) {
		RTE_LOG(ERR, EAL, "coremask not specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.process_type == RTE_PROC_AUTO){
		internal_config.process_type = eal_proc_type_detect();
	}
	if (internal_config.process_type == RTE_PROC_INVALID){
		RTE_LOG(ERR, EAL, "Invalid process type specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.process_type == RTE_PROC_PRIMARY &&
			internal_config.force_nchannel == 0) {
		RTE_LOG(ERR, EAL, "Number of memory channels (-n) not specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (index(internal_config.hugefile_prefix,'%') != NULL){
		RTE_LOG(ERR, EAL, "Invalid char, '%%', in '"OPT_FILE_PREFIX"' option\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.memory > 0 && internal_config.force_sockets == 1) {
		RTE_LOG(ERR, EAL, "Options -m and --socket-mem cannot be specified "
				"at the same time\n");
		eal_usage(prgname);
		return -1;
	}
	/* --no-huge doesn't make sense with either -m or --socket-mem */
	if (internal_config.no_hugetlbfs &&
			(internal_config.memory > 0 ||
					internal_config.force_sockets == 1)) {
		RTE_LOG(ERR, EAL, "Options -m or --socket-mem cannot be specified "
				"together with --no-huge!\n");
		eal_usage(prgname);
		return -1;
	}
	/* --xen-dom0 doesn't make sense with --socket-mem */
	if (internal_config.xen_dom0_support && internal_config.force_sockets == 1) {
		RTE_LOG(ERR, EAL, "Options --socket-mem cannot be specified "
					"together with --xen_dom0!\n");
		eal_usage(prgname);
		return -1;
	}

	if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 0 &&
		rte_eal_devargs_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 0) {
		RTE_LOG(ERR, EAL, "Error: blacklist [-b] and whitelist "
			"[-w] options cannot be used at the same time\n");
		eal_usage(prgname);
		return -1;
	}

	if (optind >= 0)
		argv[optind-1] = prgname;

	/* if no memory amounts were requested, this will result in 0 and
	 * will be overriden later, right after eal_hugepage_info_init() */
	for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
		internal_config.memory += internal_config.socket_mem[i];

	ret = optind-1;
	optind = 0; /* reset getopt lib */
	return ret;
}
Ejemplo n.º 4
0
int
eal_parse_common_option(int opt, const char *optarg,
			struct internal_config *conf)
{
	switch (opt) {
	/* blacklist */
	case 'b':
		if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
				optarg) < 0) {
			return -1;
		}
		break;
	/* whitelist */
	case 'w':
		if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
				optarg) < 0) {
			return -1;
		}
		break;
	/* coremask */
	case 'c':
		if (eal_parse_coremask(optarg) < 0) {
			RTE_LOG(ERR, EAL, "invalid coremask\n");
			return -1;
		}
		break;
	/* corelist */
	case 'l':
		if (eal_parse_corelist(optarg) < 0) {
			RTE_LOG(ERR, EAL, "invalid core list\n");
			return -1;
		}
		break;
	/* size of memory */
	case 'm':
		conf->memory = atoi(optarg);
		conf->memory *= 1024ULL;
		conf->memory *= 1024ULL;
		mem_parsed = 1;
		break;
	/* force number of channels */
	case 'n':
		conf->force_nchannel = atoi(optarg);
		if (conf->force_nchannel == 0 ||
		    conf->force_nchannel > 4) {
			RTE_LOG(ERR, EAL, "invalid channel number\n");
			return -1;
		}
		break;
	/* force number of ranks */
	case 'r':
		conf->force_nrank = atoi(optarg);
		if (conf->force_nrank == 0 ||
		    conf->force_nrank > 16) {
			RTE_LOG(ERR, EAL, "invalid rank number\n");
			return -1;
		}
		break;
	case 'v':
		/* since message is explicitly requested by user, we
		 * write message at highest log level so it can always
		 * be seen
		 * even if info or warning messages are disabled */
		RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
		break;

	/* long options */
	case OPT_NO_HUGE_NUM:
		conf->no_hugetlbfs = 1;
		break;

	case OPT_NO_PCI_NUM:
		conf->no_pci = 1;
		break;

	case OPT_NO_HPET_NUM:
		conf->no_hpet = 1;
		break;

	case OPT_VMWARE_TSC_MAP_NUM:
		conf->vmware_tsc_map = 1;
		break;

	case OPT_NO_SHCONF_NUM:
		conf->no_shconf = 1;
		break;

	case OPT_PROC_TYPE_NUM:
		conf->process_type = eal_parse_proc_type(optarg);
		break;

	case OPT_MASTER_LCORE_NUM:
		if (eal_parse_master_lcore(optarg) < 0) {
			RTE_LOG(ERR, EAL, "invalid parameter for --"
					OPT_MASTER_LCORE "\n");
			return -1;
		}
		break;

	case OPT_VDEV_NUM:
		if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
				optarg) < 0) {
			return -1;
		}
		break;

	case OPT_SYSLOG_NUM:
		if (eal_parse_syslog(optarg, conf) < 0) {
			RTE_LOG(ERR, EAL, "invalid parameters for --"
					OPT_SYSLOG "\n");
			return -1;
		}
		break;

	case OPT_LOG_LEVEL_NUM: {
		uint32_t log;

		if (eal_parse_log_level(optarg, &log) < 0) {
			RTE_LOG(ERR, EAL,
				"invalid parameters for --"
				OPT_LOG_LEVEL "\n");
			return -1;
		}
		conf->log_level = log;
		break;
	}

	/* don't know what to do, leave this to caller */
	default:
		return 1;

	}

	return 0;
}
Ejemplo n.º 5
0
/* Parse the argument given in the command line of the application */
static int
eal_parse_args(int argc, char **argv)
{
	int opt, ret, i;
	char **argvopt;
	int option_index;
	int coremask_ok = 0;
	ssize_t blacklist_index = 0;;
	char *prgname = argv[0];
	static struct option lgopts[] = {
		{OPT_NO_HUGE, 0, 0, 0},
		{OPT_NO_PCI, 0, 0, 0},
		{OPT_NO_HPET, 0, 0, 0},
		{OPT_HUGE_DIR, 1, 0, 0},
		{OPT_NO_SHCONF, 0, 0, 0},
		{OPT_PROC_TYPE, 1, 0, 0},
		{OPT_FILE_PREFIX, 1, 0, 0},
		{OPT_SOCKET_MEM, 1, 0, 0},
		{0, 0, 0, 0}
	};

	argvopt = argv;

	internal_config.memory = 0;
	internal_config.force_nrank = 0;
	internal_config.force_nchannel = 0;
	internal_config.hugefile_prefix = HUGEFILE_PREFIX_DEFAULT;
	internal_config.hugepage_dir = NULL;
	internal_config.force_sockets = 0;
#ifdef RTE_LIBEAL_USE_HPET
	internal_config.no_hpet = 0;
#else
	internal_config.no_hpet = 1;
#endif
	/* zero out the NUMA config */
	for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
		internal_config.socket_mem[i] = 0;

	/* zero out hugedir descriptors */
	for (i = 0; i < MAX_HUGEPAGE_SIZES; i++)
		internal_config.hugepage_info[i].lock_descriptor = 0;

	while ((opt = getopt_long(argc, argvopt, "b:c:m:n:r:v",
				  lgopts, &option_index)) != EOF) {

		switch (opt) {
		/* blacklist */
		case 'b':
			if ((blacklist_index = eal_parse_blacklist_opt(optarg,
			    blacklist_index)) < 0) {
				eal_usage(prgname);
				return (-1);
			}
			break;
		/* coremask */
		case 'c':
			if (eal_parse_coremask(optarg) < 0) {
				RTE_LOG(ERR, EAL, "invalid coremask\n");
				eal_usage(prgname);
				return -1;
			}
			coremask_ok = 1;
			break;
		/* size of memory */
		case 'm':
			internal_config.memory = atoi(optarg);
			internal_config.memory *= 1024ULL;
			internal_config.memory *= 1024ULL;
			break;
		/* force number of channels */
		case 'n':
			internal_config.force_nchannel = atoi(optarg);
			if (internal_config.force_nchannel == 0 ||
			    internal_config.force_nchannel > 4) {
				RTE_LOG(ERR, EAL, "invalid channel number\n");
				eal_usage(prgname);
				return -1;
			}
			break;
		/* force number of ranks */
		case 'r':
			internal_config.force_nrank = atoi(optarg);
			if (internal_config.force_nrank == 0 ||
			    internal_config.force_nrank > 16) {
				RTE_LOG(ERR, EAL, "invalid rank number\n");
				eal_usage(prgname);
				return -1;
			}
			break;
		case 'v':
			/* since message is explicitly requested by user, we
			 * write message at highest log level so it can always be seen
			 * even if info or warning messages are disabled */
			RTE_LOG(CRIT, EAL, "RTE Version: '%s'\n", rte_version());
			break;

		/* long options */
		case 0:
			if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
				internal_config.no_hugetlbfs = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
				internal_config.no_pci = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
				internal_config.no_hpet = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
				internal_config.no_shconf = 1;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
				internal_config.hugepage_dir = optarg;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
				internal_config.process_type = eal_parse_proc_type(optarg);
			}
			else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
				internal_config.hugefile_prefix = optarg;
			}
			else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
				if (eal_parse_socket_mem(optarg) < 0) {
					RTE_LOG(ERR, EAL, "invalid parameters for --"
							OPT_SOCKET_MEM "\n");
					eal_usage(prgname);
					return -1;
				}
			}
			break;

		default:
			eal_usage(prgname);
			return -1;
		}
	}

	/* sanity checks */
	if (!coremask_ok) {
		RTE_LOG(ERR, EAL, "coremask not specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.process_type == RTE_PROC_AUTO){
		internal_config.process_type = eal_proc_type_detect();
	}
	if (internal_config.process_type == RTE_PROC_INVALID){
		RTE_LOG(ERR, EAL, "Invalid process type specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.process_type == RTE_PROC_PRIMARY &&
			internal_config.force_nchannel == 0) {
		RTE_LOG(ERR, EAL, "Number of memory channels (-n) not specified\n");
		eal_usage(prgname);
		return -1;
	}
	if (index(internal_config.hugefile_prefix,'%') != NULL){
		RTE_LOG(ERR, EAL, "Invalid char, '%%', in '"OPT_FILE_PREFIX"' option\n");
		eal_usage(prgname);
		return -1;
	}
	if (internal_config.memory > 0 && internal_config.force_sockets == 1) {
		RTE_LOG(ERR, EAL, "Options -m and --socket-mem cannot be specified "
				"at the same time\n");
		eal_usage(prgname);
		return -1;
	}
	/* --no-huge doesn't make sense with either -m or --socket-mem */
	if (internal_config.no_hugetlbfs &&
			(internal_config.memory > 0 ||
					internal_config.force_sockets == 1)) {
		RTE_LOG(ERR, EAL, "Options -m or --socket-mem cannot be specified "
				"together with --no-huge!\n");
		eal_usage(prgname);
		return -1;
	}

	if (blacklist_index > 0)
		rte_eal_pci_set_blacklist(eal_dev_blacklist, blacklist_index);

	if (optind >= 0)
		argv[optind-1] = prgname;

	/* if no memory amounts were requested, this will result in 0 and
	 * will be overriden later, right after eal_hugepage_info_init() */
	for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
		internal_config.memory += internal_config.socket_mem[i];

	ret = optind-1;
	optind = 0; /* reset getopt lib */
	return ret;
}