-void sendClose(int seq, u_int16_t ack_h, u_int32_t ack_l, int socket){
- unsigned char buffer[1500];
- struct dccp_hdr *dhdr;
- struct dccp_hdr_ext *dhdre;
- struct dccp_hdr_ack_bits *dhd_ack;
- struct iphdr* ip4hdr;
- struct ip6_hdr* ip6hdr;
- int len;
- int addrlen;
-
- int ip_hdr_len;
- int dccp_hdr_len=sizeof(struct dccp_hdr)+sizeof(struct dccp_hdr_ext)+sizeof(struct dccp_hdr_ack_bits);
-
- memset(buffer, 0, 1500);
-
- /*IP header*/
- ip4hdr=NULL;
- if(parms.ip_type==AF_INET){
- ip_hdr_len=sizeof(struct iphdr);
- ip4hdr=(struct iphdr*)buffer;
- ip4hdr->check=htons(0);
- memcpy(&ip4hdr->daddr, &parms.dest_addr.ipv4->sin_addr, sizeof(parms.dest_addr.ipv4->sin_addr));
- ip4hdr->frag_off=htons(0);
- ip4hdr->id=htons(1);//first
- ip4hdr->ihl=5;
- ip4hdr->protocol=IPPROTO_DCCP;
- memcpy(&ip4hdr->saddr, &parms.src_addr.ipv4->sin_addr, sizeof(parms.src_addr.ipv4->sin_addr));
- ip4hdr->tos=0;
- ip4hdr->tot_len=htons(ip_hdr_len+dccp_hdr_len);
- ip4hdr->ttl=parms.ttl;
- ip4hdr->version=4;
- }else{
- ip_hdr_len=sizeof(struct ip6_hdr);
- ip6hdr=(struct ip6_hdr*)buffer;
- memcpy(&ip6hdr->ip6_dst, &parms.dest_addr.ipv6->sin6_addr, sizeof(parms.dest_addr.ipv6->sin6_addr));
- memcpy(&ip6hdr->ip6_src, &parms.src_addr.ipv6->sin6_addr, sizeof(parms.src_addr.ipv6->sin6_addr));
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_flow=htonl(6<<28); //version, traffic class, flow label
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_hlim=parms.ttl;
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_nxt=IPPROTO_DCCP;
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_plen=htons(dccp_hdr_len);
- }
-
- /*DCCP header*/
- dhdr=(struct dccp_hdr*)(buffer+ip_hdr_len);
- dhdre=(struct dccp_hdr_ext*)(buffer+ip_hdr_len+sizeof(struct dccp_hdr));
- dhd_ack=(struct dccp_hdr_ack_bits*)(buffer+ip_hdr_len+sizeof(struct dccp_hdr)+sizeof(struct dccp_hdr_ext));
- dhdr->dccph_ccval=0;
- dhdr->dccph_checksum=0;
- dhdr->dccph_cscov=0;
- dhdr->dccph_doff=dccp_hdr_len/4;
- dhdr->dccph_dport=htons(parms.dest_port);
- dhdr->dccph_reserved=0;
- dhdr->dccph_sport=htons(parms.src_port);
- dhdr->dccph_x=1;
- dhdr->dccph_type=DCCP_PKT_CLOSE;
- dhdr->dccph_seq2=htonl(0); //Reserved if using 48 bit sequence numbers
- dhdr->dccph_seq=htonl(0); //High 16bits of sequence number. Always make 0 for simplicity.
- dhdre->dccph_seq_low=htonl(seq+1);
- dhd_ack->dccph_ack_nr_high=ack_h;
- dhd_ack->dccph_ack_nr_low=ack_l;
-
- /*Checksums*/
- if(parms.ip_type==AF_INET){
- dhdr->dccph_checksum=ipv4_pseudohdr_chksum((buffer+ip_hdr_len), dccp_hdr_len,
- (unsigned char*) &parms.dest_addr.ipv4->sin_addr,
- (unsigned char*)&parms.src_addr.ipv4->sin_addr, IPPROTO_DCCP);
- ip4hdr->check=ipv4_chksum(buffer,ip_hdr_len);
- }else{
- dhdr->dccph_checksum=ipv6_pseudohdr_chksum((buffer+ip_hdr_len), dccp_hdr_len,
- (unsigned char*) &parms.dest_addr.ipv6->sin6_addr,
- (unsigned char*)&parms.src_addr.ipv6->sin6_addr, IPPROTO_DCCP);
- }
- len=ip_hdr_len+dccp_hdr_len;
-
- /*Send*/
- if(parms.ip_type==AF_INET){
- addrlen=sizeof(struct sockaddr_in);
- }else{
- addrlen=sizeof(struct sockaddr_in6);
- }
- if(sendto(socket, &buffer, len, MSG_DONTWAIT,(struct sockaddr*)parms.dest_addr.gen,addrlen)<0){
- if(errno!=EINTR){
- dbgprintf(0,"Error: sendto failed\n");
- }
- }
- return;
-}
-
-void sendReset(int seq, u_int16_t ack_h, u_int32_t ack_l, int socket){
- unsigned char buffer[1500];
- struct dccp_hdr *dhdr;
- struct dccp_hdr_ext *dhdre;
- struct dccp_hdr_reset *dh_re;
- struct iphdr* ip4hdr;
- struct ip6_hdr* ip6hdr;
- int len;
- int addrlen;
-
- int ip_hdr_len;
- int dccp_hdr_len=sizeof(struct dccp_hdr)+sizeof(struct dccp_hdr_ext)+sizeof(struct dccp_hdr_reset);
-
- memset(buffer, 0, 1500);
-
- /*IP header*/
- ip4hdr=NULL;
- if(parms.ip_type==AF_INET){
- ip_hdr_len=sizeof(struct iphdr);
- ip4hdr=(struct iphdr*)buffer;
- ip4hdr->check=htons(0);
- memcpy(&ip4hdr->daddr, &parms.dest_addr.ipv4->sin_addr, sizeof(parms.dest_addr.ipv4->sin_addr));
- ip4hdr->frag_off=htons(0);
- ip4hdr->id=htons(1);//first
- ip4hdr->ihl=5;
- ip4hdr->protocol=IPPROTO_DCCP;
- memcpy(&ip4hdr->saddr, &parms.src_addr.ipv4->sin_addr, sizeof(parms.src_addr.ipv4->sin_addr));
- ip4hdr->tos=0;
- ip4hdr->tot_len=htons(ip_hdr_len+dccp_hdr_len);
- ip4hdr->ttl=parms.ttl;
- ip4hdr->version=4;
- }else{
- ip_hdr_len=sizeof(struct ip6_hdr);
- ip6hdr=(struct ip6_hdr*)buffer;
- memcpy(&ip6hdr->ip6_dst, &parms.dest_addr.ipv6->sin6_addr, sizeof(parms.dest_addr.ipv6->sin6_addr));
- memcpy(&ip6hdr->ip6_src, &parms.src_addr.ipv6->sin6_addr, sizeof(parms.src_addr.ipv6->sin6_addr));
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_flow=htonl(6<<28); //version, traffic class, flow label
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_hlim=parms.ttl;
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_nxt=IPPROTO_DCCP;
- ip6hdr->ip6_ctlun.ip6_un1.ip6_un1_plen=htons(dccp_hdr_len);
- }
-
- /*DCCP header*/
- dhdr=(struct dccp_hdr*)(buffer+ip_hdr_len);
- dhdre=(struct dccp_hdr_ext*)(buffer+ip_hdr_len+sizeof(struct dccp_hdr));
- dh_re=(struct dccp_hdr_reset*)(buffer+ip_hdr_len+sizeof(struct dccp_hdr)+sizeof(struct dccp_hdr_ext));
- dhdr->dccph_ccval=0;
- dhdr->dccph_checksum=0;
- dhdr->dccph_cscov=0;
- dhdr->dccph_doff=dccp_hdr_len/4;
- dhdr->dccph_dport=htons(parms.dest_port);
- dhdr->dccph_reserved=0;
- dhdr->dccph_sport=htons(parms.src_port);
- dhdr->dccph_x=1;
- dhdr->dccph_type=DCCP_PKT_RESET;
- dhdr->dccph_seq2=htonl(0); //Reserved if using 48 bit sequence numbers
- dhdr->dccph_seq=htonl(0); //High 16bits of sequence number. Always make 0 for simplicity.
- dhdre->dccph_seq_low=htonl(seq+1);
- dh_re->dccph_reset_ack.dccph_ack_nr_high=ack_h;
- dh_re->dccph_reset_ack.dccph_ack_nr_low=ack_l;
- dh_re->dccph_reset_code=DCCP_RESET_CODE_CLOSED;
- dh_re->dccph_reset_data[0]=0;
- dh_re->dccph_reset_data[1]=0;
- dh_re->dccph_reset_data[2]=0;
-
- /*Checksums*/
- if(parms.ip_type==AF_INET){
- dhdr->dccph_checksum=ipv4_pseudohdr_chksum((buffer+ip_hdr_len), dccp_hdr_len,
- (unsigned char*) &parms.dest_addr.ipv4->sin_addr,
- (unsigned char*)&parms.src_addr.ipv4->sin_addr, IPPROTO_DCCP);
- ip4hdr->check=ipv4_chksum(buffer,ip_hdr_len);
- }else{
- dhdr->dccph_checksum=ipv6_pseudohdr_chksum((buffer+ip_hdr_len), dccp_hdr_len,
- (unsigned char*) &parms.dest_addr.ipv6->sin6_addr,
- (unsigned char*)&parms.src_addr.ipv6->sin6_addr, IPPROTO_DCCP);
- }
- len=ip_hdr_len+dccp_hdr_len;
-
- /*Send*/
- if(parms.ip_type==AF_INET){
- addrlen=sizeof(struct sockaddr_in);
- }else{
- addrlen=sizeof(struct sockaddr_in6);
- }
- if(sendto(socket, &buffer, len, MSG_DONTWAIT,(struct sockaddr*)parms.dest_addr.gen,addrlen)<0){
- if(errno!=EINTR){
- dbgprintf(0,"Error: sendto failed\n");
- }
- }
- return;
-}
-