diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/Makefile.am | 3 | ||||
-rw-r--r-- | include/osmocom/Makefile.am | 1 | ||||
-rw-r--r-- | include/osmocom/mslookup/Makefile.am | 6 | ||||
-rw-r--r-- | include/osmocom/mslookup/mdns.h | 39 | ||||
-rw-r--r-- | include/osmocom/mslookup/mdns_msg.h | 54 | ||||
-rw-r--r-- | include/osmocom/mslookup/mdns_rfc.h | 113 | ||||
-rw-r--r-- | include/osmocom/mslookup/mdns_sock.h | 33 | ||||
-rw-r--r-- | include/osmocom/mslookup/mslookup_client_mdns.h | 38 |
8 files changed, 287 insertions, 0 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index e9a7126..9827950 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -2,7 +2,10 @@ SUBDIRS = osmocom nobase_include_HEADERS = \ osmocom/gsupclient/gsup_client.h \ + osmocom/mslookup/mdns.h \ + osmocom/mslookup/mdns_sock.h \ osmocom/mslookup/mslookup_client_fake.h \ osmocom/mslookup/mslookup_client.h \ + osmocom/mslookup/mslookup_client_mdns.h \ osmocom/mslookup/mslookup.h \ $(NULL) diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am index dbc2344..b75c86a 100644 --- a/include/osmocom/Makefile.am +++ b/include/osmocom/Makefile.am @@ -1,3 +1,4 @@ SUBDIRS = \ hlr \ + mslookup \ $(NULL) diff --git a/include/osmocom/mslookup/Makefile.am b/include/osmocom/mslookup/Makefile.am new file mode 100644 index 0000000..72ccd94 --- /dev/null +++ b/include/osmocom/mslookup/Makefile.am @@ -0,0 +1,6 @@ +# most headers here are installed, see /include/Makefile.am + +noinst_HEADERS = \ + mdns_msg.h \ + mdns_rfc.h \ + $(NULL) diff --git a/include/osmocom/mslookup/mdns.h b/include/osmocom/mslookup/mdns.h new file mode 100644 index 0000000..b62e95f --- /dev/null +++ b/include/osmocom/mslookup/mdns.h @@ -0,0 +1,39 @@ +/* Copyright 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +/*! \file mdns.h */ + +#pragma once + +#include <osmocom/core/msgb.h> +#include <osmocom/mslookup/mslookup.h> + +#define OSMO_MDNS_DOMAIN_SUFFIX_DEFAULT "mdns.osmocom.org" + +struct msgb *osmo_mdns_query_encode(void *ctx, uint16_t packet_id, const struct osmo_mslookup_query *query, + const char *domain_suffix); + +struct osmo_mslookup_query *osmo_mdns_query_decode(void *ctx, const uint8_t *data, size_t data_len, + uint16_t *packet_id, const char *domain_suffix); + +struct msgb *osmo_mdns_result_encode(void *ctx, uint16_t packet_id, const struct osmo_mslookup_query *query, + const struct osmo_mslookup_result *result, const char *domain_suffix); + +int osmo_mdns_result_decode(void *ctx, const uint8_t *data, size_t data_len, uint16_t *packet_id, + struct osmo_mslookup_query *query, struct osmo_mslookup_result *result, + const char *domain_suffix); diff --git a/include/osmocom/mslookup/mdns_msg.h b/include/osmocom/mslookup/mdns_msg.h new file mode 100644 index 0000000..ae7dd17 --- /dev/null +++ b/include/osmocom/mslookup/mdns_msg.h @@ -0,0 +1,54 @@ +/* Copyright 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include <stdint.h> +#include "mdns_rfc.h" + +struct osmo_mdns_record { + struct llist_head list; + enum osmo_mdns_rfc_record_type type; + uint16_t length; + uint8_t *data; +}; + +struct osmo_mdns_msg_request { + uint16_t id; + char *domain; + enum osmo_mdns_rfc_record_type type; +}; + +struct osmo_mdns_msg_answer { + uint16_t id; + char *domain; + /*! list of osmo_mdns_record. */ + struct llist_head records; +}; + +int osmo_mdns_msg_request_encode(void *ctx, struct msgb *msg, const struct osmo_mdns_msg_request *req); +struct osmo_mdns_msg_request *osmo_mdns_msg_request_decode(void *ctx, const uint8_t *data, size_t data_len); + +void osmo_mdns_msg_answer_init(struct osmo_mdns_msg_answer *answer); +int osmo_mdns_msg_answer_encode(void *ctx, struct msgb *msg, const struct osmo_mdns_msg_answer *ans); +struct osmo_mdns_msg_answer *osmo_mdns_msg_answer_decode(void *ctx, const uint8_t *data, size_t data_len); +int osmo_mdns_result_from_answer(struct osmo_mslookup_result *result, const struct osmo_mdns_msg_answer *ans); + +struct osmo_mdns_record *osmo_mdns_record_txt_keyval_encode(void *ctx, const char *key, const char *value_fmt, ...); +int osmo_mdns_record_txt_keyval_decode(const struct osmo_mdns_record *rec, + char *key_buf, size_t key_size, char *value_buf, size_t value_size); diff --git a/include/osmocom/mslookup/mdns_rfc.h b/include/osmocom/mslookup/mdns_rfc.h new file mode 100644 index 0000000..9d6be5a --- /dev/null +++ b/include/osmocom/mslookup/mdns_rfc.h @@ -0,0 +1,113 @@ +/* Copyright 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include <stdbool.h> +#include <stdint.h> +#include <osmocom/core/msgb.h> +#include <osmocom/core/endian.h> +#include <osmocom/mslookup/mdns.h> + +/* RFC 1035 2.3.4 */ +#define OSMO_MDNS_RFC_MAX_NAME_LEN 255 + +/* RFC 1035 3.3 <character-string> */ +#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); diff --git a/include/osmocom/mslookup/mdns_sock.h b/include/osmocom/mslookup/mdns_sock.h new file mode 100644 index 0000000..615e971 --- /dev/null +++ b/include/osmocom/mslookup/mdns_sock.h @@ -0,0 +1,33 @@ +/* Copyright 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#pragma once +#include <netdb.h> +#include <osmocom/core/msgb.h> +#include <osmocom/core/select.h> + +struct osmo_mdns_sock { + struct osmo_fd osmo_fd; + struct addrinfo *ai; +}; + +struct osmo_mdns_sock *osmo_mdns_sock_init(void *ctx, const char *ip, unsigned int port, + int (*cb)(struct osmo_fd *fd, unsigned int what), + void *data, unsigned int priv_nr); +int osmo_mdns_sock_send(const struct osmo_mdns_sock *mdns_sock, struct msgb *msg); +void osmo_mdns_sock_cleanup(struct osmo_mdns_sock *mdns_sock); diff --git a/include/osmocom/mslookup/mslookup_client_mdns.h b/include/osmocom/mslookup/mslookup_client_mdns.h new file mode 100644 index 0000000..e699107 --- /dev/null +++ b/include/osmocom/mslookup/mslookup_client_mdns.h @@ -0,0 +1,38 @@ +/* Copyright 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include <stdint.h> + +struct osmo_mslookup_client; +struct osmo_mslookup_client_method; + +/*! MS Lookup mDNS server bind default IP. Taken from the Administratevly Scoped block, particularly the Organizational + * Scoped range, https://tools.ietf.org/html/rfc2365 . */ +#define OSMO_MSLOOKUP_MDNS_IP4 "239.192.23.42" +#define OSMO_MSLOOKUP_MDNS_IP6 "ff08::23:42" // <-- TODO: sane? +#define OSMO_MSLOOKUP_MDNS_PORT 4266 + +struct osmo_mslookup_client_method *osmo_mslookup_client_add_mdns(struct osmo_mslookup_client *client, const char *ip, + uint16_t port, int initial_packet_id, + const char *domain_suffix); + +const struct osmo_sockaddr_str *osmo_mslookup_client_method_mdns_get_bind_addr(struct osmo_mslookup_client_method *dns_method); + +const char *osmo_mslookup_client_method_mdns_get_domain_suffix(struct osmo_mslookup_client_method *dns_method); |