Implement functions for setting params on sockets
Changes: * Implement patty_ax25_sock_upgrade() to upgrade a socket from the default AX.25 2.0 parameters to AX.25 2.2 parameters, meant to be used upon receipt of an XID frame * Implement patty_ax25_sock_params_set() to set lowest common denominator parameters to a socket, downgrading or adapting to the parameters advertised by a peer XID frame as necessary
This commit is contained in:
parent
a4f50d6bea
commit
052c7d94d0
2 changed files with 100 additions and 0 deletions
|
@ -87,8 +87,13 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
|
|||
|
||||
void patty_ax25_sock_reset(patty_ax25_sock *sock);
|
||||
|
||||
void patty_ax25_sock_upgrade(patty_ax25_sock *sock);
|
||||
|
||||
void patty_ax25_sock_destroy(patty_ax25_sock *sock);
|
||||
|
||||
int patty_ax25_sock_params_set(patty_ax25_sock *sock,
|
||||
patty_ax25_params *params);
|
||||
|
||||
int patty_ax25_sock_mode_set(patty_ax25_sock *sock,
|
||||
enum patty_ax25_sock_mode mode);
|
||||
|
||||
|
|
95
src/sock.c
95
src/sock.c
|
@ -130,6 +130,15 @@ void patty_ax25_sock_reset(patty_ax25_sock *sock) {
|
|||
sock->seq_recv = 0;
|
||||
}
|
||||
|
||||
void patty_ax25_sock_upgrade(patty_ax25_sock *sock) {
|
||||
sock->version = PATTY_AX25_2_2;
|
||||
sock->flags_hdlc = PATTY_AX25_SOCK_2_2_DEFAULT_HDLC;
|
||||
sock->n_maxlen_tx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
|
||||
sock->n_maxlen_rx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN;
|
||||
sock->n_window_tx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
|
||||
sock->n_window_rx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW;
|
||||
}
|
||||
|
||||
void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
|
||||
if (sock->fd) {
|
||||
if (sock->iface) {
|
||||
|
@ -144,6 +153,92 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
|
|||
free(sock);
|
||||
}
|
||||
|
||||
int patty_ax25_sock_params_set(patty_ax25_sock *sock,
|
||||
patty_ax25_params *params) {
|
||||
if (params->flags & PATTY_AX25_PARAM_CLASSES) {
|
||||
if (!(params->classes & PATTY_AX25_PARAM_CLASSES_ABM)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: Eventually support full duplex
|
||||
*/
|
||||
if (!(params->classes & PATTY_AX25_PARAM_CLASSES_HALF_DUPLEX)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
|
||||
if (params->classes & PATTY_AX25_PARAM_CLASSES_FULL_DUPLEX) {
|
||||
goto error_invalid;
|
||||
}
|
||||
}
|
||||
|
||||
if (params->flags & PATTY_AX25_PARAM_HDLC) {
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_REJ)) {
|
||||
sock->flags_hdlc &= ~PATTY_AX25_PARAM_HDLC_REJ;
|
||||
}
|
||||
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_SREJ)) {
|
||||
sock->flags_hdlc &= ~PATTY_AX25_PARAM_HDLC_SREJ;
|
||||
}
|
||||
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_XADDR)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_8)) {
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_128)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
} else {
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_128)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
|
||||
params->hdlc &= ~PATTY_AX25_PARAM_HDLC_MODULO_8;
|
||||
params->hdlc |= PATTY_AX25_PARAM_HDLC_MODULO_128;
|
||||
}
|
||||
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_TEST)) {
|
||||
params->hdlc &= ~PATTY_AX25_PARAM_HDLC_TEST;
|
||||
}
|
||||
|
||||
if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_SYNC_TX)) {
|
||||
goto error_invalid;
|
||||
}
|
||||
}
|
||||
|
||||
if (params->flags & PATTY_AX25_PARAM_INFO_RX) {
|
||||
if (sock->n_maxlen_tx > params->info_rx) {
|
||||
sock->n_maxlen_tx = params->info_rx;
|
||||
}
|
||||
}
|
||||
|
||||
if (params->flags & PATTY_AX25_PARAM_WINDOW_RX) {
|
||||
if (sock->n_window_tx > params->window_rx) {
|
||||
sock->n_window_tx = params->window_rx;
|
||||
}
|
||||
}
|
||||
|
||||
if (params->flags & PATTY_AX25_PARAM_ACK) {
|
||||
if (sock->n_ack < params->ack) {
|
||||
sock->n_ack = params->ack;
|
||||
}
|
||||
}
|
||||
|
||||
if (params->flags & PATTY_AX25_PARAM_RETRY) {
|
||||
if (sock->n_retry < params->retry) {
|
||||
sock->n_retry = params->retry;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error_invalid:
|
||||
errno = EINVAL;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int patty_ax25_sock_mode_set(patty_ax25_sock *sock,
|
||||
enum patty_ax25_sock_mode mode) {
|
||||
if (sock->mode == mode) {
|
||||
|
|
Loading…
Add table
Reference in a new issue