Changeset 473bb9


Ignore:
Timestamp:
08/15/09 14:43:02 (3 years ago)
Author:
Erik Ekman <yarrick@…>
Branches:
master
Children:
0e81cd
Parents:
7e4ee6
git-author:
Erik Ekman <yarrick@…> (08/15/09 14:43:02)
git-committer:
Erik Ekman <erik@…> (02/04/12 20:34:03)
Message:

#36, Send ping message every 20 seconds

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/common.h

    r58d961 r473bb9  
    2424#define RAW_HDR_CMD_LOGIN 0x10 
    2525#define RAW_HDR_CMD_DATA  0x20 
     26#define RAW_HDR_CMD_PING  0x30 
    2627 
    2728#define RAW_HDR_CMD_MASK  0xF0 
  • src/iodine.c

    r7e4ee6 r473bb9  
    5959#endif 
    6060 
     61#define PING_TIMEOUT(t) ((t) >= (conn == CONN_DNS_NULL ? 1 : 20)) 
     62 
    6163static void send_ping(int fd); 
    6264static void send_chunk(int fd); 
     
    133135 
    134136        memcpy(packet, raw_header, RAW_HDR_LEN); 
    135         memcpy(&packet[RAW_HDR_LEN], buf, len); 
     137        if (len) { 
     138                memcpy(&packet[RAW_HDR_LEN], buf, len); 
     139        } 
    136140 
    137141        len += RAW_HDR_LEN; 
     
    346350        int rv; 
    347351        int i; 
     352        int seconds; 
    348353 
    349354        rv = 0; 
     355        seconds = 0; 
    350356 
    351357        while (running) { 
     
    368374                        err(1, "select"); 
    369375 
    370                 if (i == 0 && conn == CONN_DNS_NULL) /* timeout */ 
    371                         send_ping(dns_fd); 
    372                 else { 
     376                if (i == 0) { /* timeout */ 
     377                        seconds++; 
     378                } else { 
    373379                        if (FD_ISSET(tun_fd, &fds)) { 
     380                                seconds = 0; 
    374381                                if (tunnel_tun(tun_fd, dns_fd) <= 0) 
    375382                                        continue; 
     
    380387                        }  
    381388                } 
     389 
     390                if (PING_TIMEOUT(seconds)) { 
     391                        send_ping(dns_fd); 
     392                        seconds = 0; 
     393                } 
    382394        } 
    383395 
     
    446458send_ping(int fd) 
    447459{ 
    448         char data[4]; 
    449          
    450         if (is_sending()) { 
    451                 outpkt.sentlen = 0; 
    452                 outpkt.offset = 0; 
    453                 outpkt.len = 0; 
    454         } 
    455  
    456         data[0] = userid; 
    457         data[1] = ((downstream_seqno & 7) << 4) | (downstream_fragment & 15); 
    458         data[2] = (rand_seed >> 8) & 0xff; 
    459         data[3] = (rand_seed >> 0) & 0xff; 
    460          
    461         down_ack_seqno = downstream_seqno; 
    462         down_ack_fragment = downstream_fragment; 
    463          
    464         rand_seed++; 
    465  
    466         send_packet(fd, 'P', data, sizeof(data)); 
     460        if (conn == CONN_DNS_NULL) { 
     461                char data[4]; 
     462                 
     463                if (is_sending()) { 
     464                        outpkt.sentlen = 0; 
     465                        outpkt.offset = 0; 
     466                        outpkt.len = 0; 
     467                } 
     468 
     469                data[0] = userid; 
     470                data[1] = ((downstream_seqno & 7) << 4) | (downstream_fragment & 15); 
     471                data[2] = (rand_seed >> 8) & 0xff; 
     472                data[3] = (rand_seed >> 0) & 0xff; 
     473                 
     474                down_ack_seqno = downstream_seqno; 
     475                down_ack_fragment = downstream_fragment; 
     476                 
     477                rand_seed++; 
     478 
     479                send_packet(fd, 'P', data, sizeof(data)); 
     480        } else { 
     481                send_raw(fd, NULL, 0, userid, RAW_HDR_CMD_PING); 
     482        } 
    467483} 
    468484 
  • src/iodined.c

    re5370a r473bb9  
    146146 
    147147        memcpy(packet, raw_header, RAW_HDR_LEN); 
    148         memcpy(&packet[RAW_HDR_LEN], buf, len); 
     148        if (len) { 
     149                memcpy(&packet[RAW_HDR_LEN], buf, len); 
     150        } 
    149151 
    150152        len += RAW_HDR_LEN; 
     
    930932} 
    931933 
     934static void 
     935handle_raw_ping(struct query *q, int dns_fd, int userid) 
     936{ 
     937        if (check_user_and_ip(userid, q) != 0) { 
     938                return; 
     939        } 
     940 
     941        /* Update query and time info for user */ 
     942        users[userid].last_pkt = time(NULL); 
     943        memcpy(&(users[userid].q), q, sizeof(struct query)); 
     944 
     945        /* Send ping reply */ 
     946        send_raw(dns_fd, NULL, 0, userid, RAW_HDR_CMD_PING, q); 
     947} 
     948 
    932949static int 
    933950raw_decode(char *packet, int len, struct query *q, int dns_fd, int tun_fd) 
     
    949966                /* Data packet */ 
    950967                handle_raw_data(&packet[RAW_HDR_LEN], len - RAW_HDR_LEN, q, dns_fd, tun_fd, raw_user); 
     968                break; 
     969        case RAW_HDR_CMD_PING: 
     970                /* Keepalive packet */ 
     971                handle_raw_ping(q, dns_fd, raw_user); 
    951972                break; 
    952973        default: 
Note: See TracChangeset for help on using the changeset viewer.