diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 3c04393..a2dde53 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -121,6 +121,8 @@ ssize_t patty_ax25_sock_send_sabme(patty_ax25_sock *sock, int pf); ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int pf); +ssize_t patty_ax25_sock_send_xid(patty_ax25_sock *sock); + ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, void *buf, size_t len); diff --git a/src/sock.c b/src/sock.c index e2178c5..1abbfaf 100644 --- a/src/sock.c +++ b/src/sock.c @@ -377,6 +377,63 @@ ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int pf) { 0); } +ssize_t patty_ax25_sock_send_xid(patty_ax25_sock *sock) { + patty_ax25_params params; + ssize_t encoded; + + if (sock->remote.callsign[0] == '\0') { + goto error_nopeer; + } + + params.flags = PATTY_AX25_PARAM_CLASSES + | PATTY_AX25_PARAM_HDLC + | PATTY_AX25_PARAM_INFO_TX + | PATTY_AX25_PARAM_INFO_RX + | PATTY_AX25_PARAM_WINDOW_TX + | PATTY_AX25_PARAM_WINDOW_RX + | PATTY_AX25_PARAM_ACK + | PATTY_AX25_PARAM_RETRY; + + /* + * TODO: This value needs to come from the interface this socket is bound + * to + */ + params.classes = PATTY_AX25_PARAM_CLASSES_ABM + | PATTY_AX25_PARAM_CLASSES_HALF_DUPLEX; + + /* + * TODO: These flags should be part of each sock object + */ + params.hdlc = PATTY_AX25_PARAM_HDLC_REJ + | PATTY_AX25_PARAM_HDLC_SREJ + | PATTY_AX25_PARAM_HDLC_XADDR + | PATTY_AX25_PARAM_HDLC_MODULO_128 + | PATTY_AX25_PARAM_HDLC_SYNC_TX; + + params.info_tx = sock->n_maxlen_tx; + params.info_rx = sock->n_maxlen_rx; + params.window_tx = sock->n_window_tx; + params.window_rx = sock->n_window_rx; + params.ack = sock->n_ack; + params.retry = sock->n_retry; + + if ((encoded = patty_ax25_frame_encode_xid(¶ms, + sock->buf, + sock->n_maxlen_tx)) < 0) { + goto error_frame_encode_xid; + } + + return patty_ax25_sock_send(sock, + PATTY_AX25_FRAME_COMMAND, + control_u(PATTY_AX25_FRAME_XID, 0), + sock->buf, + encoded); + +error_nopeer: +error_frame_encode_xid: + return -1; +} + ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, void *buf, size_t len) {