Пример #1
0
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;
}
Пример #2
0
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;
    }    
}
Пример #3
0
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(&param->keys[ix])<=CPS_OBJ_KEY_APP_INST_POS) {
            return get_all_interfaces(param->list);
        } else {
            uint32_t ifix = cps_api_key_element_at(&param->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;
}
Пример #4
0
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;
}