static int cmd_niconfig(int argc, char** argv) { if(argc == 1) { int pos = 0; NetworkInterface* ni_inter = ni_get(0); uint32_t inter_ip = (uint32_t)(uint64_t)ni_config_get(ni_inter, "ip"); uint32_t inter_gateway = (uint32_t)(uint64_t)ni_config_get(ni_inter, "gw"); uint32_t inter_netmask = (uint32_t)(uint64_t)ni_config_get(ni_inter, "mask"); uint16_t inter_port = (uint16_t)(uint64_t)ni_config_get(ni_inter, "pn.lb.port"); NetworkInterface* ni_intra = ni_get(1); uint32_t intra_ip = (uint32_t)(uint64_t)ni_config_get(ni_intra, "ip"); uint32_t intra_gateway = (uint32_t)(uint64_t)ni_config_get(ni_intra, "gw"); uint32_t intra_netmask = (uint32_t)(uint64_t)ni_config_get(ni_intra, "mask"); uint16_t intra_port = (uint16_t)(uint64_t)ni_config_get(ni_intra, "pn.lb.config.port"); pos += sprintf(cmd_result, "inter IP:%d.%d.%d.%d Gateway:%d.%d.%d.%d Mask:%d.%d.%d.%d Port:%d\n", (inter_ip >> 24) & 0xff, (inter_ip >> 16) & 0xff, (inter_ip >> 8) & 0xff, inter_ip & 0xff, (inter_gateway >> 24) & 0xff, (inter_gateway >> 16) & 0xff, (inter_gateway >> 8) & 0xff, inter_gateway & 0xff, (inter_netmask >> 24) & 0xff, (inter_netmask >> 16) & 0xff, (inter_netmask >> 8) & 0xff, inter_netmask & 0xff, inter_port); pos += sprintf(cmd_result + pos, "intra IP:%d.%d.%d.%d Gateway:%d.%d.%d.%d Mask:%d.%d.%d.%d ConfigPort:%d\n", (intra_ip >> 24) & 0xff, (intra_ip >> 16) & 0xff, (intra_ip >> 8) & 0xff, intra_ip & 0xff, (intra_gateway >> 24) & 0xff, (intra_gateway >> 16) & 0xff, (intra_gateway >> 8) & 0xff, intra_gateway & 0xff, (intra_netmask >> 24) & 0xff, (intra_netmask >> 16) & 0xff, (intra_netmask >> 8) & 0xff, intra_netmask & 0xff, intra_port); return 0; } else if(argc > 3) {
bool socket_add(NetworkInterface* ni, uint32_t ip, uint16_t port, Socket* socket) { Map* sockets = ni_config_get(ni, SOCKETS); if(!sockets) { sockets = map_create(16, NULL, NULL, ni->pool); if(!sockets) { printf("Can'nt create socket table\n"); return false; } if(!ni_config_put(ni, SOCKETS, sockets)) { map_destroy(sockets); return false; } } uint64_t key = (uint64_t)ip << 32 | (uint64_t)port; if(!map_put(sockets, (void*)key, socket)) { if(map_is_empty(sockets)) { map_destroy(sockets); ni_config_remove(ni, SOCKETS); } return false; } return true; }
Service* service_alloc(Endpoint* service_endpoint) { bool service_add(NetworkInterface* ni, Service* service) { Map* services = ni_config_get(ni, SERVICES); if(!services) { services = map_create(16, NULL, NULL, ni->pool); if(!services) return false; if(!ni_config_put(ni, SERVICES, services)) return false; } uint64_t key = (uint64_t)service->endpoint.protocol << 48 | (uint64_t)service->endpoint.addr << 16 | (uint64_t)service->endpoint.port; if(!map_put(services, (void*)key, service)) { if(map_is_empty(services)) { ni_config_remove(ni, SERVICES); map_destroy(services); } return false; } printf("here???\n"); return true; }
static Endpoint* rip_alloc(NetworkInterface* ni) { static int robin; List* rips = ni_config_get(ni, "pn.lb.rips"); int idx = (robin++) % list_size(rips); return list_get(rips, idx); }
static void rip_add(uint32_t addr, uint16_t port) { Endpoint* endpoint = malloc(sizeof(Endpoint)); endpoint->addr = addr; endpoint->port = port; NetworkInterface* ni_intra = ni_get(1); List* rips = ni_config_get(ni_intra, "pn.lb.rips"); list_add(rips, endpoint); }
Socket* socket_get(NetworkInterface* ni, uint32_t ip, uint16_t port) { Map* sockets = ni_config_get(ni, SOCKETS); if(!sockets) return NULL; uint64_t key = (uint64_t)ip << 32 | (uint64_t)port; return map_get(sockets, (void*)key); }
bool socket_remove(NetworkInterface* ni, uint32_t ip, uint16_t port) { Map* sockets = ni_config_get(ni, SOCKETS); if(!sockets) return false; uint64_t key = (uint64_t)ip << 32 | (uint64_t)port; Socket* socket = map_remove(sockets, (void*)key); if(!socket) return false; socket_delete(ni, socket); if(map_is_empty(sockets)) { map_destroy(sockets); ni_config_remove(ni, SOCKETS); } return true; }