[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18303 - libmwmodem/src/main
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18303 - libmwmodem/src/main |
Date: |
Thu, 24 Nov 2011 16:13:26 +0100 |
Author: grothoff
Date: 2011-11-24 16:13:26 +0100 (Thu, 24 Nov 2011)
New Revision: 18303
Modified:
libmwmodem/src/main/libmwmodem.c
Log:
feedback
Modified: libmwmodem/src/main/libmwmodem.c
===================================================================
--- libmwmodem/src/main/libmwmodem.c 2011-11-24 14:44:07 UTC (rev 18302)
+++ libmwmodem/src/main/libmwmodem.c 2011-11-24 15:13:26 UTC (rev 18303)
@@ -25,37 +25,42 @@
#include <netinet/in.h>
#include <string.h>
-uint32_t val;
+uint32_t val; // Global, exported symbol!?
struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int,
MWMODEM_InformationCallback *cb, void *cb_cls)
{
- static struct MWMODEM_Context *context;
- struct sockaddr_in *adress4;
+ static struct MWMODEM_Context *context; // NOT STATIC! Not a GLOBAL!!!
+ struct sockaddr_in *adress4; // address!
struct sockaddr_in6 *adress6;
- adress4 = malloc(sizeof(struct sockaddr_in));
- adress6 = malloc(sizeof(struct sockaddr_in6));
- context = malloc(sizeof(struct MWMODEM_Context));
- (*context).cb = cb;
-
- if (af_int==AF_INET||af_int==AF_INET6)(*context).socket =
socket(af_int, SOCK_DGRAM, IPPROTO_UDP);
- else
+ if ( (af_int!=AF_INET) && (af_int!=AF_INET6) )
{
- printf("Error no correct AF_INET or AF_INET6 value!");
+ fprintf(stderr,
+ "Error no correct AF_INET or AF_INET6 value!");
return;
}
- if ((*context).socket==-1)
+ adress4 = malloc(sizeof(struct sockaddr_in)); // stack-allocated!
+ adress6 = malloc(sizeof(struct sockaddr_in6)); // stack-allocated!
+
+ context = malloc(sizeof(struct MWMODEM_Context)); // CHECK RETURN VALUE!
+ context->cb = cb;
+
+ (*context).socket = socket(af_int, SOCK_DGRAM, IPPROTO_UDP);
+
+ if (-1 == context->socket)
{
- printf("Error no socket created!");
+ fprintf(stderr, "Error no socket created: %s", strerror(errno));
+ // LEAK!
return;
}
-
+
if (af_int==AF_INET)
{
memset (&adress4, 0, sizeof(adress4));
(*adress4).sin_family = af_int;
+ // ->sin_len field on FreeBSD not set!
if (port == 0)
{
(*adress4).sin_port = htons(MWMODEM_PORT);
@@ -64,7 +69,7 @@
{
(*adress4).sin_port = htons(port);
}
- bind((*context).socket, adress4, sizeof(adress4));
+ bind((*context).socket, adress4, sizeof(adress4)); // check
return value!
}
else
{
@@ -79,7 +84,7 @@
{
(*adress6).sin6_port = htons(port);
}
- bind((*context).socket, adress6, sizeof(adress6));
+ bind((*context).socket, adress6, sizeof(adress6)); // check
return value!
}
free(adress4);
@@ -93,7 +98,8 @@
return (*fc).socket;
}
-uint32_t charArrayToASCIICode (char byte4[4])
+// Document! Exported symbol? -> static
+uint32_t charArrayToASCIICode (const char *byte4)
{
val = (uint32_t)byte4[0]
|val + (uint32_t)byte4[1] << 8
@@ -102,12 +108,12 @@
return val;
}
-uint32_t charArrazToInt (char byte4[4])
+uint32_t charArrazToInt (char byte4[4]) // Arraz?
{
int i;
for (i=0; i<=3; i++)
{
- if (byte4[i]>=0x30 || byte4[i]<=0x39)
+ if (byte4[i]>='0' || byte4[i]<='9')
{
val=val+(((int)byte4[i])*10^i);
}
@@ -115,6 +121,25 @@
return val;
}
+//Kanalinformationen
+struct MWChannel {
+ uint8_t index;
+ uint8_t modcod;
+ uint8_t queue;
+ uint32_t datasent;
+ uint32_t symbolratelimit;
+};
+
+//UDP Paketinhalt
+struct MWHeader
+{
+ uint32_t header;
+ uint32_t time;
+ uint32_t symbolrate;
+ uint8_t channelmax;
+}
+
+
void MWMODEM_run (struct MWMODEM_Context *fc)
{
struct MWMODEM_Package *package;
@@ -124,42 +149,32 @@
struct sockaddr *from;
socklen_t *from_length;
struct MWMODEM_Channel channel;
+ const struct MWHeader *hdr;
+
+ // use ioctl with FIONREAD to determine size of inbound UDP packet =>
only allocated what is needed
+ // (and then stack-allocate that)
+
package = malloc(sizeof(struct MWMODEM_Package));
buffer = malloc(MWMODEM_MAXMESSLENGTH);
if (recvfrom((*fc).socket, *buffer, sizeof(buffer), 0, from,
from_length)==-1)
{
printf("Error no message received!");
+ // LEAK!
return;
}
- else
- {
-
- byte4[0]= buffer[0];
- byte4[1]= buffer[1];
- byte4[2]= buffer[2];
- byte4[3]= buffer[3];
-
if (1==1)//TODO deklination der Erkennungsmerkmale der Message
{
- (*package).header = ntohl(charArrayToASCIICode(byte4));
+ hdr = (const struct MWHeader*) buffer;
- byte4[0]= buffer[4];
- byte4[1]= buffer[5];
- byte4[2]= buffer[6];
- byte4[3]= buffer[7];
- (*package).time.tv_nsec = MWMODWM_TACT_NANO_SEC;
- (*package).time.tv_sec = ntohl(charArrayToInt(byte4));
+ package->header = ntohl(hdr->header);
+ unsigned long long nstime = ntohl(hdr->time) * MWMODWM_TACT_NANO_SEC;
+ package->time.tv_nsec = nstime % (1000 * 1000 * 1000);
+ package->time.tv_sec = nstime / (1000 * 1000 * 1000);
+ package->symbolrate = ntohl(hdr->symbolrate);
+ package->num_channels = (uint8_t) hdr->channelmax;
- byte4[0]= buffer[8];
- byte4[1]= buffer[9];
- byte4[2]= buffer[10];
- byte4[3]= buffer[11];
- (*package).symbolrate = ntohl(charArrayToInt(byte4));
-
- (*package).num_channels = (uint8_t) buffer[12];
-
struct MWMODEM_Channel list2[(*package).num_channels];
list = list2;
@@ -175,7 +190,7 @@
if(buffer[currentBufferZelle]>MWMODEM_MOD_DUMMY
&&buffer[currentBufferZelle]<MWMODEM_MOD_RESERVED)
{
- switch(buffer[currentBufferZelle])
+ switch(buffer[currentBufferZelle]) // Zelle!?
English!
{
case MWMODEM_MOD_QPSK_1_4 :
channel.modcode = MWMODEM_MOD_QPSK_1_4;
case MWMODEM_MOD_QPSK_1_3 :
channel.modcode = MWMODEM_MOD_QPSK_1_3;
@@ -204,7 +219,8 @@
case MWMODEM_MOD_32APSK_4_5 :
channel.modcode = MWMODEM_MOD_32APSK_4_5;
case MWMODEM_MOD_32APSK_5_6 :
channel.modcode = MWMODEM_MOD_32APSK_5_6;
case MWMODEM_MOD_32APSK_8_9 :
channel.modcode = MWMODEM_MOD_32APSK_8_9;
- case MWMODEM_MOD_32APSK_9_10 :
channel.modcode = MWMODEM_MOD_32APSK_9_10;
+ case MWMODEM_MOD_32APSK_9_10 :
channel.modcode = MWMODEM_MOD_32APSK_9_10; // BREAK!?
+ // DEFAULT!?
}
}
else
@@ -246,7 +262,7 @@
printf("No MWModem compatible message received!");
return;
}
- }
+
(*package).channel = list;
(*(*fc).cb)((*fc).cls, package);
@@ -255,7 +271,5 @@
void MWMODEM_free (struct MWMODEM_Context *fc)
{
close((*fc).socket);
- free((*fc).cb);
- free((*fc).cls);
free(fc);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18303 - libmwmodem/src/main,
gnunet <=