Implement XID/SABM/SABME ack timers
Changes:
    * Implement patty_ax25_sock_timeR_ack_restart() to initialize the
      XID/SABM/SABME ack Timer T1
    * Implement patty_ax25_sock_timer_ack_cancel() to clear Timer T1
    * Implement patty_ax25_sock_timer_ack_sub() to subtract the value of
      a struct timeval from Timer T1
    * Implement patty_ax25_sock_timer_ack_expired() to indicate if the
      ack Timer T1 has expired
Other changes:
    * Rearrange patty_ax25_sock a bit
			
			
This commit is contained in:
		
							parent
							
								
									578c9183e8
								
							
						
					
					
						commit
						8ab4c24b4a
					
				
					 2 changed files with 48 additions and 6 deletions
				
			
		| 
						 | 
					@ -55,10 +55,6 @@ typedef struct _patty_ax25_sock {
 | 
				
			||||||
    enum patty_ax25_sock_status status;
 | 
					    enum patty_ax25_sock_status status;
 | 
				
			||||||
    enum patty_ax25_sock_mode   mode;
 | 
					    enum patty_ax25_sock_mode   mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct timeval timer_ack,
 | 
					 | 
				
			||||||
                   timer_response,
 | 
					 | 
				
			||||||
                   timer_keepalive;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    size_t n_maxlen_tx,
 | 
					    size_t n_maxlen_tx,
 | 
				
			||||||
           n_maxlen_rx,
 | 
					           n_maxlen_rx,
 | 
				
			||||||
           n_window_tx,
 | 
					           n_window_tx,
 | 
				
			||||||
| 
						 | 
					@ -66,12 +62,18 @@ typedef struct _patty_ax25_sock {
 | 
				
			||||||
           n_ack,
 | 
					           n_ack,
 | 
				
			||||||
           n_retry;
 | 
					           n_retry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unsigned int seq_send,
 | 
					    struct timeval timer_ack,       /* Timer T1 */
 | 
				
			||||||
                 seq_recv;
 | 
					                   timer_response,
 | 
				
			||||||
 | 
					                   timer_keepalive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t flags_classes,
 | 
					    uint32_t flags_classes,
 | 
				
			||||||
             flags_hdlc;
 | 
					             flags_hdlc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    unsigned int seq_send,
 | 
				
			||||||
 | 
					                 seq_recv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    size_t retries;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    char pty[PATTY_AX25_SOCK_PATH_SIZE];
 | 
					    char pty[PATTY_AX25_SOCK_PATH_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,6 +98,15 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void patty_ax25_sock_destroy(patty_ax25_sock *sock);
 | 
					void patty_ax25_sock_destroy(patty_ax25_sock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_restart(patty_ax25_sock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_cancel(patty_ax25_sock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_sub(patty_ax25_sock *sock,
 | 
				
			||||||
 | 
					                                   struct timeval *elapsed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int patty_ax25_sock_timer_ack_expired(patty_ax25_sock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int patty_ax25_sock_reset(patty_ax25_sock *sock);
 | 
					int patty_ax25_sock_reset(patty_ax25_sock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int patty_ax25_sock_upgrade(patty_ax25_sock *sock,
 | 
					int patty_ax25_sock_upgrade(patty_ax25_sock *sock,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								src/sock.c
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								src/sock.c
									
										
									
									
									
								
							| 
						 | 
					@ -179,12 +179,43 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
 | 
				
			||||||
    free(sock);
 | 
					    free(sock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * AX.25 v2.2 Specification, Section 6.3.1 "AX.25 Link Connection Establishment"
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_restart(patty_ax25_sock *sock) {
 | 
				
			||||||
 | 
					    sock->timer_ack.tv_sec  =  sock->n_ack / 1000;
 | 
				
			||||||
 | 
					    sock->timer_ack.tv_usec = (sock->n_ack % 1000) * 1000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_cancel(patty_ax25_sock *sock) {
 | 
				
			||||||
 | 
					    sock->timer_ack.tv_sec  = 0;
 | 
				
			||||||
 | 
					    sock->timer_ack.tv_usec = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void patty_ax25_sock_timer_ack_sub(patty_ax25_sock *sock,
 | 
				
			||||||
 | 
					                                   struct timeval *elapsed) {
 | 
				
			||||||
 | 
					    struct timeval res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timersub(&sock->timer_ack, elapsed, &res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(&sock->timer_ack, &res, sizeof(sock->timer_ack));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int patty_ax25_sock_timer_ack_expired(patty_ax25_sock *sock) {
 | 
				
			||||||
 | 
					    return (sock->timer_ack.tv_sec <= 0 && sock->timer_ack.tv_usec == 0)? 1: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * AX.25 v2.2 Specification, Section 6.5 "Resetting Procedure"
 | 
					 * AX.25 v2.2 Specification, Section 6.5 "Resetting Procedure"
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int patty_ax25_sock_reset(patty_ax25_sock *sock) {
 | 
					int patty_ax25_sock_reset(patty_ax25_sock *sock) {
 | 
				
			||||||
    sock->seq_send = 0;
 | 
					    sock->seq_send = 0;
 | 
				
			||||||
    sock->seq_recv = 0;
 | 
					    sock->seq_recv = 0;
 | 
				
			||||||
 | 
					    sock->retries  = sock->n_retry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&sock->timer_ack,       '\0', sizeof(sock->timer_ack));
 | 
				
			||||||
 | 
					    memset(&sock->timer_response,  '\0', sizeof(sock->timer_response));
 | 
				
			||||||
 | 
					    memset(&sock->timer_keepalive, '\0', sizeof(sock->timer_keepalive));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue