


#include <stdio.h>
#include <stdlib.h>


  int numberToCall[10];

  struct packets {
    int value;
  } packet[2000];


//numerical form - 128.59...
void addIPNumerical(struct packets *packet, int *ipoffset) {
  packet[(*ipoffset)++].value=0x31;
  packet[(*ipoffset)++].value=0x32;
  packet[(*ipoffset)++].value=0x38;
  packet[(*ipoffset)++].value=0x2e;
  packet[(*ipoffset)++].value=0x35;
  packet[(*ipoffset)++].value=0x39;
  packet[(*ipoffset)++].value=0x2e;
  packet[(*ipoffset)++].value=0x31;
  packet[(*ipoffset)++].value=0x34;
  packet[(*ipoffset)++].value=0x39;
  packet[(*ipoffset)++].value=0x2e;
  packet[(*ipoffset)++].value=0x31;
  packet[(*ipoffset)++].value=0x30;
  packet[(*ipoffset)++].value=0x36;

}


//form of 80, 3b, 85, a2
void addIPHex(struct packets *packet, int *ipoffset) {
  packet[(*ipoffset)++].value=0x80; //source ip
  packet[(*ipoffset)++].value=0x3b;
  packet[(*ipoffset)++].value=0x95;
  packet[(*ipoffset)++].value=0x6a;
}

void addUDPIPHeader(struct packets *packet, int *headeroffset, int packetlengthbyte1, int packetlengthbyte2, int checksum1, int checksum2) {
  unsigned int packetlength = (packetlengthbyte1<<8) + packetlengthbyte2 - 20;
  

  packet[(*headeroffset)++].value=0x00;
  packet[(*headeroffset)++].value=0xd0;
  packet[(*headeroffset)++].value=0x06;
  packet[(*headeroffset)++].value=0x26; //26 vs 24
  packet[(*headeroffset)++].value=0x9c; //9c vs c8
  packet[(*headeroffset)++].value=0x0a;
  packet[(*headeroffset)++].value=0x00;
  packet[(*headeroffset)++].value=0x08;
  packet[(*headeroffset)++].value=0x02;

  packet[(*headeroffset)++].value=0x62;
  packet[(*headeroffset)++].value=0x30;
  packet[(*headeroffset)++].value=0x5d;
  packet[(*headeroffset)++].value=0x08;
  packet[(*headeroffset)++].value=0x00;
  packet[(*headeroffset)++].value=0x45;
  packet[(*headeroffset)++].value=0x00; //expedited = b8.. on for rtp, not for sip

  

  packet[(*headeroffset)++].value=packetlengthbyte1; //total packet length
  packet[(*headeroffset)++].value=packetlengthbyte2;
  packet[(*headeroffset)++].value=0x04;
  packet[(*headeroffset)++].value=0x41;
  packet[(*headeroffset)++].value=0x00; 
  packet[(*headeroffset)++].value=0x00;
  packet[(*headeroffset)++].value=0x80;
  packet[(*headeroffset)++].value=0x11;
  packet[(*headeroffset)++].value=checksum1; //checksum
  packet[(*headeroffset)++].value=checksum2;

  addIPHex(packet, headeroffset);

  packet[(*headeroffset)++].value=0x80;
  packet[(*headeroffset)++].value=0x3b;
  packet[(*headeroffset)++].value=0x27;
  packet[(*headeroffset)++].value=0x7f;
  packet[(*headeroffset)++].value=0x13;
  packet[(*headeroffset)++].value=0xc4;
  packet[(*headeroffset)++].value=0x13;
  packet[(*headeroffset)++].value=0xc4;
  packet[(*headeroffset)++].value=(packetlength >> 8); //udp length
  packet[(*headeroffset)++].value=(packetlength);
  packet[(*headeroffset)++].value=0x00; //50, 24 //disable udp checksum
  packet[(*headeroffset)++].value=0x00;
}


void addSIPCallID(struct packets *packet, int *callidoffset) {
  packet[(*callidoffset)++].value=0x43;
  packet[(*callidoffset)++].value=0x61;
  packet[(*callidoffset)++].value=0x6c;
  packet[(*callidoffset)++].value=0x6c;
  packet[(*callidoffset)++].value=0x2d;
  packet[(*callidoffset)++].value=0x49;
  packet[(*callidoffset)++].value=0x44;
  packet[(*callidoffset)++].value=0x3a;
  packet[(*callidoffset)++].value=0x20;
  
  //random thingy
  packet[(*callidoffset)++].value=0x45;
  packet[(*callidoffset)++].value=0x45;
  packet[(*callidoffset)++].value=0x45;
  packet[(*callidoffset)++].value=0x33;
  packet[(*callidoffset)++].value=0x35;
  packet[(*callidoffset)++].value=0x35;
  packet[(*callidoffset)++].value=0x42;
  packet[(*callidoffset)++].value=0x31;
  packet[(*callidoffset)++].value=0x2d;
  packet[(*callidoffset)++].value=0x34;
  packet[(*callidoffset)++].value=0x32;
  packet[(*callidoffset)++].value=0x30;
  packet[(*callidoffset)++].value=0x33; //0
  packet[(*callidoffset)++].value=0x2d;
  packet[(*callidoffset)++].value=0x34;
  packet[(*callidoffset)++].value=0x45;
  packet[(*callidoffset)++].value=0x36;
  packet[(*callidoffset)++].value=0x33;
  packet[(*callidoffset)++].value=0x2d;
  packet[(*callidoffset)++].value=0x38;
  packet[(*callidoffset)++].value=0x41;
  packet[(*callidoffset)++].value=0x39;
  packet[(*callidoffset)++].value=0x35;
  packet[(*callidoffset)++].value=0x2d;
  packet[(*callidoffset)++].value=0x43;
  packet[(*callidoffset)++].value=0x43;
  packet[(*callidoffset)++].value=0x34;
  packet[(*callidoffset)++].value=0x31;
  packet[(*callidoffset)++].value=0x42;
  packet[(*callidoffset)++].value=0x37;
  packet[(*callidoffset)++].value=0x33;
  packet[(*callidoffset)++].value=0x31;
  packet[(*callidoffset)++].value=0x39;
  packet[(*callidoffset)++].value=0x30;
  packet[(*callidoffset)++].value=0x41;
  packet[(*callidoffset)++].value=0x43;

  packet[(*callidoffset)++].value=0x40;
  //ip
  addIPNumerical(packet, callidoffset);


  packet[(*callidoffset)++].value=0x0d;
  packet[(*callidoffset)++].value=0x0a;
}

void addSIPToLocal(struct packets *packet, int *tooffset) {
  packet[(*tooffset)++].value=0x54;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x20;
  packet[(*tooffset)++].value=0x3c;
  packet[(*tooffset)++].value=0x73;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x70;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x37;  //start phone #
  packet[(*tooffset)++].value=0x31;
  packet[(*tooffset)++].value=0x38;
  packet[(*tooffset)++].value=0x35;
  packet[(*tooffset)++].value=0x30;
  packet[(*tooffset)++].value=0x34;
  packet[(*tooffset)++].value=0x32;
  packet[(*tooffset)++].value=0x31;
  packet[(*tooffset)++].value=0x35;
  packet[(*tooffset)++].value=0x34;
  packet[(*tooffset)++].value=0x40;
  packet[(*tooffset)++].value=0x73;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x70;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x62;
  packet[(*tooffset)++].value=0x72;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x61;
  packet[(*tooffset)++].value=0x64;
  packet[(*tooffset)++].value=0x76;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x65;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x6d;
  packet[(*tooffset)++].value=0x3e;
  packet[(*tooffset)++].value=0x0d;
  packet[(*tooffset)++].value=0x0a; 
}



void addSIPVia(struct packets *packet, int *offset) {
  //VIA
  packet[(*offset)++].value=0x56;
  packet[(*offset)++].value=0x69;
  packet[(*offset)++].value=0x61;
  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x20;
  packet[(*offset)++].value=0x53;
  packet[(*offset)++].value=0x49;
  packet[(*offset)++].value=0x50;
  packet[(*offset)++].value=0x2f;
  packet[(*offset)++].value=0x32;
  packet[(*offset)++].value=0x2e;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x2f;
  packet[(*offset)++].value=0x55;
  packet[(*offset)++].value=0x44;
  packet[(*offset)++].value=0x50;
  packet[(*offset)++].value=0x20;

  addIPNumerical(packet, offset);

  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x36;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x3b;
  
  packet[(*offset)++].value=0x72;
  packet[(*offset)++].value=0x70;
  packet[(*offset)++].value=0x6f;
  packet[(*offset)++].value=0x72;
  packet[(*offset)++].value=0x74;
  
  packet[(*offset)++].value=0x3b;

  packet[(*offset)++].value=0x62;
  packet[(*offset)++].value=0x72;
  packet[(*offset)++].value=0x61;
  packet[(*offset)++].value=0x6e;
  packet[(*offset)++].value=0x63;
  packet[(*offset)++].value=0x68;
  packet[(*offset)++].value=0x3d;

  packet[(*offset)++].value=0x7a; //branch
  packet[(*offset)++].value=0x39;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x68;
  packet[(*offset)++].value=0x47;
  packet[(*offset)++].value=0x34;
  packet[(*offset)++].value=0x62;
  packet[(*offset)++].value=0x4b;
  packet[(*offset)++].value=0x38;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x33;
  packet[(*offset)++].value=0x62;
  packet[(*offset)++].value=0x39; 
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x61;
  packet[(*offset)++].value=0x32;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x33; 
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x63;
  packet[(*offset)++].value=0x39;
  packet[(*offset)++].value=0x62;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x34; 
  packet[(*offset)++].value=0x32;
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x64;
  packet[(*offset)++].value=0x63;
  packet[(*offset)++].value=0x66;
  packet[(*offset)++].value=0x38; 
  packet[(*offset)++].value=0x38;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x34;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x35; 
  packet[(*offset)++].value=0x61;
  packet[(*offset)++].value=0x38;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x31;

  packet[(*offset)++].value=0x0d;
  packet[(*offset)++].value=0x0a;
}


void addSIPContact(struct packets *packet, int *offset) {
  packet[(*offset)++].value=0x43;
  packet[(*offset)++].value=0x6f;
  packet[(*offset)++].value=0x6e;
  packet[(*offset)++].value=0x74;
  packet[(*offset)++].value=0x61;
  packet[(*offset)++].value=0x63;
  packet[(*offset)++].value=0x74;
  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x20;
  packet[(*offset)++].value=0x3c;
  packet[(*offset)++].value=0x73;
  packet[(*offset)++].value=0x69;
  packet[(*offset)++].value=0x70;
  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x33;
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x33;
  packet[(*offset)++].value=0x36;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x40;

  addIPNumerical(packet, offset);

  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x36;
  packet[(*offset)++].value=0x30; /*
    
  packet[(*offset)++].value=0x3e;
  packet[(*offset)++].value=0x2e;
  packet[(*offset)++].value=0x31;
  packet[(*offset)++].value=0x36;
  packet[(*offset)++].value=0x32;
  packet[(*offset)++].value=0x3a;
  packet[(*offset)++].value=0x35;
  packet[(*offset)++].value=0x30;
  packet[(*offset)++].value=0x36;
  packet[(*offset)++].value=0x30;*/
  packet[(*offset)++].value=0x3e;
  packet[(*offset)++].value=0x0d;
  packet[(*offset)++].value=0x0a;

}

void addSIPToRemote(struct packets *packet, int *tooffset) {
  packet[(*tooffset)++].value=0x54;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x20;
  packet[(*tooffset)++].value=0x3c;
  packet[(*tooffset)++].value=0x73;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x70;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x30 + numberToCall[0];  //start phone #
  packet[(*tooffset)++].value=0x30 + numberToCall[1];
  packet[(*tooffset)++].value=0x30 + numberToCall[2];
  packet[(*tooffset)++].value=0x30 + numberToCall[3];
  packet[(*tooffset)++].value=0x30 + numberToCall[4];
/*  packet[(*tooffset)++].value=0x30 + numberToCall[5];
  packet[(*tooffset)++].value=0x30 + numberToCall[6];
  packet[(*tooffset)++].value=0x30 + numberToCall[7];
  packet[(*tooffset)++].value=0x30 + numberToCall[8];
  packet[(*tooffset)++].value=0x30 + numberToCall[9]; //end phone # */
  packet[(*tooffset)++].value=0x40;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x6c;
  packet[(*tooffset)++].value=0x75;
  packet[(*tooffset)++].value=0x6d;
  packet[(*tooffset)++].value=0x62;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x61;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x65;
  packet[(*tooffset)++].value=0x64;
  packet[(*tooffset)++].value=0x75;
  packet[(*tooffset)++].value=0x3e;
  /*
  packet[(*tooffset)++].value=0x65;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x6d;
  packet[(*tooffset)++].value=0x3e; */
  packet[(*tooffset)++].value=0x0d;
  packet[(*tooffset)++].value=0x0a;  
}




void addSIPToRemoteWithTag(struct packets *packet, int *tooffset) {
  packet[(*tooffset)++].value=0x54;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x20;
  packet[(*tooffset)++].value=0x3c;
  packet[(*tooffset)++].value=0x73;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x70;
  packet[(*tooffset)++].value=0x3a;
  packet[(*tooffset)++].value=0x30 + numberToCall[0];  //start phone #
  packet[(*tooffset)++].value=0x30 + numberToCall[1];
  packet[(*tooffset)++].value=0x30 + numberToCall[2];
  packet[(*tooffset)++].value=0x30 + numberToCall[3];
  packet[(*tooffset)++].value=0x30 + numberToCall[4];
  packet[(*tooffset)++].value=0x40;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x6c;
  packet[(*tooffset)++].value=0x75;
  packet[(*tooffset)++].value=0x6d;
  packet[(*tooffset)++].value=0x62;
  packet[(*tooffset)++].value=0x69;
  packet[(*tooffset)++].value=0x61;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x65;
  packet[(*tooffset)++].value=0x64;
  packet[(*tooffset)++].value=0x75;
  packet[(*tooffset)++].value=0x3e;

  packet[(*tooffset)++].value=0x3b;
  packet[(*tooffset)++].value=0x74;
  packet[(*tooffset)++].value=0x61;
  packet[(*tooffset)++].value=0x67;
  packet[(*tooffset)++].value=0x3d;
  
  //space to fill in tag
  /*
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  packet[(*tooffset)++].value=0x00;
  */


  /*
  packet[(*tooffset)++].value=0x65;
  packet[(*tooffset)++].value=0x2e;
  packet[(*tooffset)++].value=0x63;
  packet[(*tooffset)++].value=0x6f;
  packet[(*tooffset)++].value=0x6d;
  packet[(*tooffset)++].value=0x3e; */
  packet[(*tooffset)++].value=0x0d;
  packet[(*tooffset)++].value=0x0a;  
}






void addSIPFrom(struct packets *packet, int *fromoffset) {
  packet[(*fromoffset)++].value=0x46;
  packet[(*fromoffset)++].value=0x72;
  packet[(*fromoffset)++].value=0x6f;
  packet[(*fromoffset)++].value=0x6d;
  packet[(*fromoffset)++].value=0x3a;
  packet[(*fromoffset)++].value=0x20;
  packet[(*fromoffset)++].value=0x52;
  packet[(*fromoffset)++].value=0x61;
  packet[(*fromoffset)++].value=0x6a;
  packet[(*fromoffset)++].value=0x20;
  packet[(*fromoffset)++].value=0x42;
  packet[(*fromoffset)++].value=0x61;
  packet[(*fromoffset)++].value=0x6b;
  packet[(*fromoffset)++].value=0x68;
  packet[(*fromoffset)++].value=0x72;
  packet[(*fromoffset)++].value=0x75;
  packet[(*fromoffset)++].value=0x20;
  packet[(*fromoffset)++].value=0x3c;
  packet[(*fromoffset)++].value=0x73;
  packet[(*fromoffset)++].value=0x69;
  packet[(*fromoffset)++].value=0x70;
  packet[(*fromoffset)++].value=0x3a;
  packet[(*fromoffset)++].value=0x33;
  packet[(*fromoffset)++].value=0x35;
  packet[(*fromoffset)++].value=0x33;
  packet[(*fromoffset)++].value=0x36;
  packet[(*fromoffset)++].value=0x30;
  packet[(*fromoffset)++].value=0x40;
  packet[(*fromoffset)++].value=0x63;
  packet[(*fromoffset)++].value=0x6f;
  packet[(*fromoffset)++].value=0x6c;
  packet[(*fromoffset)++].value=0x75;
  packet[(*fromoffset)++].value=0x6d;
  packet[(*fromoffset)++].value=0x62;
  packet[(*fromoffset)++].value=0x69;
  packet[(*fromoffset)++].value=0x61;
  packet[(*fromoffset)++].value=0x2e;
  packet[(*fromoffset)++].value=0x65;
  packet[(*fromoffset)++].value=0x64;
  packet[(*fromoffset)++].value=0x75;/*
  packet[(*fromoffset)++].value=0x3a;
  packet[(*fromoffset)++].value=0x35;
  packet[(*fromoffset)++].value=0x30;
  packet[(*fromoffset)++].value=0x36;
  packet[(*fromoffset)++].value=0x30;*/
  packet[(*fromoffset)++].value=0x3e;
  packet[(*fromoffset)++].value=0x3b;
  
  packet[(*fromoffset)++].value=0x74;
  packet[(*fromoffset)++].value=0x61;
  packet[(*fromoffset)++].value=0x67;
  packet[(*fromoffset)++].value=0x3d;
  //tag
  packet[(*fromoffset)++].value=0x38;
  packet[(*fromoffset)++].value=0x37;
  packet[(*fromoffset)++].value=0x35;
  packet[(*fromoffset)++].value=0x35;
  packet[(*fromoffset)++].value=0x32;
  packet[(*fromoffset)++].value=0x33;
  packet[(*fromoffset)++].value=0x39;

  
  packet[(*fromoffset)++].value=0x0d;
  packet[(*fromoffset)++].value=0x0a;
}

void addSIPAuth(struct packets *packet, int *authoffset) {
  packet[(*authoffset)++].value = 0x41;
  packet[(*authoffset)++].value = 0x75;
  packet[(*authoffset)++].value = 0x74;
  packet[(*authoffset)++].value = 0x68;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x7a;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x74;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x6e;
  packet[(*authoffset)++].value = 0x3a;
  packet[(*authoffset)++].value = 0x20;
  packet[(*authoffset)++].value = 0x44;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x67;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x74;
  packet[(*authoffset)++].value = 0x20;
  packet[(*authoffset)++].value = 0x75;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x6e;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x6d;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x37;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x38;
  packet[(*authoffset)++].value = 0x35;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x32;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x35;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x2c;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x6c;
  packet[(*authoffset)++].value = 0x6d;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x42;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x64;
  packet[(*authoffset)++].value = 0x57;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x6b;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x2c;
  packet[(*authoffset)++].value = 0x6e;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x6e;
  packet[(*authoffset)++].value = 0x63;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x33;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x32;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x32;
  packet[(*authoffset)++].value = 0x38;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x33;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x2c;
  packet[(*authoffset)++].value = 0x75;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x70;
  packet[(*authoffset)++].value = 0x3a;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x70;
  packet[(*authoffset)++].value = 0x2e;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x70;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x6e;
  packet[(*authoffset)++].value = 0x73;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x33;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x39;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x63;
  packet[(*authoffset)++].value = 0x66;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x37;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x37;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x39;
  packet[(*authoffset)++].value = 0x35;
  packet[(*authoffset)++].value = 0x37;
  packet[(*authoffset)++].value = 0x66;
  packet[(*authoffset)++].value = 0x64;
  packet[(*authoffset)++].value = 0x34;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x66;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x32;
  packet[(*authoffset)++].value = 0x63;
  packet[(*authoffset)++].value = 0x36;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x30;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x31;
  packet[(*authoffset)++].value = 0x64;
  packet[(*authoffset)++].value = 0x65;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x2c;
  packet[(*authoffset)++].value = 0x61;
  packet[(*authoffset)++].value = 0x6c;
  packet[(*authoffset)++].value = 0x67;
  packet[(*authoffset)++].value = 0x6f;
  packet[(*authoffset)++].value = 0x72;
  packet[(*authoffset)++].value = 0x69;
  packet[(*authoffset)++].value = 0x74;
  packet[(*authoffset)++].value = 0x68;
  packet[(*authoffset)++].value = 0x6d;
  packet[(*authoffset)++].value = 0x3d;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x4d;
  packet[(*authoffset)++].value = 0x44;
  packet[(*authoffset)++].value = 0x35;
  packet[(*authoffset)++].value = 0x22;
  packet[(*authoffset)++].value = 0x0d;
  packet[(*authoffset)++].value = 0x0a;
}

































int main()
{

  FILE * fp;
  int i;
  int packetoffset=0;
  
  fp = fopen("sram.bin", "w+b");
  
  
  
  printf("Please enter the Columbia extension to call: ");
  for (i =0; i<5; i++) numberToCall[i] = getchar() - 0x30;
  
  printf("\r\nPlease wait while I configure the system to call x");
  
  for (i=0; i<5; i++) putchar(numberToCall[i] + 0x30);
  printf("\r\n");

  if (fp == NULL) {
    printf("Error opening\n");
  }
  
  addUDPIPHeader(packet, &packetoffset, 0x02, 0x21, 0x76, 0xdf);
    
  
  //SIP REGISTER header
  packet[packetoffset++].value=0x52;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x47;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x52;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x2E;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x6F;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x76;
  packet[packetoffset++].value=0x6F;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x6F;
  packet[packetoffset++].value=0x6D;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2F;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x2E;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
 
 
 
   //CONTENT LENGTH 0
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x4c;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x67;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


 //CONTACT
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x3c;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x37;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x40;

  addIPNumerical(packet, &packetoffset);

  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x3e;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;

 
   //SIP call-id
  addSIPCallID(packet, &packetoffset);

 
  //SIP FROM
  addSIPFrom(packet, &packetoffset);


  //SIP CSEQ - 1 Register
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x71;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x52;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x47;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x52;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
 

  //SIP TO
  addSIPToLocal(packet, &packetoffset);

  







  //VIA
  packet[packetoffset++].value=0x56;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x55;
  packet[packetoffset++].value=0x44;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x20;

  addIPNumerical(packet, &packetoffset);

  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x3b;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x3d;

  packet[packetoffset++].value=0x7a; //branch
  packet[packetoffset++].value=0x39;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x47;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x4b;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x39; 
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x33; 
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x39;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x34; 
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x66;
  packet[packetoffset++].value=0x38; 
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x35; 
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;

  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  
  
  
  //authorization
  addSIPAuth(packet, &packetoffset);
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;













  //END REGISTER PACKET!
  //START ACK PACKET!
  
  
  
  
  
  
  
  
  
  
  
    packetoffset=0;
//remove register (we don't use it...)
  

  //START SIP INVITE!



































  
  addUDPIPHeader(packet, &packetoffset, 0x02, 0x46, 0x77, 0x06);
  
    //SIP INVITE header
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x4e;
  packet[packetoffset++].value=0x56;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x30 + numberToCall[0]; //start phone #
  packet[packetoffset++].value=0x30 + numberToCall[1];
  packet[packetoffset++].value=0x30 + numberToCall[2];
  packet[packetoffset++].value=0x30 + numberToCall[3];
  packet[packetoffset++].value=0x30 + numberToCall[4];/*
  packet[packetoffset++].value=0x30 + numberToCall[5];
  packet[packetoffset++].value=0x30 + numberToCall[6];
  packet[packetoffset++].value=0x30 + numberToCall[7];
  packet[packetoffset++].value=0x30 + numberToCall[8];
  packet[packetoffset++].value=0x30 + numberToCall[9];*/
  packet[packetoffset++].value=0x40;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6c; 
  packet[packetoffset++].value=0x75;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x75;
/*  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6d;*/
  
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


  //VIA
  addSIPVia(packet, &packetoffset); /*
  packet[packetoffset++].value=0x56;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x55;
  packet[packetoffset++].value=0x44;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x20;

  addIPNumerical(packet, &packetoffset);

  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x3b;
  
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x74;/*
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;*
  packet[packetoffset++].value=0x3b;

  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x3d;

  packet[packetoffset++].value=0x7a; //branch
  packet[packetoffset++].value=0x39;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x47;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x4b;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x39; 
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x33; 
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x39;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x34; 
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x66;
  packet[packetoffset++].value=0x38; 
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x35; 
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;

  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a; */
  
  //SIP FROM
  addSIPFrom(packet, &packetoffset);
  
  //SIP TO
  addSIPToRemote(packet, &packetoffset);
  

 //CONTACT 
/*
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x3c;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x40;

  addIPNumerical(packet, &packetoffset);

  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30; /*
    
  packet[packetoffset++].value=0x3e;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x30;*
  packet[packetoffset++].value=0x3e;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;*/
  
  addSIPContact(packet, &packetoffset);
  
  
   //SIP call-id
  addSIPCallID(packet, &packetoffset);
  
  //CSEQ : 7472 INVITE
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x71;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x37;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x37;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x4e;
  packet[packetoffset++].value=0x56;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;



  
  //CONTENT TYPE = SDP
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x79;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x6c;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  
/*  
  //User Agent
  packet[packetoffset++].value=0x55;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x41;
  packet[packetoffset++].value=0x67;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x58;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x4c;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6c;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  
*/  

  //CONTENT LENGTH 153
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x4c;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x67;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x35;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  

  //authorization
//  addSIPAuth(packet, &packetoffset);



  


  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


  //SESSION DESCRIPTION PROTOCOL AS PART OF INVITE!
  packet[packetoffset++].value=0x76; //sdp version = 0
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  
  packet[packetoffset++].value=0x6f; //session #1
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x20; // to
  packet[packetoffset++].value=0x31; 
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x31; // #1
  packet[packetoffset++].value=0x20; 
  
  packet[packetoffset++].value=0x49; //in
  packet[packetoffset++].value=0x4e;
  packet[packetoffset++].value=0x20;
  
  packet[packetoffset++].value=0x49; //IP4
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x20;
  
  addIPNumerical(packet, &packetoffset);

  
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;

  packet[packetoffset++].value=0x73; //no session name
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


  packet[packetoffset++].value=0x63; //connection info
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x49; //in
  packet[packetoffset++].value=0x4e;
  packet[packetoffset++].value=0x20;
  
  packet[packetoffset++].value=0x49; //IP4
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x20;
  
  addIPNumerical(packet, &packetoffset);

  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;

  packet[packetoffset++].value=0x74; //time
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  

  packet[packetoffset++].value=0x6d; //media type=audio
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x75;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x20;

  packet[packetoffset++].value=0x31; //port = 16384
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x33;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x20;

  packet[packetoffset++].value=0x52; //RTP/AVP
  packet[packetoffset++].value=0x54;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x41;
  packet[packetoffset++].value=0x56;
  packet[packetoffset++].value=0x50;

  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x30; //g.711u
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  
  
  
  packet[packetoffset++].value=0x61; //rtpmap
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x70; 
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6c;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e; 
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x76;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d; 
  packet[packetoffset++].value=0x0a;

/*
  packet[packetoffset++].value=0x61; //rtpmap
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x72;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x70; 
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x75;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x38;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d; 
  packet[packetoffset++].value=0x0a; */

  packet[packetoffset++].value=0x61; //fmtp
  packet[packetoffset++].value=0x3d;
  packet[packetoffset++].value=0x66;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x2c;
  packet[packetoffset++].value=0x31;
  packet[packetoffset++].value=0x36;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;
  






/* GRATUITOUS ARP QUERY */
  packet[packetoffset++].value=0xff;
  packet[packetoffset++].value=0xff;
  packet[packetoffset++].value=0xff;
  packet[packetoffset++].value=0xff;
  packet[packetoffset++].value=0xff;
  packet[packetoffset++].value=0xff;

  //MAC
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x02;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x5d;
    
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x06;
  
  
  //ARP data
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x01;
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x06;
  packet[packetoffset++].value=0x04;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x01;
  
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x02;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x5d;
  
  //ip i want
  addIPHex(packet, &packetoffset);

  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  
  addIPHex(packet, &packetoffset);
  
  //pad - trailer
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;












  //printf("start: %d", packetoffset);


/* SIP ACK ------------------------*/
  
  
  addUDPIPHeader(packet, &packetoffset, 0x01, 0x95, 0x77, 0xb5);
  
    //SIP ACK header
  packet[packetoffset++].value=0x41;
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x4b;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x73;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x70;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x30 + numberToCall[0]; //start phone #
  packet[packetoffset++].value=0x30 + numberToCall[1];
  packet[packetoffset++].value=0x30 + numberToCall[2];
  packet[packetoffset++].value=0x30 + numberToCall[3];
  packet[packetoffset++].value=0x30 + numberToCall[4]; /*
  packet[packetoffset++].value=0x30 + numberToCall[5];
  packet[packetoffset++].value=0x30 + numberToCall[6];
  packet[packetoffset++].value=0x30 + numberToCall[7];
  packet[packetoffset++].value=0x30 + numberToCall[8];
  packet[packetoffset++].value=0x30 + numberToCall[9]; */
  packet[packetoffset++].value=0x40;

  packet[packetoffset++].value=0x63;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6c; 
  packet[packetoffset++].value=0x75;
  packet[packetoffset++].value=0x6d;
  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x69;
  packet[packetoffset++].value=0x61;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x64;
  packet[packetoffset++].value=0x75;
  
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x49;
  packet[packetoffset++].value=0x50;
  packet[packetoffset++].value=0x2f;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x2e;
  packet[packetoffset++].value=0x30;

  


  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


  addSIPVia(packet, &packetoffset);
  
    //SIP FROM
  addSIPFrom(packet, &packetoffset);

  //SIP TO
  addSIPToRemoteWithTag(packet, &packetoffset);
  //printf("tag: %d\n", packetoffset);

   addSIPContact(packet, &packetoffset);

   //SIP call-id
  addSIPCallID(packet, &packetoffset);
  
  //CSEQ : 7472 ACK
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x53;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x71;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x37;
  packet[packetoffset++].value=0x34;
  packet[packetoffset++].value=0x37;
  packet[packetoffset++].value=0x32;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x41;
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x4b;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;


    //CONTENT LENGTH 0
  packet[packetoffset++].value=0x43;
  packet[packetoffset++].value=0x6f;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x2d;
  packet[packetoffset++].value=0x4c;
  packet[packetoffset++].value=0x65;
  packet[packetoffset++].value=0x6e;
  packet[packetoffset++].value=0x67;
  packet[packetoffset++].value=0x74;
  packet[packetoffset++].value=0x68;
  packet[packetoffset++].value=0x3a;
  packet[packetoffset++].value=0x20;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;

  //authorization
//  addSIPAuth(packet, &packetoffset);
  


  packet[packetoffset++].value=0x0d;
  packet[packetoffset++].value=0x0a;

  //END SIP ACK!






/* RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP RTP */

  //START RTP Framework
  //printf("Start RTP: %d", packetoffset);
  
  //  addUDPIPHeader(packet, &packetoffset, 0x00, 0xc8, 0x63, 0xcc);
  //alter dest ip to columbia's rtp gateway for sip: 128.59.59.242
  //9+10 or 10 + 11 bytes back  hmm
  


  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0xd0;
  packet[packetoffset++].value=0x06;
  packet[packetoffset++].value=0x26; //26 vs 24
  packet[packetoffset++].value=0x9c; //9c vs c8
  packet[packetoffset++].value=0x0a;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x02;

  packet[packetoffset++].value=0x62;
  packet[packetoffset++].value=0x30;
  packet[packetoffset++].value=0x5d;
  packet[packetoffset++].value=0x08;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x45;
  packet[packetoffset++].value=0xb8; //expedited = b8.. on for rtp, not for sip

  

  packet[packetoffset++].value=0; //total packet length
  packet[packetoffset++].value=0xc8;
  packet[packetoffset++].value=0x04;
  packet[packetoffset++].value=0x41;
  packet[packetoffset++].value=0x00; 
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x80;
  packet[packetoffset++].value=0x11;
  packet[packetoffset++].value=0x63; //checksum
  packet[packetoffset++].value=0x59;

  addIPHex(packet, &packetoffset);

  packet[packetoffset++].value=0x80;
  packet[packetoffset++].value=0x3b;
  packet[packetoffset++].value=0x3b;
  packet[packetoffset++].value=0xf2;
  
  packet[packetoffset++].value=0x40;
  packet[packetoffset++].value=0x00;
  //dest port
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00;
  packet[packetoffset++].value=0x00; //udp length
  packet[packetoffset++].value=0xb4;
  packet[packetoffset++].value=0x00; //50, 24 //disable udp checksum
  packet[packetoffset++].value=0x00;


  packet[packetoffset++].value = 0x80;
  packet[packetoffset++].value = 0x00;
  





//  fprintf(fp,"%c%c", 0x00, 0x00);
  for (i = 0; i <= packetoffset; i++) {

//    printf("%d\n",i);
    fprintf(fp,"%c%c",packet[i], 0x00);
  }


  //printf("ends: %d", packetoffset);

  fclose(fp);
  
}

