/* Copyright 2019 by sysmocom s.f.m.c. GmbH * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #pragma once #include #include #include #include #include /* RFC 1035 2.3.4 */ #define OSMO_MDNS_RFC_MAX_NAME_LEN 255 /* RFC 1035 3.3 */ #define OSMO_MDNS_RFC_MAX_CHARACTER_STRING_LEN 256 enum osmo_mdns_rfc_record_type { OSMO_MDNS_RFC_RECORD_TYPE_UNKNOWN = 0, /* RFC 1035 3.2.2 */ OSMO_MDNS_RFC_RECORD_TYPE_A = 1, /* IPv4 address */ OSMO_MDNS_RFC_RECORD_TYPE_TXT = 16, /* Text strings */ /* RFC 3596 2.1 */ OSMO_MDNS_RFC_RECORD_TYPE_AAAA = 28, /* IPv6 address */ /* RFC 1035 3.2.3 */ OSMO_MDNS_RFC_RECORD_TYPE_ALL = 255, /* Request only: ask for all */ }; enum osmo_mdns_rfc_class { OSMO_MDNS_RFC_CLASS_UNKNOWN = 0, /* RFC 1035 3.2.4 */ OSMO_MDNS_RFC_CLASS_IN = 1, /* Internet and IP networks */ /* RFC 1035 3.2.5 */ OSMO_MDNS_RFC_CLASS_ALL = 255, /* Request only: ask for all */ }; /* RFC 1035 4.1.1 */ struct osmo_mdns_rfc_header { #if OSMO_IS_LITTLE_ENDIAN uint16_t id; uint8_t rd:1, tc:1, aa:1, opcode:4, qr:1; /* QR (0: query, 1: response) */ uint8_t rcode:4, z:3, ra:1; uint16_t qdcount; /* Number of questions */ uint16_t ancount; /* Number of answers */ uint16_t nscount; /* Number of authority records */ uint16_t arcount; /* Number of additional records */ #elif OSMO_IS_BIG_ENDIAN /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ uint16_t id; uint8_t qr:1, opcode:4, aa:1, tc:1, rd:1; uint8_t ra:1, z:3, rcode:4; uint16_t qdcount; uint16_t ancount; uint16_t nscount; uint16_t arcount; #endif } __attribute__ ((packed)); /* RFC 1035 4.1.2 */ struct osmo_mdns_rfc_question { char *domain; /* Domain to be encoded as qname (e.g. "gsup.hlr.1234567.imsi") */ enum osmo_mdns_rfc_record_type qtype; enum osmo_mdns_rfc_class qclass; }; /* RFC 1035 4.1.3 */ struct osmo_mdns_rfc_record { char *domain; /* Domain to be encoded as name (e.g. "gsup.hlr.1234567.imsi") */ enum osmo_mdns_rfc_record_type type; enum osmo_mdns_rfc_class class; uint32_t ttl; uint16_t rdlength; uint8_t *rdata; }; char *osmo_mdns_rfc_qname_encode(void *ctx, const char *domain); char *osmo_mdns_rfc_qname_decode(void *ctx, const char *qname, size_t qname_len); void osmo_mdns_rfc_header_encode(struct msgb *msg, const struct osmo_mdns_rfc_header *hdr); int osmo_mdns_rfc_header_decode(const uint8_t *data, size_t data_len, struct osmo_mdns_rfc_header *hdr); int osmo_mdns_rfc_question_encode(void *ctx, struct msgb *msg, const struct osmo_mdns_rfc_question *qst); struct osmo_mdns_rfc_question *osmo_mdns_rfc_question_decode(void *ctx, const uint8_t *data, size_t data_len); int osmo_mdns_rfc_record_encode(void *ctx, struct msgb *msg, const struct osmo_mdns_rfc_record *rec); struct osmo_mdns_rfc_record *osmo_mdns_rfc_record_decode(void *ctx, const uint8_t *data, size_t data_len, size_t *record_len);