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; }
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; }
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; }
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; }
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; }