void get_conn(client_conn *conn) { const char *server_ip = (const char*)cargs->ip_addr; int server_port = cargs->serv_portno; struct sockaddr *serv_sa = inet_pton_sa(server_ip, server_port); vector *ifaces = get_all_interfaces(); struct ifi_info serv_ifi; memset(&serv_ifi, 0, sizeof(serv_ifi)); serv_ifi.ifi_addr = serv_sa; conn->is_local = FALSE; // Check if the server is on the same machine as the client. algorithm_reduce(ifaces, is_local_interface_reducer, &serv_ifi); // serv_ifi.ifi_myflags is == 1 if the client & server share an IP // address. if (serv_ifi.ifi_myflags) { // Client & server are on the same machine. conn->is_local = TRUE; conn->cli_sa = inet_pton_sa("127.0.0.1", 0); conn->serv_sa = inet_pton_sa("127.0.0.1", server_port); return; } serv_ifi.ifi_myflags = 0; // The length of the longest match. algorithm_reduce(ifaces, longest_match_reducer, &serv_ifi); if (serv_ifi.ifi_brdaddr) { conn->is_local = TRUE; conn->serv_sa = serv_sa; char client_ip[40]; strcpy(client_ip, Sock_ntop_host(serv_ifi.ifi_brdaddr, sizeof(SA))); // Client bind(2)s to port 0 (locally). conn->cli_sa = inet_pton_sa(client_ip, 0); return; } // We could not find any local interfaces that match. Let the kernel // choose the outgoing interface for us. VERBOSE("serv_sa: %s\n", Sock_ntop(serv_sa, sizeof(*serv_sa))); conn->cli_sa = inet_pton_sa("0.0.0.0", 0); conn->serv_sa = serv_sa; }
boolean get_first_mac_address (char * mac, uint32_t max_len) { char buf[VAM_UTIL_BUF_LEN]; struct ifconf ifc; struct ifreq *ifr; int nInterfaces; int i; struct ifreq *item = NULL; if (!mac) { return FALSE; } /* Query available interfaces. */ ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; if(!get_all_interfaces( &ifc )) { return FALSE; } /* Iterate through the list of interfaces. */ ifr = ifc.ifc_req; nInterfaces = ifc.ifc_len / sizeof(struct ifreq); for (i = 0; i < nInterfaces; i++) { if (strncmp((&ifr[i])->ifr_name, "lo", 2) != 0) { item = &ifr[i]; break; } } if (item && get_mac_address_by_if(item->ifr_name, mac, max_len)) { return TRUE; } else { return FALSE; } }
cps_api_return_code_t ds_api_linux_interface_get_function (void * context, cps_api_get_params_t * param, size_t ix) { cps_api_return_code_t rc = cps_api_ret_code_OK; cps_api_key_t key; cps_api_int_if_key_create(&key,false,0,0); if (cps_api_key_matches(&(param->keys[ix]),&key,false)==0) { if (cps_api_key_get_len(¶m->keys[ix])<=CPS_OBJ_KEY_APP_INST_POS) { return get_all_interfaces(param->list); } else { uint32_t ifix = cps_api_key_element_at(¶m->keys[ix],CPS_API_INT_IF_OBJ_KEY_IFIX); char if_name[HAL_IF_NAME_SZ+1]; if (cps_api_interface_if_index_to_name(ifix,if_name, sizeof(if_name))==NULL) { return cps_api_ret_code_OK; } rc = get_interface(if_name,param,&ix); //toss rc on a query unless it fails due to some sw err } } return rc; }
int main(int argc, char **argv) { atexit(on_client_exit); const char *cargs_file = CARGS_FILE; cargs = MALLOC(client_args); if (read_cargs((const char *)cargs_file, cargs)) { exit(1); } utils_init(); perhaps_init(); vector_init(&interfaces, sizeof(struct ifi_info)); // Initialize the receiving window rwindow_init(&rwin, cargs->sw_size); get_all_interfaces(); // Call print_ifi_info(). print_ifi_info((struct ifi_info*)vector_at(&interfaces, 0)); conn = MALLOC(client_conn); file_name_pkt = MALLOC(packet_t); memset(file_name_pkt, 0, sizeof(packet_t)); file_name_pkt->ack = 0; file_name_pkt->seq = 0; file_name_pkt->flags = FLAG_SYN; file_name_pkt->datalen = strlen(cargs->file_name); strcpy(file_name_pkt->data, cargs->file_name); get_conn(conn); INFO("Server is %s\nIPServer: %s\nIPClient: %s\n", (conn->is_local ? "Local" : "Not Local"), sa_data_str(conn->serv_sa), sa_data_str(conn->cli_sa)); initiate_tx(); return 0; }