#include #include #include #include #include int patty_ax25_pton(const char *callsign, uint8_t ssid, patty_ax25_addr *addr) { int i, end = 0; for (i=0; icallsign[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; icallsign[i])) { errno = EINVAL; goto error_invalid_args; } c = (addr->callsign[i] & 0xfe) >> 1; if (!PATTY_AX25_ADDR_CHAR_VALID(c)) { errno = EINVAL; goto error_invalid_args; } else if (c == ' ' && !space) { space = 1; } else if (c != ' ' && space) { errno = EINVAL; goto error_invalid_args; } dest[o++] = space? '\0': c; } dest[o] = '\0'; *ssid = (addr->ssid & 0x1e) >> 1; return 0; error_invalid_args: return -1; } 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; icallsign[i] >> 1); } hash_byte(hash, PATTY_AX25_ADDR_SSID_NUMBER(addr->ssid)); }