/*cast header pointers*/
tcph=(struct tcphdr*)new->data;
- tcpopt=new->data + sizeof(struct tcphdr);
dccph=(struct dccp_hdr*)old->data;
dccphex=(struct dccp_hdr_ext*)(old->data+sizeof(struct dccp_hdr));
dccphack=(struct dccp_hdr_ack_bits*)(old->data+ sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext));
/* add Sack-permitted option, if relevant*/
if(sack){
+ tcpopt=(u_char*)(new->data + tcph->doff*4);
*tcpopt=4;
tcpopt++;
*tcpopt=2;
/* add Sack-permitted option, if relevant*/
if(sack){
+ tcpopt=(u_char*)(new->data + tcph->doff*4);
*tcpopt=4;
*(tcpopt+1)=2;
tcph->doff++;
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
}
}
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
}
}
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
}
}
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
}
}
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
}
}
}
if(sack){
if(sack!=2 || interp_ack_vect((u_char*)dccph)){
- ack_vect2sack(h2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low));
+ ack_vect2sack(h2, tcph, (u_char*)tcph + tcph->doff*4, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low));
}
}
nnew.data= new->data + sizeof(struct ether_header);
nold.length= old->length - sizeof(struct ether_header);
nnew.length= new->length - sizeof(struct ether_header);
+ nnew.h=new->h;
+ nold.h=old->h;
/*Select Next Protocol*/
switch(ntohs(ethh->ether_type)){
case ETHERTYPE_IP:
- nnew.h=new->h;
- nold.h=old->h;
if(!ipv4_encap(&nnew, &nold)){
return 0;
}
nnew.data= new->data +iph->ihl*4;
nold.length= old->length -iph->ihl*4;
nnew.length= new->length -iph->ihl*4;
+ nnew.h=new->h;
+ nold.h=old->h;
/*Confirm that this is IPv4*/
if(iph->version!=4){
switch(iph->protocol){
case 0x21:
/*DCCP*/
- nnew.h=new->h;
- nold.h=old->h;
nnew.src_id=iph->saddr;
nnew.dest_id=iph->daddr;
if(!convert_packet(&nnew, &nold)){
}
/*Adjust IPv4 header to account for packet's total length*/
- iph->tot_len=htons(nnew.length);
+ iph->tot_len=htons(new->length);
return 1;
}
nnew.data= new->data + sizeof(struct sll_header);
nold.length= old->length - sizeof(struct sll_header);
nnew.length= new->length- sizeof(struct sll_header);
+ nnew.h=new->h;
+ nold.h=old->h;
/*Confirm that this is SLL*/
if(ntohs(slh->sll_pkttype) > 4){
/*Select Next Protocol*/
switch(ntohs(slh->sll_protocol)){
case ETHERTYPE_IP:
- nnew.h=new->h;
- nold.h=old->h;
if(!ipv4_encap(&nnew, &nold)){
return 0;
}