diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2012-10-20 16:22:14 +0000 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2012-10-20 16:22:14 +0000 |
commit | dd630f57c65931c3b6c5da8151193d73b2b768bd (patch) | |
tree | 4f615393db89f66d80d5270c0f791e9efb54987f /tests.c | |
parent | d8f1aefee927b2f012b1826f93d2c4fec63ac1f5 (diff) | |
download | 2012-tzsp-dd630f57c65931c3b6c5da8151193d73b2b768bd.tar.gz 2012-tzsp-dd630f57c65931c3b6c5da8151193d73b2b768bd.tar.bz2 2012-tzsp-dd630f57c65931c3b6c5da8151193d73b2b768bd.zip |
Première version du client TZSP
git-svn-id: file:///var/svn/2012-tzsp/trunk@2 147d2d3d-d0bd-48ea-923a-d90ac20f5906
Diffstat (limited to 'tests.c')
-rw-r--r-- | tests.c | 85 |
1 files changed, 85 insertions, 0 deletions
@@ -0,0 +1,85 @@ + + +void diep(char s[], int r) { + perror(s); + exit(r); +} + +void die(char s[], int r) { + fprintf(stderr, "%s() failed\n", s); + exit(r); +} + +#define DEST_IP "127.0.0.1" +#define DEST_PORT 37008 +int send_tzsp_sample_packet() { + const int sockaddr_len=sizeof(struct sockaddr_in); + const char sample_packet[]={ + /*Ether*/ 0xe0,0x91,0xf5,0xa1,0xa3,0xd8,0x00,0x11,0x2f,0xde,0x0d,0xa1,0x08,0x00, + /* IP4 */ 0x45,0x00,0x00,0x3c,0x00,0x00,0x40,0x00,0x40,0x11,0xb4,0x8d,0xc0,0xa8,0x02,0xd2,0xc0,0xa8,0x02,0x01, + /* UDP */ 0xc4,0x89,0x00,0x35,0x00,0x28,0x86,0x5d, + /* DNS */ 0x04,0x59,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x77,0x77,0x77, + 0x06,0x64,0x6f,0x6f,0x64,0x6c,0x65,0x03,0x63,0x6f,0x6d,0x00,0x00,0x01,0x00,0x01 + }; + const int sample_packet_len=sizeof(sample_packet); + struct timeval sample_packet_time; + uint32_t ts; + + int res,len; + int s; /*socket*/ + struct sockaddr_in /*si_me,*/ si_other; + char buf[UDP_SEND_BUFLEN]; + + /* On récupère le timestamp courant pour mettre dans les headers TZSP du paquet capturé d'exemple */ + printf("DEBUG : sizeof(time_t)==%i\n", sizeof(time_t)); + res=gettimeofday(&sample_packet_time,NULL); + if (res==-1) die("gettimeofday",5); + + + /* On prépare le socket UDP */ + s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (s==-1) diep("socket",10); + + memset((char *) &si_other, 0, sockaddr_len); + si_other.sin_family = AF_INET; + si_other.sin_port = htons(DEST_PORT); + res=inet_aton(DEST_IP, &si_other.sin_addr); + if (res==0) die("inet_aton",11); + + /* On forge la trame TZSP */ + + //memset((char *) &buf, 0, UDP_SEND_BUFLEN); + buf[0]=0x01; /* version */ + buf[1]=0x01; /* type == Packet for transmit */ + buf[2]=0x00; /* Encapsuled protocol 0x0001 == Ethernet */ + buf[3]=0x01; + + buf[4]=0x0D; /* Tag type TAG_TIMESTAMP */ + buf[5]=0x04; /* Tag length : 4 bytes */ + + /* buf[6,7,8,9] Timestamp on 4 bytes (network order) */ + ts=htonl((uint32_t) sample_packet_time.tv_sec); /* FIXME : ce cast est une bonne idée ??? */ + memcpy(buf+6, &ts, sizeof(ts)); + + buf[10]=0x29; /* Tag type TAG_RX_FRAME_LENGTH */ + buf[11]=0x02; /* Tag length : 2 bytes */ + len=htons((uint16_t) sample_packet_len); + memcpy(buf+12,&len, sizeof(len)); + + buf[14]=0x00; /* Tag type TAG PADDING (for alignement) */ + buf[15]=0x01; /* Tag type TAG END */ + + /* Raw packet copy */ + //TODO : assert that sample_packet_len < MAX_TZSP_PAYLOAD + memcpy(buf+16,sample_packet, sample_packet_len); + + /* Envoi du paquet UDP (avec comme charge utile le TZSP) */ + res=sendto(s, buf, 16+sample_packet_len, 0, (struct sockaddr *)&si_other, sockaddr_len); + if (res==-1) diep("sendto",12); + + close(s); + + return 0; +} + + |