[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r15018 - gnunet/src/mesh
From: |
gnunet |
Subject: |
[GNUnet-SVN] r15018 - gnunet/src/mesh |
Date: |
Tue, 19 Apr 2011 02:30:37 +0200 |
Author: bartpolot
Date: 2011-04-19 02:30:37 +0200 (Tue, 19 Apr 2011)
New Revision: 15018
Modified:
gnunet/src/mesh/gnunet-service-mesh.c
Log:
WiP
Modified: gnunet/src/mesh/gnunet-service-mesh.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh.c 2011-04-18 22:29:05 UTC (rev
15017)
+++ gnunet/src/mesh/gnunet-service-mesh.c 2011-04-19 00:30:37 UTC (rev
15018)
@@ -236,6 +236,12 @@
struct PeerInfo
{
/**
+ * Double linked list
+ */
+ struct PeerInfo *next;
+ struct PeerInfo *prev;
+
+ /**
* ID of the peer
*/
GNUNET_PEER_Id id;
@@ -246,6 +252,11 @@
enum PeerState state;
/**
+ * When to try to establish contact again?
+ */
+ struct GNUNET_TIME_Absolute next_reconnect_attempt;
+
+ /**
* Who to send the data to --- FIXME what about multiple (alternate) paths?
*/
GNUNET_PEER_Id first_hop;
@@ -643,9 +654,10 @@
{
struct GNUNET_MESH_TunnelMessage *tunnel_msg;
struct MESH_tunnel *t;
+ struct Client *c;
/* Sanity check for client registration */
- if(NULL == client_retrieve(client)) {
+ if(NULL == (c = client_retrieve(client))) {
GNUNET_break(0);
GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
return;
@@ -661,10 +673,10 @@
tunnel_msg = (struct GNUNET_MESH_TunnelMessage *) message;
/* Sanity check for tunnel numbering */
if(0 == (ntohl(tunnel_msg->tunnel_id) & 0x80000000)) {
- GNUNET_break(0);
- GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
- return;
- }
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
/* Sanity check for duplicate tunnel IDs */
for (t = tunnels_head; t != tunnels_head; t = t->next) {
if(t->tid == ntohl(tunnel_msg->tunnel_id)) {
@@ -673,7 +685,7 @@
return;
}
}
- /* FIXME: calloc? is NULL != 0 on any platform? */
+ /* FIXME: calloc? Is NULL != 0 on any platform? */
t = GNUNET_malloc(sizeof(struct MESH_tunnel));
t->tid = ntohl(tunnel_msg->tunnel_id);
t->oid = myid;
@@ -687,7 +699,11 @@
t->in_tail = NULL;
t->out_head = NULL;
t->out_tail = NULL;
+ t->client = c;
+ GNUNET_CONTAINER_DLL_insert(tunnels_head, tunnels_tail, t);
+ GNUNET_CONTAINER_DLL_insert(c->tunnels_head, c->tunnels_tail, t);
+
GNUNET_SERVER_receive_done(client, GNUNET_OK);
return;
}
@@ -705,15 +721,48 @@
const struct GNUNET_MessageHeader *message)
{
struct GNUNET_MESH_TunnelMessage *tunnel_msg;
+ struct Client *c;
+ struct MESH_tunnel *t;
+ MESH_TunnelID tid;
+ struct PeerInfo *pi;
/* Sanity check for client registration */
- if(NULL == client_retrieve(client)) {
+ if(NULL == (c = client_retrieve(client))) {
GNUNET_break(0);
GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
return;
}
+ /* Message sanity check */
+ if(sizeof(struct GNUNET_MESH_TunnelMessage) != ntohs(message->size)) {
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
+
+ /* Tunnel exists? */
tunnel_msg = (struct GNUNET_MESH_TunnelMessage *) message;
-
+ tid = ntohl(tunnel_msg->tunnel_id);
+ for (t = tunnels_head; t != tunnels_head; t = t->next) {
+ if(t->tid == tid) {
+ break;
+ }
+ }
+ if(t->tid != tid) {
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
+
+ GNUNET_CONTAINER_DLL_remove(tunnels_head, tunnels_tail, t);
+ GNUNET_CONTAINER_DLL_remove(c->tunnels_head, c->tunnels_tail, t);
+
+ for(pi = t->peers_head; pi != t->peers_tail; pi = t->peers_head) {
+ GNUNET_PEER_change_rc(pi->id, -1);
+ GNUNET_CONTAINER_DLL_remove(t->peers_head, t->peers_tail, pi);
+ GNUNET_free(pi);
+ }
+ GNUNET_free(t);
+
GNUNET_SERVER_receive_done(client, GNUNET_OK);
return;
}
@@ -730,12 +779,62 @@
struct GNUNET_SERVER_Client *client,
const struct GNUNET_MessageHeader *message)
{
+ struct GNUNET_MESH_PeerControl *peer_msg;
+ struct Client *c;
+ struct MESH_tunnel *t;
+ MESH_TunnelID tid;
+ struct PeerInfo *peer_info;
+
+
/* Sanity check for client registration */
- if(NULL == client_retrieve(client)) {
+ if(NULL == (c = client_retrieve(client))) {
GNUNET_break(0);
GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
return;
}
+
+ peer_msg = (struct GNUNET_MESH_PeerControl *)message;
+ /* Sanity check for message size */
+ if(sizeof(struct GNUNET_MESH_PeerControl) != ntohs(peer_msg->header.size))
{
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
+
+ /* Does tunnel exist? */
+ tid = ntohl(peer_msg->tunnel_id);
+ for(t = c->tunnels_head; t != c->tunnels_head; t = t->next) {
+ if(t->tid == tid) {
+ break;
+ }
+ }
+ if(NULL == t) {
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ } else {
+ if(t->tid != tid) {
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
+ }
+
+ /* Does client own tunnel? */
+ if(t->client->handle != client) {
+ GNUNET_break(0);
+ GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
+ return;
+ }
+
+ /* Ok, add peer to tunnel */
+ peer_info = (struct PeerInfo *) GNUNET_malloc(sizeof(struct PeerInfo));
+ peer_info->id = GNUNET_PEER_intern(&peer_msg->peer);
+ peer_info->state = MESH_PEER_WAITING;
+ t->peers_total++;
+ GNUNET_CONTAINER_DLL_insert(t->peers_head, t->peers_tail, peer_info);
+ /* TODO MESH SEARCH FOR PEER */
+
GNUNET_SERVER_receive_done(client, GNUNET_OK);
return;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r15018 - gnunet/src/mesh,
gnunet <=