Added a socket_generator_send() function that allows data to be dynamically generated using an external function
diff --git a/contiki/uip/socket.c b/contiki/uip/socket.c
index cd6b257..6f217ab 100644
--- a/contiki/uip/socket.c
+++ b/contiki/uip/socket.c
@@ -55,7 +55,7 @@
   s->state = SOCKET_STATE_NONE;
   
   while(s->sendlen > 0) {
-    PT_WAIT_UNTIL(&s->socketpt,  data_sent(s) & send_data(s));
+    PT_WAIT_UNTIL(&s->socketpt, data_sent(s) & send_data(s));
   }
 
   s->state = SOCKET_STATE_NONE;
@@ -63,6 +63,31 @@
   PT_END(&s->socketpt);
 }
 /*---------------------------------------------------------------------------*/
+PT_THREAD(socket_generator_send(register struct socket *s,
+			       unsigned short (*generate)(void *), void *arg))
+{
+  PT_BEGIN(&s->socketpt);
+
+  if(generate == NULL) {
+    PT_EXIT(&s->socketpt);
+  }
+  
+  s->state = SOCKET_STATE_NONE;
+  s->sendlen = generate(arg);
+  s->sendptr = uip_appdata;
+  do {
+
+    if(uip_rexmit()) {
+      generate(arg);
+    }
+    PT_WAIT_UNTIL(&s->socketpt, data_sent(s) & send_data(s));
+  } while(s->sendlen > 0);    
+  
+  s->state = SOCKET_STATE_NONE;
+  
+  PT_END(&s->socketpt);
+}
+/*---------------------------------------------------------------------------*/
 char
 socket_newdata(struct socket *s)
 {
@@ -105,9 +130,7 @@
   if(uipbuf_len(&socket->buf) == 0) {
     socket->state = SOCKET_STATE_NONE;
     PT_RESTART(&socket->socketpt);
-  }
-
-  
+  }  
   PT_END(&socket->socketpt);
 }
 /*---------------------------------------------------------------------------*/
diff --git a/contiki/uip/socket.h b/contiki/uip/socket.h
index 42abde8..cfd5491 100644
--- a/contiki/uip/socket.h
+++ b/contiki/uip/socket.h
@@ -240,11 +240,15 @@
  * \hideinitializer
  */
 #define SOCKET_SEND(socket, data, datalen)		\
-    PT_WAIT_THREAD(&((socket)->pt), socket_send(socket, data, datalen));	
+    PT_WAIT_THREAD(&((socket)->pt), socket_send(socket, data, datalen))
 
-/*
-#define SOCKET_SEND_DYNAMIC(socket, dataptr, function_call)
-*/
+PT_THREAD(socket_generator_send(struct socket *socket,
+				unsigned short (*f)(void *), void *arg));
+
+#define SOCKET_GENERATOR_SEND(socket, generator, arg)     \
+    PT_WAIT_THREAD(&((socket)->pt),					\
+		   socket_generator_send(socket, generator, arg))
+
 
 /*PT_THREAD(socket_closew(struct socket *socket));
 #define SOCKET_CLOSEW(socket)				\