static void add_host( const uint8_t *mac, const uint32_t ip, const uint64_t dpid, const uint16_t port ) { host_entry *entry; struct in_addr addr; addr.s_addr = htonl( ip ); entry = lookup_host( ip ); if ( entry != NULL ) { debug( "Updating a host entry (mac = %02x:%02x:%02x:%02x:%02x:%02x, " "ip = %s, dpid = %#" PRIx64 ", port = %u).", mac[ 0 ], mac[ 1 ], mac[ 2 ], mac[ 3 ], mac[ 4 ], mac[ 5 ], inet_ntoa( addr ), dpid, port ); memcpy( entry->mac, mac, ETH_ADDRLEN ); entry->dpid = dpid; entry->port = port; entry->updated_at = time( NULL ); return; } debug( "Adding a host entry (mac = %02x:%02x:%02x:%02x:%02x:%02x, " "ip = %s, dpid = %#" PRIx64 ", port = %u).", mac[ 0 ], mac[ 1 ], mac[ 2 ], mac[ 3 ], mac[ 4 ], mac[ 5 ], inet_ntoa( addr ), dpid, port ); entry = xmalloc( sizeof( host_entry ) ); memcpy( entry->mac, mac, ETH_ADDRLEN ); entry->ip = ip; entry->dpid = dpid; entry->port = port; entry->updated_at = time( NULL ); insert_hash_entry( host_db, &entry->ip, entry ); add_host_route( entry->ip ); }
int register_static_ip(int net_fd, int ip, char *devname) { char *buffer; int nread; // Static IP buffer = malloc(100); struct ip_header *iphdr = (struct ip_header*)buffer; memset(buffer,0,100); iphdr->vers = 0x45; iphdr->ip_header_len = 20; iphdr->ttl = 64; iphdr->source_ip = ip; if(cwrite(net_fd, buffer, 20) <= 0) { printf("error: write failed while requesting static IP address from server.\n"); exit(1); } nread = cread(net_fd, buffer, 100) ; if(nread == 0) { // Connection closed while trying to assign a statick IP. This means that someone else already has that address. fprintf(stderr, "ERROR: Requested static IP address already in use.\n"); exit(0); } set_ip(devname, ntohl(iphdr->dest_ip), 0xffff0000); if(add_host_route(devname, (in_addr_t)ntohl(iphdr->dest_ip)) < 0) printf("add_host_route returned\n"); // Set the interface address. free(buffer) ; return 0; }
int __connman_connection_gateway_add(struct connman_service *service, const char *gateway, enum connman_ipconfig_type type, const char *peer) { struct gateway_data *active_gateway = NULL; struct gateway_data *new_gateway = NULL; enum connman_ipconfig_type type4 = CONNMAN_IPCONFIG_TYPE_UNKNOWN, type6 = CONNMAN_IPCONFIG_TYPE_UNKNOWN; enum connman_service_type service_type = connman_service_get_type(service); int index; index = __connman_service_get_index(service); /* * If gateway is NULL, it's a point to point link and the default * gateway for ipv4 is 0.0.0.0 and for ipv6 is ::, meaning the * interface */ if (!gateway && type == CONNMAN_IPCONFIG_TYPE_IPV4) gateway = "0.0.0.0"; if (!gateway && type == CONNMAN_IPCONFIG_TYPE_IPV6) gateway = "::"; DBG("service %p index %d gateway %s vpn ip %s type %d", service, index, gateway, peer, type); new_gateway = add_gateway(service, index, gateway, type); if (!new_gateway) return -EINVAL; active_gateway = find_active_gateway(); DBG("active %p index %d new %p", active_gateway, active_gateway ? active_gateway->index : -1, new_gateway); if (type == CONNMAN_IPCONFIG_TYPE_IPV4 && new_gateway->ipv4_gateway) { add_host_route(AF_INET, index, gateway, service_type); __connman_service_nameserver_add_routes(service, new_gateway->ipv4_gateway->gateway); type4 = CONNMAN_IPCONFIG_TYPE_IPV4; } if (type == CONNMAN_IPCONFIG_TYPE_IPV6 && new_gateway->ipv6_gateway) { add_host_route(AF_INET6, index, gateway, service_type); __connman_service_nameserver_add_routes(service, new_gateway->ipv6_gateway->gateway); type6 = CONNMAN_IPCONFIG_TYPE_IPV6; } if (service_type == CONNMAN_SERVICE_TYPE_VPN) { set_vpn_routes(new_gateway, service, gateway, type, peer, active_gateway); } else { if (type == CONNMAN_IPCONFIG_TYPE_IPV4 && new_gateway->ipv4_gateway) new_gateway->ipv4_gateway->vpn = false; if (type == CONNMAN_IPCONFIG_TYPE_IPV6 && new_gateway->ipv6_gateway) new_gateway->ipv6_gateway->vpn = false; } if (!active_gateway) { set_default_gateway(new_gateway, type); goto done; } if (type == CONNMAN_IPCONFIG_TYPE_IPV4 && new_gateway->ipv4_gateway && new_gateway->ipv4_gateway->vpn) { if (!__connman_service_is_split_routing(new_gateway->service)) connman_inet_clear_gateway_address( active_gateway->index, active_gateway->ipv4_gateway->gateway); } if (type == CONNMAN_IPCONFIG_TYPE_IPV6 && new_gateway->ipv6_gateway && new_gateway->ipv6_gateway->vpn) { if (!__connman_service_is_split_routing(new_gateway->service)) connman_inet_clear_ipv6_gateway_address( active_gateway->index, active_gateway->ipv6_gateway->gateway); } done: if (type4 == CONNMAN_IPCONFIG_TYPE_IPV4) __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_READY, CONNMAN_IPCONFIG_TYPE_IPV4); if (type6 == CONNMAN_IPCONFIG_TYPE_IPV6) __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_READY, CONNMAN_IPCONFIG_TYPE_IPV6); return 0; }