#include #include #include #include patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_type type) { patty_ax25_sock *sock; if ((sock = malloc(sizeof(*sock))) == NULL) { goto error_malloc_sock; } memset(sock, '\0', sizeof(*sock)); sock->status = PATTY_AX25_SOCK_CLOSED; sock->mode = PATTY_AX25_SOCK_DM; sock->type = type; sock->n_maxlen = PATTY_AX25_FRAME_DEFAULT_MAXLEN; sock->n_window = PATTY_AX25_FRAME_DEFAULT_WINDOW; return sock; error_malloc_sock: return NULL; } void patty_ax25_sock_destroy(patty_ax25_sock *sock) { free(sock); } static size_t copy_addr_to_buf(patty_ax25_sock *sock, uint8_t *buf, size_t offset) { size_t i; memcpy(&buf[offset], &sock->remote, sizeof(patty_ax25_addr)); offset += sizeof(patty_ax25_addr); memcpy(&buf[offset], &sock->local, sizeof(patty_ax25_addr)); offset += sizeof(patty_ax25_addr); for (i=0; ihops; i++) { memcpy(&buf[offset], &sock->repeaters[i], sizeof(patty_ax25_addr)); offset += sizeof(patty_ax25_addr); if (i == sock->hops - 1) { buf[offset - 1] |= 0x01; } } return offset; } int patty_ax25_sock_send_sabm(patty_ax25_sock *sock) { size_t offset = 0; uint8_t *buf = (uint8_t *)(sock->iface->tx_buf); offset = copy_addr_to_buf(sock, buf, offset); buf[offset++] = PATTY_AX25_PROTO_NONE; buf[offset++] = 0x3f; return patty_ax25_if_send(sock->iface, buf, offset); }