- /*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) );
- }