/** * Start interface * */ static int interface_start(char* cmd) { int sockfd, ret, flags; struct sockaddr_un servaddr; const char* servsock_filename = OPENDNSSEC_ENFORCER_SOCKETFILE; ods_log_init(NULL, 0, 0); /* new socket */ sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd <= 0) { fprintf(stderr, "Unable to connect to engine. " "socket() failed: %s\n", strerror(errno)); return 1; } /* no suprises */ bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_UNIX; strncpy(servaddr.sun_path, servsock_filename, sizeof(servaddr.sun_path) - 1); /* connect */ ret = connect(sockfd, (const struct sockaddr*) &servaddr, sizeof(servaddr)); if (ret != 0) { if (cmd && ods_strcmp(cmd, "start\n") == 0) { return system(ODS_EN_ENGINE); } if (cmd && ods_strcmp(cmd, "running\n") == 0) { fprintf(stderr, "Engine not running.\n"); } else { fprintf(stderr, "Unable to connect to engine: " "connect() failed: %s\n", strerror(errno)); } close(sockfd); return 1; } /* set socket to non-blocking */ flags = fcntl(sockfd, F_GETFL, 0); if (flags < 0) { ods_log_error("[%s] unable to start interface, fcntl(F_GETFL) " "failed: %s", cli_str, strerror(errno)); close(sockfd); return 1; } flags |= O_NONBLOCK; if (fcntl(sockfd, F_SETFL, flags) < 0) { ods_log_error("[%s] unable to start interface, fcntl(F_SETFL) " "failed: %s", cli_str, strerror(errno)); close(sockfd); return 1; } /* some sort of interface */ if (!cmd) { fprintf(stderr, "cmd> "); } /* run */ ret = interface_run(stdin, sockfd, cmd); close(sockfd); return ret; }
int main() { //###################################################################### //TODO get this from config file eventually //host interface my_host_mac_addr = 0x080027445566ull; my_host_ip_addr = IP4_ADR_P2H(192,168,1,20); my_host_mask = IP4_ADR_P2H(255,255,255,0); //loopback interface loopback_ip_addr = IP4_ADR_P2H(127,0,0,1); loopback_mask = IP4_ADR_P2H(255,0,0,0); //any any_ip_addr = IP4_ADR_P2H(0,0,0,0); //###################################################################### sem_init(&control_serial_sem, 0, 1); //TODO remove after gen_control_serial_num() converted to RNG signal(SIGINT, termination_handler); //register termination handler // Start the driving thread of each module PRINT_DEBUG("Initialize Modules"); switch_init(); //should always be first daemon_init(); //TODO improve how sets mac/ip interface_init(); arp_init(); arp_register_interface(my_host_mac_addr, my_host_ip_addr); ipv4_init(); set_interface(my_host_ip_addr, my_host_mask); set_loopback(loopback_ip_addr, loopback_mask); icmp_init(); tcp_init(); udp_init(); //rtm_init(); //TODO when updated/fully implemented pthread_attr_t fins_pthread_attr; pthread_attr_init(&fins_pthread_attr); PRINT_DEBUG("Run/start Modules"); switch_run(&fins_pthread_attr); daemon_run(&fins_pthread_attr); interface_run(&fins_pthread_attr); arp_run(&fins_pthread_attr); ipv4_run(&fins_pthread_attr); icmp_run(&fins_pthread_attr); tcp_run(&fins_pthread_attr); udp_run(&fins_pthread_attr); //rtm_run(&fins_pthread_attr); //############################# //TODO custom test, remove later /* if (0) { char recv_data[4000]; while (1) { gets(recv_data); PRINT_DEBUG("Sending ARP req"); metadata *params_req = (metadata *) malloc(sizeof(metadata)); if (params_req == NULL) { PRINT_ERROR("metadata alloc fail"); exit(-1); } metadata_create(params_req); uint32_t dst_ip = IP4_ADR_P2H(192, 168, 1, 11); //uint32_t dst_ip = IP4_ADR_P2H(172, 31, 50, 152); uint32_t src_ip = IP4_ADR_P2H(192, 168, 1, 20); //uint32_t src_ip = IP4_ADR_P2H(172, 31, 50, 160); metadata_writeToElement(params_req, "dst_ip", &dst_ip, META_TYPE_INT32); metadata_writeToElement(params_req, "src_ip", &src_ip, META_TYPE_INT32); struct finsFrame *ff_req = (struct finsFrame*) malloc(sizeof(struct finsFrame)); if (ff_req == NULL) { PRINT_ERROR("todo error"); //metadata_destroy(params_req); exit(-1); } ff_req->dataOrCtrl = CONTROL; ff_req->destinationID.id = ARP_ID; ff_req->destinationID.next = NULL; ff_req->metaData = params_req; ff_req->ctrlFrame.senderID = IP_ID; ff_req->ctrlFrame.serial_num = gen_control_serial_num(); ff_req->ctrlFrame.opcode = CTRL_EXEC; ff_req->ctrlFrame.param_id = EXEC_ARP_GET_ADDR; ff_req->ctrlFrame.data_len = 0; ff_req->ctrlFrame.data = NULL; arp_to_switch(ff_req); //doesn't matter which queue } } //############################# */ while (1) ; return (1); }