patty/src/ax25.c

109 lines
2.2 KiB
C
Raw Normal View History

2015-07-20 23:21:45 -05:00
#include <stdlib.h>
2015-07-20 22:33:59 -05:00
#include <string.h>
2015-07-20 23:21:45 -05:00
#include <errno.h>
#include <sys/select.h>
2015-07-20 22:33:59 -05:00
#include <patty/ax25.h>
2020-06-07 02:46:12 -04:00
int patty_ax25_pton(const char *callsign,
uint8_t ssid,
patty_ax25_addr *addr) {
int i,
end = 0;
for (i=0; i<PATTY_AX25_CALLSIGN_LEN; i++) {
if (callsign[i] == '\0') {
if (i == 0) {
errno = EINVAL;
goto error_invalid_callsign;
}
end = 1;
} else {
if (!PATTY_AX25_ADDR_CHAR_VALID(callsign[i])) {
2020-06-07 02:46:12 -04:00
errno = EINVAL;
goto error_invalid_callsign;
}
}
addr->callsign[i] = ((end? ' ': callsign[i]) & 0x7f) << 1;
}
addr->ssid = (ssid & 0x0f) << 1;
return 0;
error_invalid_callsign:
return -1;
}
int patty_ax25_ntop(const patty_ax25_addr *addr,
char *dest,
uint8_t *ssid,
size_t len) {
int i, o, space = 0;
if (addr == NULL || dest == NULL || ssid == NULL) {
errno = EINVAL;
goto error_invalid_args;
}
for (i=0, o=0; i<PATTY_AX25_CALLSIGN_LEN; i++) {
uint8_t c;
if (o == len) {
break;
}
if (PATTY_AX25_ADDR_OCTET_LAST(addr->callsign[i])) {
2020-06-07 02:46:12 -04:00
errno = EINVAL;
goto error_invalid_args;
}
c = (addr->callsign[i] & 0xfe) >> 1;
if (!PATTY_AX25_ADDR_CHAR_VALID(c)) {
2020-06-07 02:46:12 -04:00
errno = EINVAL;
goto error_invalid_args;
} else if (c == ' ' && !space) {
space = 1;
2020-06-07 03:07:18 -04:00
} else if (c != ' ' && space) {
2020-06-07 02:46:12 -04:00
errno = EINVAL;
goto error_invalid_args;
}
2020-06-07 03:07:18 -04:00
dest[o++] = space? '\0': c;
2020-06-07 02:46:12 -04:00
}
dest[o] = '\0';
*ssid = (addr->ssid & 0x1e) >> 1;
return 0;
error_invalid_args:
return -1;
}
2020-06-25 20:37:12 -04:00
static inline void hash_byte(uint32_t *hash, uint8_t c) {
*hash += c;
*hash += (*hash << 10);
*hash ^= (*hash >> 6);
}
void patty_ax25_addr_hash(uint32_t *hash, const patty_ax25_addr *addr) {
size_t i;
for (i=0; i<PATTY_AX25_CALLSIGN_LEN; i++) {
hash_byte(hash, addr->callsign[i] >> 1);
}
hash_byte(hash, PATTY_AX25_ADDR_SSID_NUMBER(addr->ssid));
2020-06-25 20:37:12 -04:00
}