Exemple #1
0
struct peer* peer_exists_simple(const char* addr, unsigned short port)
{
	if(!addr || !port) return NULL;

	struct peer* sp=peer_new();
	strncpy(sp->addr, addr, IPV4_MAX);
	sp->port=port;
	struct peer* ret=peer_exists(sp);
	peer_remove(sp);
	return ret;
}
Exemple #2
0
struct peer * peer_connect(struct net *net, const char *node, int port)
{
  struct addrinfo hints;
  struct addrinfo *result;
  struct peer *peer;
  char sport[6];
  int error;
  int s;

  memset(&hints, 0, sizeof(struct addrinfo));

  snprintf(sport, 6, "%d", port);

#ifndef IPV6
  hints.ai_family = AF_INET;
#endif
  hints.ai_flags = AI_ALL;

  error = getaddrinfo(node, sport, &hints, &result);
  if(error != 0)
  {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
    return NULL;
  }

  s = socket(result->ai_family, SOCK_STREAM, IPPROTO_TCP);
  if(s < 0)
    return NULL;

  if(connect(s, result->ai_addr, result->ai_addrlen) < 0)
    return NULL;

  freeaddrinfo(result);

  /* if we got an IPv4 address we need to convert it to mapped v4 format */
  /* this is only for internal representation now when the connection 
   * has been established */
  peer = peer_new(net, s, node, port);

  if(peer_start_handshake(peer) != 0)
    return NULL;

  return peer;
}
Exemple #3
0
//create udp connect socket 
struct peer* peer_udp_create(const char *dstip, unsigned short dstport, unsigned short srcport)
{
        int ret;
	struct peer* peer;
	int socklen;
	struct sockaddr_in sin;
	char buf[256];

	peer = peer_new();
	if (NULL == peer)
		return NULL;
        
        //init the src union
        memset(&sin, 0, sizeof(struct sockaddr_in));
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        sin.sin_port = htons(srcport); 
        socklen = sizeof(struct sockaddr_in);
#ifdef HAVE_SIN_LEN
        sin.sin_len = socklen;
#endif
        peer->su.sin = sin;

        //init the dst unsion
        memset(&sin, 0, sizeof(struct sockaddr_in));
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = inet_addr(dstip); 
	inet_ntop(AF_INET, &sin.sin_addr, buf, 256);
	//fprintf(stderr, "convert from dstip %s address to union address success\n", buf);
        sin.sin_port = htons(dstport); 
        socklen = sizeof(struct sockaddr_in);
#ifdef HAVE_SIN_LEN
        sin.sin_len = socklen;
#endif
        peer->dsu.sin = sin;

	peer->type = TYPE_UDP;
	peer->mode = MODE_CONNECT;
	return peer;
}
Exemple #4
0
/* Hello */
static void hello (void *m)
{
	msg_s	*msg = m;
	ki_t	share_key = msg->q.q_passed_key;
	ki_t	peer_key;
	peer_s	*peer;
	int	rc;
FN;
	peer = peer_new();
	peer->pr_type = &Peer_type.tp_tag;
	peer->pr_share_key = share_key;

	peer_key = make_gate(peer, RESOURCE | PASS_ANY);
	if (!peer_key) {
		free(peer);
		return;
	}
	msg->q.q_passed_key = peer_key;
	msg->m_method = SHARE_PEER;
	rc = send_key_tau(share_key, msg);
	if (rc) {
		destroy_key_tau(peer_key);
	}
}
Exemple #5
0
static void* run_discovery(void* data) {
  discovery_opts_t* opts = (discovery_opts_t*)data;
  char ip[INET_ADDRSTRLEN] = { '\0' };
  const char* interface = opts->interface;

  udp_t *udp = udp_new(PING_PORT_NUMBER, interface);
  assert(udp);

  struct pollfd ufds[1];
  int ret;
  time_t  t0, t1;
  beacon_t beacon;
  uuid_t uuid;
  beacon_t recv;
  peers_t* peers = peers_new();
  struct in_addr addr;

  find_my_ip(&addr, NULL);

  uuid_generate(uuid);
  beacon_fill(&beacon, (uint8_t*)BEACON_PROTOCOL, BEACON_VERSION, uuid, addr, htons(47473));

  ufds[0].fd = udp_handle(udp);
  ufds[0].events = POLLIN;

  t0 = time(NULL);
  t1 = time(NULL);

  struct sockaddr_in sockaddr;
  socklen_t si_len = sizeof(struct sockaddr_in);

  while (1) {
    t1 = time(NULL);
    if ((long)(t1 - t0) >= PING_INTERVAL) {
      ret = udp_send(udp, (uint8_t*)(&beacon), sizeof(beacon_t));
      assert(ret == sizeof(beacon_t));
      t0 = time(NULL);
    }
    ret = poll(ufds, 1, 200);
    if (ret == -1) {
      printf("Error: poll returned -1\n");
      break;
    } else if (ret == 0) {
      continue;
    }

    if (ufds[0].revents & POLLIN) {
      ret = udp_recv(udp, (uint8_t*)&recv, sizeof(beacon_t), &sockaddr, si_len);
      if (ret == sizeof(beacon_t) && beacon_check(&recv, (uint8_t*)BEACON_PROTOCOL, BEACON_VERSION)) {
        if (uuid_compare(uuid, recv.uuid) != 0) {
          peer_t* peer = peers_exist(peers, recv.uuid);
          if (!peer) {
            inet_ntop(sockaddr.sin_family, &sockaddr.sin_addr, ip, INET_ADDRSTRLEN);
            peer = peer_new(recv.uuid, ip, recv.port);
            peers_add(peers, peer);
            opts->add_peer_cb((void*)peer);
          }
          peer_is_alive(peer);
        }
      }
    }
    peers_check(peers);
  }

  peers_destroy(&peers);
  udp_destroy(&udp);
  return NULL;
}