+ /*Process DCCP Packet Types*/
+ switch(dccph->dccph_type){
+ case DCCP_PKT_REQUEST:
+ dbgprintf(2,"Packet Type: Request\n");
+ if(!handle_request(new, old, h1, h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_RESPONSE:
+ dbgprintf(2,"Packet Type: Response\n");
+ if(!handle_response(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_DATA:
+ if(!handle_data(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_DATAACK:
+ dbgprintf(2,"Packet Type: DataAck\n");
+ if(!handle_dataack(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_ACK:
+ dbgprintf(2,"Packet Type: Ack\n");
+ if(!handle_ack(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_CLOSEREQ:
+ dbgprintf(2,"Packet Type: CloseReq\n");
+ if(!handle_closereq(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_CLOSE:
+ dbgprintf(2,"Packet Type: Close\n");
+ if(!handle_close(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_RESET:
+ dbgprintf(2,"Packet Type: Reset\n");
+ if(!handle_reset(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_SYNC:
+ dbgprintf(2,"Packet Type: Sync\n");
+ if(!handle_sync(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ case DCCP_PKT_SYNCACK:
+ dbgprintf(2,"Packet Type: SyncAck\n");
+ if(!handle_syncack(new,old,h1,h2)){
+ return 0;
+ }
+ break;
+ default:
+ dbgprintf(0,"Invalid DCCP Packet!!\n");
+ return 0;
+ break;
+ }
+
+ /*Compute TCP checksums*/
+ if(new->id_len==IP4_ADDR_LEN){
+ tcph->check=0;
+ tcph->check=ipv4_pseudohdr_chksum(new->data,
+ new->length, new->dest_id, new->src_id, 6);
+ }else if(new->id_len==IP6_ADDR_LEN){
+ tcph->check=0;
+ tcph->check=ipv6_pseudohdr_chksum(new->data,
+ new->length, new->dest_id, new->src_id, 6);
+ }else{
+ tcph->check=0;
+ dbgprintf(2,"Unknown ID Length, can't do checksums\n");
+ }
+
+ return 1;
+}
+
+int handle_request(struct packet* new, const struct const_packet* old, struct hcon* h1, struct hcon* h2)
+{
+ struct tcphdr *tcph;
+ struct dccp_hdr *dccph;
+ struct dccp_hdr_ext *dccphex;
+ int datalength;
+ int optlen;
+ u_char* tcpopt;
+ const u_char* dccpopt;
+
+ /*length check*/
+ if(new->length < sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext)+sizeof(struct dccp_hdr_request)){