Revision deb34f59

View differences:

ml.c
49 49
#include <errno.h>
50 50
#include <time.h>
51 51
#include <math.h>
52
#include "msg_types.h"
52 53
#include "util/udpSocket.h"
53 54
#include "util/stun.h"
54 55
#include "transmissionHandler.h"
......
1235 1236

  
1236 1237
}
1237 1238

  
1239
void keepalive_fn(evutil_socket_t fd, short what, void *arg) {
1240
	socketID_handle peer = arg;
1241

  
1242
	int con_id = mlConnectionExist(peer, false);
1243
	if (con_id < 0 || connectbuf[con_id]->defaultSendParams.keepalive <= 0) {
1244
		/* Connection fell from under us or keepalive was disabled */
1245
		free(arg);
1246
		return;
1247
	}
1248

  
1249
	/* do what we gotta do */
1250
	if ( connectbuf[con_id]->status == READY) {
1251
		char keepaliveMsg[32] = "";
1252
		sprintf(keepaliveMsg, "KEEPALIVE %d", connectbuf[con_id]->keepalive_seq++);
1253
		send_msg(con_id, MSG_TYPE_ML_KEEPALIVE, keepaliveMsg, 1 + strlen(keepaliveMsg), false, 
1254
			&(connectbuf[con_id]->defaultSendParams));
1255
	}
1256

  
1257
	/* re-schedule */
1258
	struct timeval t = { 0,0 };
1259
	t.tv_sec = time(NULL) + connectbuf[con_id]->defaultSendParams.keepalive;
1260

  
1261
	event_base_once(base, -1, EV_TIMEOUT, keepalive_fn, peer, &t);
1262
}
1263

  
1264
void setupKeepalive(int conn_id) {
1265
	/* Save the peer's address for us */
1266
	socketID_handle peer = malloc(sizeof(socket_ID));
1267
	memcpy(peer, &connectbuf[conn_id]->external_socketID, sizeof(socket_ID));
1268

  
1269
	struct timeval t = { 0,0 };
1270
	t.tv_sec = time(NULL) + connectbuf[conn_id]->defaultSendParams.keepalive;
1271

  
1272
	event_base_once(base, -1, EV_TIMEOUT, keepalive_fn, peer, &t);
1273
}
1274

  
1238 1275
/* connection functions */
1239 1276
int mlOpenConnection(socketID_handle external_socketID,receive_connection_cb connection_cb,void *arg, const send_params defaultSendParams){
1240 1277

  
......
1257 1294
	con_id = mlConnectionExist(external_socketID, false);
1258 1295
	if (con_id >= 0) {
1259 1296
		// overwrite defaultSendParams
1297
		bool newKeepalive = 
1298
			connectbuf[con_id]->defaultSendParams.keepalive == 0 && defaultSendParams.keepalive != 0;
1260 1299
		connectbuf[con_id]->defaultSendParams = defaultSendParams;
1300
		if (newKeepalive) setupKeepalive(con_id);
1261 1301
		// if so check if it is ready to use
1262 1302
		if (connectbuf[con_id]->status == READY) {
1263 1303
				// if so use the callback immidiatley
......
1302 1342
			connectbuf[con_id]->connection_last->connection_cb = connection_cb;
1303 1343
			connectbuf[con_id]->connection_last->arg = arg;
1304 1344
			connectbuf[con_id]->external_connectionID = -1;
1345

  
1305 1346
			connectbuf[con_id]->defaultSendParams = defaultSendParams;
1347
			if (defaultSendParams.keepalive) setupKeepalive(con_id);
1306 1348
			break;
1307 1349
		}
1308 1350
	} //end of for
transmissionHandler.h
169 169
  struct receive_connection_cb_list *connection_head;
170 170
  struct receive_connection_cb_list *connection_last;
171 171
  send_params defaultSendParams;
172
  uint32_t keepalive_seq; 
172 173
} connect_data;
173 174

  
174 175
#define ML_CON_MSG 127

Also available in: Unified diff