answer keys to b65l

24
Part – I 1 Write a program for error detecting code using CRC-CCITT (16 bit). /*This program is written to do Cyclic redundancy check */ #include <stdio.h> #include <string.h> #include <conio.h> typedef unsigned long DWORD; typedef unsigned int WORD; typedef unsigned char BYTE; #define CRC_LEN 17 #define CRC_CODE 0x11021 #define PACKET_LENGTH 2 #define GETBIT(Addr, n) ((Addr[n / 8] >> (7 - (n % 8))) & 1) WORD rem(BYTE * bytes, WORD nbits) { WORD i; DWORD div = 0; DWORD mask = 1L << (CRC_LEN - 1); for(i = 0; i < nbits; i++) { div = (div << 1) | GETBIT(bytes, i); if(div & mask) div ^= CRC_CODE; } return div; }

Upload: himanshuviswas

Post on 27-Nov-2014

1.023 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Answer Keys to B65L

Part – I

1 Write a program for error detecting code using CRC-CCITT (16 bit).

/*This program is written to do Cyclic redundancy check */

#include <stdio.h>#include <string.h>#include <conio.h>

typedef unsigned long DWORD;typedef unsigned int WORD;typedef unsigned char BYTE;

#define CRC_LEN 17#define CRC_CODE 0x11021#define PACKET_LENGTH 2#define GETBIT(Addr, n) ((Addr[n / 8] >> (7 - (n % 8))) & 1)

WORD rem(BYTE * bytes, WORD nbits){ WORD i; DWORD div = 0; DWORD mask = 1L << (CRC_LEN - 1); for(i = 0; i < nbits; i++) { div = (div << 1) | GETBIT(bytes, i); if(div & mask)

div ^= CRC_CODE; } return div;}

void printbits(BYTE * bytes, WORD nbits){ WORD i; int j;

for(i = 0; i < nbits; i++)

Page 2: Answer Keys to B65L

{ if(i % 4 == 0)

printf(" "); j = bytes[i / 8]; j = j >> (7 - (i % 8 )); j = j & 1 ; printf("%d",j); }}

/* This is main program */

main(){ BYTE b[100],a[PACKET_LENGTH]; WORD crc, len, r,i,flag=0; clrscr(); printf("Enter a string: "); gets((char *) b); len = strlen((char *) b); for(i=0;i<len;i=i+PACKET_LENGTH) { a[0]=b[i]; a[1]=b[i+1]; printf("\nThe internal bit pattern for `%s\' is\n", a); printbits(a, PACKET_LENGTH * 8); a[PACKET_LENGTH] = a[PACKET_LENGTH + 1] = 0; crc = rem(a, PACKET_LENGTH * 8 + 16); printf("\n\nCRC-CCITT code for the above is %x (hex)\n", crc); a[PACKET_LENGTH] = (crc >> 8); a[PACKET_LENGTH + 1] = (crc & 0xff); printf("\nChecking the CRC of:\n"); printbits(a, PACKET_LENGTH * 8 + 16); r = rem(a, PACKET_LENGTH * 8 + 16); printf("\nRemainder = %xH", r); if(r == 0) printf(" (no errors detected) "); else

Page 3: Answer Keys to B65L

printf(" (errors detected) "); a[PACKET_LENGTH] = (crc >> (8+flag)); flag=!flag; a[PACKET_LENGTH + 1] = (crc & 0xff); printf("\nChecking the CRC of:\n"); printbits(a, PACKET_LENGTH * 8 + 16); r = rem(a, PACKET_LENGTH * 8 + 16); printf("\nRemainder = %xH", r); if(r == 0) printf(" (no errors detected)\n\n "); else printf(" (errors detected)\n\n "); a[PACKET_LENGTH]=a[PACKET_LENGTH+1]='\0'; } getch(); return 0;}

Page 4: Answer Keys to B65L

2 Write a program for frame sorting technique used in buffers.

/* This program does frame sorting */#include<stdio.h>#include <time.h>#include<string.h>#include<conio.h>#include<dos.h>#include<stdlib.h>

#define MAX 3#define PACKET_LENGTH 2

struct packet { char a[PACKET_LENGTH+1]; int seq; int flag; };typedef struct packet P;

struct buffer { P pack[MAX]; int c; };typedef struct buffer B;

int b_empty(B *b){ return(b->c==0)?1:0;}

int b_full(B *b){ return(b->c==MAX)?1:0;}

int insert(P *p,B *b){ int i,temp; if(b_full(b))

Page 5: Answer Keys to B65L

{ printf("Buffer Overflow.Packet Discarded\n"); return 0; } for(i=0;i<MAX;i++) if(p->seq==b->pack[i].seq) { printf("Packet Duplication.Discarded\n"); return 0; } temp=p->seq; b->pack[temp-1].a[0]=p->a[0]; b->pack[temp-1].a[1]=p->a[1]; b->pack[temp-1].a[2]=p->a[2]; b->pack[temp-1].seq=p->seq; b->pack[temp-1].flag=p->flag; (b->c)++; return 1;}

void display(B *b){ int i; if(b_empty(b)) { printf("Buffer Underflow\n"); return; } printf("Packets in the buffer are\n"); for(i=0;i<b->c;i++) printf("%s\t%d\t%d\n",b->pack[i].a,b->pack[i].seq,b->pack[i].flag);}

void main(){ int i,j=0,k1,k2,num,flag1,flag2; char arr[MAX]; B b; b.c=0; P p[MAX]; clrscr();

Page 6: Answer Keys to B65L

printf("Enter the data\n"); gets(arr); num = strlen(arr); printf("Packets formed are\n\n");

//Packet preparation for(i=0;i<num;i=i+PACKET_LENGTH) { p[j].a[0]=arr[i]; p[j].a[1]=arr[i+1]; p[j].a[2]='\0'; p[j].seq=j+1; if(i==num-2 || i==num-1) p[j].flag=1; else p[j].flag=0; printf("%s %d %d\n",p[j].a,p[j].seq,p[j].flag); j++; } printf("\n"); flag2=0; for(;;) { for(;;) { randomize(); k1=random(num/2); if(k1==k2) continue; else break; } flag1=insert(&p[k1],&b); k2=k1; if(flag1) { printf("\nThe packet no. %d accepted\n\n",k1+1); flag2++; } if(flag2==num/2) break; }

display(&b); getch();}

Page 7: Answer Keys to B65L

3 Write a program for distance vector algorithm to find suitable path for transmission.

/* this program does distnace vector Routing */#include<stdio.h>#include<conio.h>

void copy(int a1[][10],int a2[][10],int n){ int u,v; for(u=0;u<n;u++) for(v=0;v<n;v++) a1[u][v]=a2[u][v];}void main(){ int org[10][10],a[10][10],temp[10][10],i,j,k,l; int nie[5],infi[5],count=0,cnt=0,id,least,row,col,update=0,x,y,it=0,n=0; clrscr(); printf("size\n"); scanf("%d",&n); printf("Input\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&org[i][j]); copy(a,org,n); do { it++;printf("%d iteration",it); update=0; for(i=0;i<n;i++) for(j=0;j<n;j++) temp[i][j]=0; for(i=0;i<n;i++) { count=0; cnt=0;

Page 8: Answer Keys to B65L

for(j=0;j<n;j++){ if(org[i][j]!=99 && org[i][j]!=0) nie[count++]=j; else if(org[i][j]==99) infi[cnt++]=j;}

for(k=0;k<cnt;k++){ col=infi[k]; least=99; for(l=0;l<count;l++) { row=nie[l]; if(a[row][col]<least) { least=a[row][col]; id=row; } }

if(a[i][col]>(least+a[i][id])){ update=1; temp[i][col]=(least+a[i][id]);}

}} for(x=0;x<n;x++) for(y=0;y<n;y++) { if(temp[x][y]==0) temp[x][y]=a[x][y]; } copy (a,temp,n); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d\t",a[i][j]); printf("\n"); } }while(update!=0);}

Page 9: Answer Keys to B65L

4 Write a program for simple RSA/DES algorithm to encrypt and decrypt the data.

#include<stdio.h>#include<conio.h>#include<string.h>#include<math.h>#include<process.h>

#define e 7#define d 23#define N 55

//7=1+2+2^2,23=1+2+2^2+2^4

char pwd1[8],pwd2[8],temp[8];int P[8],C[8],T[8];

int algorithm(int a,int b,int c){ int k1,k2,k4,k8,k16; int result,temp1,temp2; if(b==e) { k1=a%c; k2=(int) pow(a,2) % c; temp1=(k1*k2) %c; k4=(int) pow(k2,2) % c; result=(temp1*k4) % c; } else { k1=a%c; k2=(int) pow(a,2) % c; k4=(int) pow(k2,2) % c; k8=(int) pow(k4,2) % c; k16=(int) pow(k8,2) % c;

Page 10: Answer Keys to B65L

temp1=(k1*k2) %c; temp2=(k4*k16) % c; result=(temp1*temp2) % c; } return result;}void main(){ int len,i,check; clrscr(); printf("Enter the password\n"); scanf("%s",pwd1); len=strlen(pwd1); for(i=0;i<len;i++) { if(pwd1[i]<91) P[i]=pwd1[i]-64; else P[i]=pwd1[i]-96+26; }

for(i=0;i<len;i++) C[i]=algorithm(P[i],e,N);

printf("LOOP STARTED\n");

for(;;) { printf("\a"); printf("Enter the password again\n"); scanf("%s",pwd2);

for(i=0;i<len;i++) P[i]=algorithm(C[i],d,N);

Page 11: Answer Keys to B65L

for(i=0;i<len;i++) {

if(P[i]<27) temp[i]=P[i]+64;else temp[i]=P[i]+96-26;

} temp[i+1]='\0';

check=strcmp(temp,pwd2);

if(!check) { printf("LOOP TERMINATED\n"); exit(0); getch(); } continue; }}

Page 12: Answer Keys to B65L

5 Write a program for hamming code generation for error detection/correction.

/*Program works if the input is in characters*/#include<stdio.h>#include<conio.h>#include<string.h>

unsigned int parity[100][100];unsigned int error[200];unsigned int ip[100],op[100],co[200],co1[100];

void printbits(char * bytes,int nbits){ int i,j; for(i = 0; i < nbits; i++) { if(i % 4 == 0) printf(" "); j = bytes[i / 8]; j = j >> (7 - (i % 8 )); j = j & 1 ; printf("%d",j); ip[i]=j; } printf("\n");}

void main(){ int i,j,k,DATA_BITS=8,RED_BITS=4,len; char a[100],b[2]; clrscr(); printf("Enter a string: "); scanf("%s",&a); len = strlen((char *) a);

Page 13: Answer Keys to B65L

for(k=0;k<len;k++) { b[0]=a[k]; printf("\nThe internal bit pattern for %c is\n",a[k]); printbits(b,8);

//for parity matrixfor(i=0;i<DATA_BITS;i++) for(j=0;j<RED_BITS;j++) parity[i][j]=1;

for(i=0;i<DATA_BITS;i++){ for(j=0;j<RED_BITS;j++) {// parity[i][j]=1; if(i==j||i==j+RED_BITS) parity[i][j]=0; if(i>3) {

parity[i][(i-3)%4]=0;if(i==j+RED_BITS) parity[i][j]=0;

} }}

//for corresponding unit matrix unsigned int U1[100][100]; for(i=0;i<DATA_BITS;i++) { for(j=0;j<DATA_BITS;j++) { if(i==j) U1[i][j]=1; else U1[i][j]=0; } }

Page 14: Answer Keys to B65L

//for corresponding generator matrix unsigned int G[100][200]; for(i=0;i<DATA_BITS;i++) { for(j=0;j<DATA_BITS+RED_BITS;j++) { if(j<DATA_BITS) G[i][j]=U1[i][j]; else G[i][j]=parity[i][j-DATA_BITS]; } }

//for unit matrix FOR transpose of hamming matrix unsigned int U2[100][100]; for(i=0;i<RED_BITS;i++) { for(j=0;j<RED_BITS;j++) { if(i==j) U2[i][j]=1; else U2[i][j]=0; } }

//for transposed hamming matrix unsigned int G1[200][100]; for(i=0;i<DATA_BITS+RED_BITS;i++) { for(j=0;j<RED_BITS;j++) { if(i<DATA_BITS) G1[i][j]=parity[i][j]; else G1[i][j]=U2[i-DATA_BITS][j]; } }

Page 15: Answer Keys to B65L

//for output code vector printf("\nGenerated code is:\n\n"); for(i=0;i<RED_BITS+DATA_BITS;i++) { for(j=0;j<DATA_BITS;j++) { op[i]=op[i]^(ip[j]*G[j][i]); } printf("%u ",op[i]); }

//THE ERROR DETECTION PART printf(" \n\nEnter the corrupted data \n"); for(i=0;i<DATA_BITS+RED_BITS;i++) scanf("%u",&co[i]);

//for syndrome calulation printf("Syndrome is:\n"); for(i=0;i<RED_BITS;i++) { for(j=0;j<RED_BITS+DATA_BITS;j++) { co1[i]=co1[i]^(co[j]*G1[j][i]); } printf("%u ",co1[i]); } printf("\n");

//for error detection for(i=0;i<DATA_BITS+RED_BITS;i++) { for(j=0;j<RED_BITS;j++) { if(co1[j]!=G1[i][j]) break; }

Page 16: Answer Keys to B65L

if(j==RED_BITS) break; error[i]=0; } j=i+1; printf("\nERROR IS IN %d BIT:\n",j); error[i]=1;

//for error corection printf("\nCORRECTED DATA IS:\n\n"); for(i=0;i<DATA_BITS+RED_BITS;i++) printf("%u ",co[i]^error[i]); printf("\n"); } getch();}

Page 17: Answer Keys to B65L

6 Write a program for Congestion control using Leaky Bucket algorithm.

/* This program implement leaky bucket algorithm */#include<stdio.h>#include <time.h>#include<string.h>#include<conio.h>#include<dos.h>

#define MAX 5#define PACKET_LENGTH 2

struct packet { char a[PACKET_LENGTH+1]; int seq; int flag; };typedef struct packet P;

struct queue { P pack[MAX]; int f; int r; };typedef struct queue Q;

int q_empty(Q *q){ return(q->f>q->r)?1:0;}

int q_full(Q *q){ return(q->r==MAX-1)?1:0;}

Page 18: Answer Keys to B65L

int insert(P *p,Q *q){ if(q_full(q)) { printf("Buffer Overflow.Packet Discarded\n"); return 0; } q->pack[++(q->r)].a[0]=p->a[0]; q->pack[q->r].a[1]=p->a[1]; q->pack[q->r].a[2]=p->a[2]; q->pack[q->r].seq=p->seq; q->pack[q->r].flag=p->flag;

return 1;}

int delet(Q *q){ if(q_empty(q)) { printf("Buffer Underflow\n"); return 0; } printf("\nThe packet transmitted has data %s\n",q->pack[q->f++].a); if(q->f>q->r) { q->f=0; q->r=-1; } return 1;}

void display(Q *q){ int i; if(q_empty(q)) { printf("Buffer Underflow\n"); return; }

Page 19: Answer Keys to B65L

printf("Packets in the buffer are\n"); for(i=q->f;i<=q->r;i++) printf("%s\t%d\t%d\n",q->pack[i].a,q->pack[i].seq,q->pack[i].flag);}

void main(){ int i,j=0,INIT=1000,num,flag1,flag2; char arr[MAX]; clock_t start, end; Q q; q.f=0; q.r=-1; P p[MAX];

clrscr();

printf("Enter the data\n"); gets(arr); num = strlen(arr); printf("Packets formed are\n");

//Packet preparation for(i=0;i<num;i=i+PACKET_LENGTH) { p[j].a[0]=arr[i]; p[j].a[1]=arr[i+1]; p[j].a[2]='\0'; p[j].seq=j+1; if(i==num-2 || i==num-1) p[j].flag=1; else p[j].flag=0; printf("%s %d %d\n",p[j].a,p[j].seq,p[j].flag); j++; }

Page 20: Answer Keys to B65L

for(i=0;i<(num/2);i++) { start = clock(); delay(INIT); INIT=INIT+500; flag1=insert(&p[i],&q); end = clock(); if(flag1) printf("\nThe packet no. %d accepted at time was: %.2f\n",i+1,(int)(end - start) / CLK_TCK); }

display(&q);

for(i=0;i<(num/2);i++) { start = clock(); delay(INIT); flag2=delet(&q); end = clock(); if(flag2) printf("\nThe packet no. %d transmitted at time was: %.2f\n",i+1,(int)(end - start) / CLK_TCK); } getch();}