Esempio n. 1
0
int rtm_init(struct fins_module *module, uint32_t flows_num, uint32_t *flows, metadata_element *params, struct envi_record *envi) {
	PRINT_IMPORTANT("Entered: module=%p, params=%p, envi=%p", module, params, envi);
	module->state = FMS_INIT;
	module_create_structs(module);

	rtm_init_params(module);

	module->data = secure_malloc(sizeof(struct rtm_data));
	struct rtm_data *md = (struct rtm_data *) module->data;

	if (module->flows_max < flows_num) {
		PRINT_ERROR("todo error");
		return 0;
	}
	md->flows_num = flows_num;

	int i;
	for (i = 0; i < flows_num; i++) {
		md->flows[i] = flows[i];
	}

	struct sockaddr_un addr;
	memset(&addr, 0, sizeof(struct sockaddr_un));
	int32_t size = sizeof(addr);

	addr.sun_family = AF_UNIX;
	snprintf(addr.sun_path, UNIX_PATH_MAX, RTM_PATH);
	unlink(addr.sun_path);

	md->server_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
	if (md->server_fd < 0) {
		PRINT_ERROR("socket error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		return 0;
	}

	PRINT_DEBUG("binding to: addr='%s'", RTM_PATH);
	if (bind(md->server_fd, (struct sockaddr *) &addr, size) < 0) {
		PRINT_ERROR("bind error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		return 0;
	}
	if (listen(md->server_fd, 10) < 0) {
		PRINT_ERROR("listen error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		return 0;
	}

	sem_init(&md->shared_sem, 0, 1);
	for (i = 0; i < MAX_CONSOLES; i++) {
		md->console_fds[i] = 0;
	}

	md->console_list = list_create(MAX_CONSOLES);
	md->console_counter = 0;

	md->cmd_list = list_create(MAX_COMMANDS);
	md->cmd_counter = 0;

	return 1;
}
Esempio n. 2
0
int rtm_init(struct fins_module *module, metadata_element *params, struct envi_record *envi) {
	PRINT_DEBUG("Entered: module=%p, params=%p, envi=%p", module, params, envi);
	module->state = FMS_INIT;
	module_create_structs(module);

	rtm_init_knobs(module);

	module->data = secure_malloc(sizeof(struct rtm_data));
	struct rtm_data *md = (struct rtm_data *) module->data;

	struct sockaddr_un addr;
	memset(&addr, 0, sizeof(struct sockaddr_un));
	int32_t size = sizeof(addr);

	addr.sun_family = AF_UNIX;
	snprintf(addr.sun_path, UNIX_PATH_MAX, CONSOLE_PATH);
	unlink(addr.sun_path);

	md->server_fd = socket(PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
	if (md->server_fd < 0) {
		PRINT_ERROR("socket error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		return 0;
	}
	if (fchmod(md->server_fd, ACCESSPERMS) < 0) {
		PRINT_ERROR("fchmod rtm: console_path='%s', errno=%u, str='%s'", CONSOLE_PATH, errno, strerror(errno));
		close(md->server_fd);
		return 0;
	}

	mode_t old_mask = umask(0);
	PRINT_IMPORTANT("binding to: addr='%s'", CONSOLE_PATH);
	if (bind(md->server_fd, (struct sockaddr *) &addr, size) < 0) {
		PRINT_ERROR("bind error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		close(md->server_fd);
		return 0;
	}
	umask(old_mask);

	if (listen(md->server_fd, 10) < 0) {
		PRINT_ERROR("listen error: server_fd=%d, errno=%u, str='%s'", md->server_fd, errno, strerror(errno));
		return 0;
	}

	sem_init(&md->shared_sem, 0, 1);
	int i;
	for (i = 0; i < MAX_CONSOLES; i++) {
		md->console_fds[i] = 0;
	}

	md->console_list = list_create(MAX_CONSOLES);
	md->console_counter = 0;

	md->cmd_list = list_create(MAX_COMMANDS);
	md->cmd_counter = 0;

	return 1;
}
Esempio n. 3
0
int switch_init(struct fins_module *module, metadata_element *params, struct envi_record *envi) {
	PRINT_DEBUG("Entered: module=%p, params=%p, envi=%p", module, params, envi);
	module->state = FMS_INIT;
	module_create_structs(module);

	global_switch_event_sem = module->event_sem;

	switch_init_knobs(module);

	module->data = secure_malloc(sizeof(struct switch_data));
//struct switch_data *md = (struct switch_data *) module->data;

	return 1;
}
Esempio n. 4
0
int ipv4_init(struct fins_module *module, uint32_t flows_num, uint32_t *flows, metadata_element *params, struct envi_record *envi) {
	PRINT_IMPORTANT("Entered: module=%p, params=%p, envi=%p", module, params, envi);
	module->state = FMS_INIT;
	module_create_structs(module);

	ipv4_init_params(module);

	module->data = secure_malloc(sizeof(struct ipv4_data));
	struct ipv4_data *md = (struct ipv4_data *) module->data;

	if (module->flows_max < flows_num) {
		PRINT_ERROR("todo error");
		return 0;
	}
	md->flows_num = flows_num;

	int i;
	for (i = 0; i < flows_num; i++) {
		md->flows[i] = flows[i];
	}

	md->addr_list = list_create(IPV4_ADDRESS_LIST_MAX);
	list_for_each1(envi->if_list, ipv4_ifr_get_addr_func, md->addr_list);
	if (envi->if_loopback) {
		md->addr_loopback = (struct addr_record *) list_find(envi->if_loopback->addr_list, addr_is_v4);
	}
	if (envi->if_main) {
		md->addr_main = (struct addr_record *) list_find(envi->if_main->addr_list, addr_is_v4);
	}

	md->route_list = list_filter(envi->route_list, route_is_addr4, route_clone);
	if (md->route_list->len > IPV4_ROUTE_LIST_MAX) {
		PRINT_ERROR("todo");
		struct linked_list *leftover = list_split(md->route_list, IPV4_ROUTE_LIST_MAX - 1);
		list_free(leftover, free);
	}
	md->route_list->max = IPV4_ROUTE_LIST_MAX;

	//when recv pkt would need to check addresses
	//when send pkt would need to check routing table & addresses (for ip address)
	//both of these would need to be updated by switch etc

	//routing_table = IP4_get_routing_table();

	PRINT_DEBUG("after ip4 sort route table");
	memset(&md->stats, 0, sizeof(struct ipv4_stats));

	return 1;
}
Esempio n. 5
0
int udp_init(struct fins_module *module, metadata_element *params, struct envi_record *envi) {
	PRINT_DEBUG("Entered: module=%p, params=%p, envi=%p", module, params, envi);
	module->state = FMS_INIT;
	module_create_structs(module);

	udp_init_knobs(module);

	module->data = secure_malloc(sizeof(struct udp_data));
	struct udp_data *md = (struct udp_data *) module->data;

	//TODO extract this from meta?
	md->sent_packet_list = list_create(UDP_SENT_LIST_MAX);

	return 1;
}