Monday, 20 August 2012
Build A Sample Custom Packet [Embedded Systems]
This code snippet was my submission for embedded systems assignment from the embedded system black book by Dr. K.V.K.K. Prasad. It is in no way a real packet and is not meant to represent the IP layer.
Question: Write a C program that takes the filename as input and generates packets of 100 bytes. Develop a simple packet format of your own.
Compilation:
Question: Write a C program that takes the filename as input and generates packets of 100 bytes. Develop a simple packet format of your own.
Compilation:
gcc -Wall -lm -o custom_packet custom_packet.c
//custom_packet.c
//
//eg: ./custom_packet /home/samar/Desktop/cs_rules.txt
//Compilation: gcc -Wall -lm -o custom_packet custom_packet.c
//Custom Packet: Header -> 20 bytes and Data -> 80 bytes
//Find me on http://www.techgaun.com
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
typedef struct
{
int8_t fragment_offset;
int8_t ttl;
int32_t source_ip;
int32_t dest_ip;
} custom_packet_header;
typedef struct
{
custom_packet_header header;
char data[80];
} custom_packet;
long int get_file_size(char fname[])
{
int fd;
int count;
if ((fd = open(fname, O_RDONLY)) == -1)
{
perror("Error reading the file\n");
exit(EXIT_FAILURE);
}
struct stat buf;
fstat(fd, &buf);
count = buf.st_size;
close(fd);
return count;
}
int decimalip2numeric(int a, int b, int c, int d)
{
return (a * 16777216 + b * 65536 + c * 256 + d);
}
/*char * numericip2decimal(int num)
{
char strs[4];
strs[0] = (char *) num / 1677;
}*/
int main(int argc, char **argv)
{
FILE *fp;
//char fname[256]; //255 bytes is the limit of filename in extN filesystems
custom_packet * packets;
long int fsize;
int num_of_packet, i;
if (argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(1);
}
fsize = get_file_size(argv[1]);
num_of_packet = ceil((double)fsize / 80.0);
printf("%ld => %d",fsize, num_of_packet);
if ((fp = fopen(argv[1], "rb")) == NULL)
{
perror("Error opening the file");
exit(1);
}
packets = (custom_packet *) malloc(sizeof(custom_packet) * num_of_packet);
for (i = 0; i < num_of_packet; i++)
{
packets[i].header.source_ip = decimalip2numeric(127, 0, 0, 1); //storing source ip as 127.0.0.1 for now
packets[i].header.dest_ip = decimalip2numeric(127, 0, 0, 1); //storing dest ip as 127.0.0.1 for now
packets[i].header.ttl = 127;
packets[i].header.fragment_offset = i;
}
i = 0;
while (!feof(fp))
{
fread((void *)packets[i].data, 80, 1, fp);
i++;
}
fclose(fp);
printf("\n\n----- Printing all the crafted packets -----\n\n");
for (i = 0; i < num_of_packet; i++)
{
printf("[---- Packet Fragment no. %d ----", packets[i].header.fragment_offset);
printf("\nSource IP -> %d\nDestination IP -> %d\nTime to live -> %d\n", packets[i].header.source_ip, packets[i].header.dest_ip, packets[i].header.ttl);
printf("Packet data -> %s", packets[i].data);
printf("\n---- End of Packet no. %d ----]\n\n", packets[i].header.fragment_offset);
}
return 0;
}
Labels:
C/C++,
internet protocol,
programming
Bookmark this post:blogger tutorials
Social Bookmarking Blogger Widget |
Build A Sample Custom Packet [Embedded Systems]
2012-08-20T11:06:00+05:45
Cool Samar
C/C++|internet protocol|programming|
Subscribe to:
Post Comments (Atom)