- /*determine data length*/
- datalength=old->length - dccph->dccph_doff*4;
- pd=old->data + dccph->dccph_doff*4;
-
- /*set TCP standard features*/
- tcph->source=dccph->dccph_sport;
- tcph->dest=dccph->dccph_dport;
- tcph->doff=5;
- tcph->check=htonl(0);
- tcph->urg_ptr=0;
-
- /*Adjust TCP advertised window size*/
- if(!yellow){
- tcph->window=htons(30000);
- }
-
- /*make changes by packet type*/
- if(dccph->dccph_type==DCCP_PKT_REQUEST){//DCCP REQUEST -->TCP SYN
- dbgprintf(2,"Packet Type: Request\n");
- if(h1->state==INIT){
- if(yellow){
- tcph->window=htons(0);
- }
- tcph->ack_seq=htonl(0);
- tcph->seq=htonl(initialize_seq(h1, dccph->dccph_sport, ntohl(dccphex->dccph_seq_low)));
- tcph->syn=1;
- tcph->ack=0;
- tcph->fin=0;
- tcph->rst=0;
-
- /* add Sack-permitted option, if relevant*/
- if(sack){
- *tcpopt=4;
- tcpopt++;
- *tcpopt=2;
- tcph->doff++;
- }
-
- /*calculate length*/
- len=tcph->doff*4;
- }
- }
-
- if(dccph->dccph_type==DCCP_PKT_RESPONSE){//DCCP RESPONSE-->TCP SYN,ACK
- dbgprintf(2,"Packet Type: Response\n");
- if(h2->state==OPEN && h1->state==INIT){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- if(yellow){
- tcph->window=htons(0);
- }
- tcph->seq=htonl(initialize_seq(h1, dccph->dccph_sport, ntohl(dccphex->dccph_seq_low)));
- tcph->syn=1;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /* add Sack-permitted option, if relevant*/
- if(sack){
- *tcpopt=4;
- *(tcpopt+1)=2;
- tcph->doff++;
- }
-
- /*calculate length*/
- len=tcph->doff*4;
- }
- }
-
- if(dccph->dccph_type==DCCP_PKT_DATA){//DCCP DATA----Never seen in packet capture
- dbgprintf(0,"DCCP Data packet not yet implemented\n");
- exit(1);
- }
-
- if(dccph->dccph_type==DCCP_PKT_DATAACK){//DCCP DATAACK-->TCP ACK with data
- dbgprintf(2,"Packet Type: DataAck\n");
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),datalength, dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(h2, 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) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*copy data*/
- npd=new->data + tcph->doff*4;
- memcpy(npd, pd, datalength);
-
- /*calculate length*/
- len= tcph->doff*4 + datalength;
- }
-
- if(dccph->dccph_type==DCCP_PKT_ACK){ //DCCP ACK -->TCP ACK with no data
- dbgprintf(2,"Packet Type: Ack\n");
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),1,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*1400);
- if(-interp_ack_vect((u_char*)dccph)*1400 > 65535){
- printf("Note: TCP Window Overflow @ %d.%d\n", (int)old->h->ts.tv_sec, (int)old->h->ts.tv_usec);
- }
- }
- 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) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*calculate length*/
- len=tcph->doff*4 + 1;
- }
-
- if(dccph->dccph_type==DCCP_PKT_CLOSEREQ){//DCCP CLOSEREQ----Never seen in packet capture
- dbgprintf(0,"DCCP CloseReq not yet implemented\n");
- exit(1);
- }
-
- if(dccph->dccph_type==DCCP_PKT_CLOSE){//DCCP CLOSE-->TCP FIN,ACK
- dbgprintf(2,"Packet Type: Close\n");
- update_state(h1,CLOSE);
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),1,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(h2, 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) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=1;
- tcph->rst=0;
-
- /*calculate length*/
- len=tcph->doff*4;
- }
-
- if(dccph->dccph_type==DCCP_PKT_RESET){//DCCP RESET-->TCP FIN,ACK (only seen at end of connection as CLOSE ACK)
- if(h2->state==CLOSE){
- update_state(h1,CLOSE);
- }
- dbgprintf(2,"Packet Type: Reset\n");
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),1,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(h2, 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) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=1;
- tcph->rst=0;
-
- /*calculate length*/
- len=tcph->doff*4;
- }
-
- if(dccph->dccph_type==DCCP_PKT_SYNC){//DCCP SYNC
- dbgprintf(2,"Packet Type: Sync\n");
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),0,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(h2, ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->window=htons(0);
- }
- 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) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*calculate length*/
- len=tcph->doff*4;
- }
-
- if(dccph->dccph_type==DCCP_PKT_SYNCACK){//DCCP SYNACK
- dbgprintf(2,"Packet Type: SyncAck\n");
- if(green){
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(h2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(h1, ntohl(dccphex->dccph_seq_low),0,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(h2, ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->window=htons(0);
- }
- 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));
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*calculate length*/
- len=tcph->doff*4;
- }
-
- if(dccph->dccph_type==DCCP_PKT_INVALID){//DCCP INVALID----Never seen in packet capture
- dbgprintf(0,"Invalid DCCP Packet!!\n");
- return 0;
- }
-
- new->length=len;
-return 1;
-}
-
-
-/*Parse Ack Vector Options
- * Returns the Number of packets since last recorded loss*/
-unsigned int interp_ack_vect(u_char* hdr)
-{
- int hdrlen=((struct dccp_hdr*)hdr)->dccph_doff*4;
- //struct dccp_hdr_ext* e=(struct dccp_hdr_ext*)hdr + sizeof(struct dccp_hdr);
- int optlen;
- int len;
- int tmp;
- int bp=0;
- int additional=0;
- u_char* opt;
- u_char* cur;
-
- /*setup pointer to DCCP options and determine how long the options are*/
- optlen=hdrlen-sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext) - sizeof(struct dccp_hdr_ack_bits);
- opt=hdr + sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext) + sizeof(struct dccp_hdr_ack_bits);
-
- /*parse options*/
- while(optlen > 0){
- len=*(opt+1);
-
- /*One byte options (no length)*/
- if(*opt< 32){
- optlen--;
- opt++;
- continue;