65 lines
1.6 KiB
C
65 lines
1.6 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include <patty/ax25.h>
|
|
|
|
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);
|
|
buf[offset-1] &= ~1;
|
|
|
|
memcpy(&buf[offset], &sock->local, sizeof(patty_ax25_addr));
|
|
offset += sizeof(patty_ax25_addr);
|
|
buf[offset-1] &= ~1;
|
|
|
|
for (i=0; i<sock->hops; i++) {
|
|
memcpy(&buf[offset], &sock->repeaters[i], sizeof(patty_ax25_addr));
|
|
offset += sizeof(patty_ax25_addr);
|
|
}
|
|
|
|
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++] = 0x3f;
|
|
buf[offset++] = PATTY_AX25_PROTO_NONE;
|
|
|
|
return patty_ax25_if_send(sock->iface,
|
|
buf,
|
|
offset);
|
|
}
|