[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r5325 - in GNUnet/src: applications/transport include serve
From: |
gnunet |
Subject: |
[GNUnet-SVN] r5325 - in GNUnet/src: applications/transport include server |
Date: |
Fri, 20 Jul 2007 11:25:08 -0600 (MDT) |
Author: grothoff
Date: 2007-07-20 11:25:07 -0600 (Fri, 20 Jul 2007)
New Revision: 5325
Modified:
GNUnet/src/applications/transport/transport.c
GNUnet/src/include/gnunet_transport_service.h
GNUnet/src/include/gnunet_util_string.h
GNUnet/src/server/connection.c
GNUnet/src/server/connection.h
Log:
even more assertions
Modified: GNUnet/src/applications/transport/transport.c
===================================================================
--- GNUnet/src/applications/transport/transport.c 2007-07-20 15:59:36 UTC
(rev 5324)
+++ GNUnet/src/applications/transport/transport.c 2007-07-20 17:25:07 UTC
(rev 5325)
@@ -66,7 +66,41 @@
#define CHECK(s) do {} while(0)
#endif
+
/**
+ * Close the session with the remote node.
+ * @return OK on success, SYSERR on error
+ */
+static int
+assertAssociated (TSession * tsession, const char *token)
+{
+ int i;
+
+ if (tsession == NULL)
+ {
+ GE_BREAK (ectx, 0);
+ return SYSERR;
+ }
+ MUTEX_LOCK (lock);
+ for (i = 0; i < tsession->token_count; i++)
+ {
+ if (0 == strcmp (tsession->tokens[i], token))
+ {
+ i = -1;
+ break;
+ }
+ }
+ if (i != -1)
+ {
+ GE_BREAK(NULL, 0);
+ MUTEX_UNLOCK (lock);
+ return SYSERR;
+ }
+ MUTEX_UNLOCK (lock);
+ return OK;
+}
+
+/**
* Create signed hello for this transport and put it into
* the cache tapi->hello.
*/
@@ -216,6 +250,8 @@
APPEND (tsession->tokens, tsession->token_count, token);
CHECK(tsession);
MUTEX_UNLOCK (lock);
+ GE_BREAK(NULL,
+ OK == assertAssociated(tsession, token));
return tsession;
}
@@ -288,7 +324,10 @@
APPEND (tsession->tokens, tsession->token_count, token);
CHECK(tsession);
MUTEX_UNLOCK (lock);
- return ret;
+ if (ret == OK)
+ GE_BREAK(NULL,
+ OK == assertAssociated(tsession, token));
+ return ret;
}
/**
@@ -799,6 +838,7 @@
ret.createhello = &transportCreatehello;
ret.getAdvertisedhellos = &getAdvertisedhellos;
ret.testWouldTry = &testWouldTry;
+ ret.assertAssociated = &assertAssociated;
return &ret;
}
Modified: GNUnet/src/include/gnunet_transport_service.h
===================================================================
--- GNUnet/src/include/gnunet_transport_service.h 2007-07-20 15:59:36 UTC
(rev 5324)
+++ GNUnet/src/include/gnunet_transport_service.h 2007-07-20 17:25:07 UTC
(rev 5325)
@@ -206,6 +206,11 @@
*/
int (*testWouldTry) (TSession * tsession, unsigned int size, int important);
+ /**
+ * Verify that this session is associated (with the given
+ * token).
+ */
+ int (*assertAssociated) (TSession * tsession, const char *token);
} Transport_ServiceAPI;
Modified: GNUnet/src/include/gnunet_util_string.h
===================================================================
--- GNUnet/src/include/gnunet_util_string.h 2007-07-20 15:59:36 UTC (rev
5324)
+++ GNUnet/src/include/gnunet_util_string.h 2007-07-20 17:25:07 UTC (rev
5325)
@@ -157,7 +157,7 @@
* Append an element to a list (growing the
* list by one).
*/
-#define APPEND(arr,size,element) do { GROW(arr,size,(size)+1); arr[(size)-1] =
(element); } while(0)
+#define APPEND(arr,size,element) do { GROW(arr,size,size+1); arr[size-1] =
element; } while(0)
/**
* Like snprintf, just aborts if the buffer is of insufficient size.
Modified: GNUnet/src/server/connection.c
===================================================================
--- GNUnet/src/server/connection.c 2007-07-20 15:59:36 UTC (rev 5324)
+++ GNUnet/src/server/connection.c 2007-07-20 17:25:07 UTC (rev 5325)
@@ -219,12 +219,18 @@
#define STAT_UP 7
-#if DEBUG_CONNECTION == 2
-#define ENTRY() GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER, "Method entry:
%s defined in %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
+#if 1
+#define ENTRY() check_invariants()
#else
#define ENTRY() ;
#endif
+#if 1
+#define EXIT() check_invariants()
+#else
+#define EXIT() ;
+#endif
+
#if DEBUG_COLLECT_PRIO == YES
FILE *prioFile;
#endif
@@ -341,9 +347,9 @@
} SendEntry;
/**
- * A session is a token provided by the transport
+ * A tsession is a token provided by the transport
* API to refer to a connection of the transport
- * layer.
+ * layer.
*/
typedef struct
{
@@ -637,6 +643,25 @@
/* ******************** CODE ********************* */
+static void check_invariants() {
+ int i;
+ BufferEntry *root;
+
+ MUTEX_LOCK (lock);
+ for (i = 0; i < CONNECTION_MAX_HOSTS_; i++)
+ {
+ root = CONNECTION_buffer_[i];
+ while (NULL != root)
+ {
+ if (root->session.tsession != NULL)
+ GE_ASSERT(NULL,
+ OK == transport->assertAssociated(root->session.tsession,
__FILE__));
+ root = root->overflowChain;
+ }
+ }
+ MUTEX_UNLOCK(lock);
+}
+
/**
* This allocates and initializes a BufferEntry.
* @return the initialized BufferEntry
@@ -2529,6 +2554,7 @@
int load_nup;
int load_cpu;
+ ENTRY();
load_cpu = os_cpu_get_load (ectx, cfg);
load_nup = os_network_monitor_get_load (load_monitor, Upload);
scheduleInboundTraffic ();
@@ -2674,6 +2700,7 @@
stats->set (stat_total_allowed_now, total_allowed_now);
stats->set (stat_total_send_buffer_size, total_send_buffer_size);
}
+ EXIT();
}
/**
@@ -2711,6 +2738,7 @@
GE_LOG (ectx,
GE_WARNING | GE_BULK | GE_DEVELOPER,
_("Message from `%s' discarded: invalid format.\n"), &enc);
+ EXIT();
return SYSERR;
}
if (stats != NULL)
@@ -2720,8 +2748,10 @@
if (equalsHashCode512 (&hc,
&msg->hash) &&
(msg->sequenceNumber == 0) &&
- (msg->bandwidth == 0) && (msg->timeStamp == 0))
+ (msg->bandwidth == 0) && (msg->timeStamp == 0)) {
+ EXIT();
return NO; /* plaintext */
+ }
MUTEX_LOCK (lock);
be = lookForHost (sender);
@@ -2742,6 +2772,7 @@
if ((be == NULL) || (be->status == STAT_DOWN))
addHost (sender, YES);
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR; /* could not decrypt */
}
tmp = MALLOC (size - sizeof (HashCode512));
@@ -2762,6 +2793,7 @@
addHost (sender, YES);
MUTEX_UNLOCK (lock);
FREE (tmp);
+ EXIT();
return SYSERR;
}
if (stats != NULL)
@@ -2794,6 +2826,7 @@
sequenceNumber, be->lastSequenceNumberReceived);
#endif
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR;
}
}
@@ -2813,6 +2846,7 @@
_("Message received more than one day old. Dropped.\n"));
#endif
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR;
}
@@ -2828,6 +2862,7 @@
}
be->recently_received += size;
MUTEX_UNLOCK (lock);
+ EXIT();
return YES;
}
@@ -2894,6 +2929,7 @@
{
BufferEntry *be;
+ ENTRY();
MUTEX_LOCK (lock);
be = lookForHost (peer);
if (be == NULL)
@@ -2923,6 +2959,7 @@
}
}
MUTEX_UNLOCK (lock);
+ EXIT();
}
/**
@@ -2935,6 +2972,7 @@
{
BufferEntry *be;
+ ENTRY();
MUTEX_LOCK (lock);
be = lookForHost (peer);
if (be != NULL)
@@ -2961,6 +2999,7 @@
}
}
MUTEX_UNLOCK (lock);
+ EXIT();
}
@@ -2984,6 +3023,8 @@
{
BufferEntry *be;
int ret;
+
+ ENTRY();
ret = 0;
MUTEX_LOCK (lock);
if ((slot >= 0) && (slot < CONNECTION_MAX_HOSTS_))
@@ -2997,6 +3038,7 @@
}
}
MUTEX_UNLOCK (lock);
+ EXIT();
return ret;
}
@@ -3012,6 +3054,7 @@
int ret;
BufferEntry *be;
+ ENTRY();
ret = 0;
MUTEX_LOCK (lock);
be = lookForHost (peer);
@@ -3026,6 +3069,7 @@
ret = SYSERR;
}
MUTEX_UNLOCK (lock);
+ EXIT();
return ret;
}
@@ -3047,6 +3091,7 @@
int ret;
BufferEntry *be;
+ ENTRY();
ret = SYSERR;
MUTEX_LOCK (lock);
be = lookForHost (peer);
@@ -3072,6 +3117,7 @@
}
}
MUTEX_UNLOCK (lock);
+ EXIT();
return ret;
}
@@ -3109,6 +3155,7 @@
if (be == NULL)
{
MUTEX_UNLOCK (lock);
+ EXIT();
return;
}
cost = -1;
@@ -3126,8 +3173,10 @@
data on throughput. - CG
*/
if ((transport->getCost (tsession->ttype) < cost) &&
- (transport->associate (tsession, __FILE__) == OK))
+ (OK == transport->associate (tsession, __FILE__)))
{
+ GE_ASSERT(NULL,
+ OK == transport->assertAssociated(tsession, __FILE__));
ts = be->session.tsession;
if (ts != NULL)
{
@@ -3136,9 +3185,12 @@
}
be->session.tsession = tsession;
be->session.mtu = transport->getMTU (tsession->ttype);
+ check_invariants();
fragmentIfNecessary (be);
}
+ EXIT();
MUTEX_UNLOCK (lock);
+ EXIT();
}
@@ -3320,6 +3372,7 @@
("# total number of bytes we are currently allowed to send"));
}
transport->start (&core_receive);
+ EXIT();
}
@@ -3389,6 +3442,7 @@
ectx = NULL;
cfg = NULL;
load_monitor = NULL;
+ EXIT();
}
@@ -3406,11 +3460,13 @@
fENHWrap wrap;
int ret;
+ ENTRY();
wrap.method = method;
wrap.arg = arg;
MUTEX_LOCK (lock);
ret = forAllConnectedHosts (&fENHCallback, &wrap);
MUTEX_UNLOCK (lock);
+ EXIT();
return ret;
}
@@ -3508,6 +3564,7 @@
scl_nextTail = scl;
}
MUTEX_UNLOCK (lock);
+ EXIT();
return OK;
}
@@ -3531,6 +3588,7 @@
SendCallbackList *pos;
SendCallbackList *prev;
+ ENTRY();
prev = NULL;
MUTEX_LOCK (lock);
pos = scl_nextHead;
@@ -3547,12 +3605,14 @@
scl_nextTail = prev;
FREE (pos);
MUTEX_UNLOCK (lock);
+ EXIT();
return OK;
}
prev = pos;
pos = pos->next;
}
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR;
}
@@ -3575,6 +3635,7 @@
int ret;
P2P_PACKET_HEADER *hdr;
+ ENTRY();
GE_ASSERT (ectx, tsession != NULL);
if ((transport->getMTU (tsession->ttype) > 0) &&
(transport->getMTU (tsession->ttype) <
@@ -3594,6 +3655,7 @@
ret = transport->send (tsession,
buf, size + sizeof (P2P_PACKET_HEADER), NO);
FREE (buf);
+ EXIT();
return ret;
}
@@ -3639,6 +3701,7 @@
FREENONNULL (closure);
}
MUTEX_UNLOCK (lock);
+ EXIT();
}
/**
@@ -3658,22 +3721,27 @@
char *closure;
unsigned short len;
+ ENTRY();
if ((getBandwidthAssignedTo (receiver, NULL, NULL) != OK) &&
(identity->isBlacklistedStrict (receiver) == NO))
session->tryConnect (receiver);
- if (msg == NULL)
+ if (msg == NULL) {
+ EXIT();
return;
+ }
len = ntohs (msg->size);
if (len == 0)
{
GE_LOG (ectx,
GE_DEBUG | GE_BULK | GE_DEVELOPER,
"Empty message send (hopefully used to initiate connection
attempt)\n");
+ EXIT();
return;
}
closure = MALLOC (len);
memcpy (closure, msg, len);
unicastCallback (receiver, NULL, closure, len, importance, maxdelay);
+ EXIT();
}
/**
@@ -3685,8 +3753,11 @@
unsigned int
computeIndex (const PeerIdentity * hostId)
{
- unsigned int res = (((unsigned int) hostId->hashPubKey.bits[0]) &
- ((unsigned int) (CONNECTION_MAX_HOSTS_ - 1)));
+ unsigned int res;
+
+ ENTRY();
+ res = (((unsigned int) hostId->hashPubKey.bits[0]) &
+ ((unsigned int) (CONNECTION_MAX_HOSTS_ - 1)));
GE_ASSERT (ectx, res < CONNECTION_MAX_HOSTS_);
return res;
}
@@ -3726,6 +3797,7 @@
ret = SYSERR;
}
MUTEX_UNLOCK (lock);
+ EXIT();
return ret;
}
@@ -3745,6 +3817,7 @@
if (be != NULL)
be->current_connection_value += preference;
MUTEX_UNLOCK (lock);
+ EXIT();
}
/**
@@ -3780,6 +3853,7 @@
shutdownConnection (be);
}
MUTEX_UNLOCK (lock);
+ EXIT();
}
/**
@@ -3795,10 +3869,12 @@
{
if (callback == NULL)
return SYSERR;
+ ENTRY();
MUTEX_LOCK (lock);
GROW (rsns, rsnSize, rsnSize + 1);
rsns[rsnSize - 1] = callback;
MUTEX_UNLOCK (lock);
+ EXIT();
return OK;
}
@@ -3814,6 +3890,10 @@
unregisterSendNotify (MessagePartHandler callback)
{
int i;
+
+ if (callback == NULL)
+ return OK;
+ ENTRY();
MUTEX_LOCK (lock);
for (i = 0; i < rsnSize; i++)
{
@@ -3826,6 +3906,7 @@
}
}
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR;
}
@@ -3841,6 +3922,7 @@
int i;
BufferEntry *root;
+ ENTRY();
MUTEX_LOCK (lock);
for (i = 0; i < CONNECTION_MAX_HOSTS_; i++)
{
@@ -3851,13 +3933,14 @@
{
GE_BREAK (ectx, 0);
MUTEX_UNLOCK (lock);
+ EXIT();
return SYSERR;
}
root = root->overflowChain;
}
}
MUTEX_UNLOCK (lock);
-
+ EXIT();
return OK;
}
Modified: GNUnet/src/server/connection.h
===================================================================
--- GNUnet/src/server/connection.h 2007-07-20 15:59:36 UTC (rev 5324)
+++ GNUnet/src/server/connection.h 2007-07-20 17:25:07 UTC (rev 5325)
@@ -217,18 +217,6 @@
/**
- * Offer the core a session for communication with the
- * given peer. This is useful after establishing a connection
- * with another peer to hand it of to the core. Note that
- * the core will take over the session and disconnect
- * it as it feels like. Thus the client should no longer
- * use it after this call. If the core does not want/need
- * the session, it will also be disconnected.
- */
-void offerTSessionFor (const PeerIdentity * peer, TSession * session);
-
-
-/**
* Assign a session key for traffic from or to a given peer.
* If the core does not yet have an entry for the given peer
* in the connection table, a new entry is created.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5325 - in GNUnet/src: applications/transport include server,
gnunet <=