File syn_dnssd.c¶
FileList > net > syn_dnssd.c
Go to the source code of this file
DNS-Based Service Discovery (DNS-SD - RFC 6763 / RFC 6762) implementation.
#include "syn_dnssd.h"#include "../port/syn_port_system.h"#include "../util/syn_assert.h"#include <stdio.h>#include <string.h>
Public Functions¶
| Type | Name |
|---|---|
| SYN_Status | syn_dnssd_announce (const SYN_DnsSd * sd, size_t service_index, uint8_t * resp_buf, size_t max_resp_len, size_t * resp_len) Format and send gratuitous multicast DNS-SD announcement (RFC 6762 §8.3). |
| SYN_PT_Status | syn_dnssd_browse_task (SYN_PT * pt, SYN_Task * task) Cooperative protothread coroutine for background DNS-SD browsing. |
| SYN_Status | syn_dnssd_browser_init (SYN_DnsSd_Browser * browser, const SYN_DnsSd * sd, const char * service_type, SYN_DnsSd_DiscoverCallback cb, void * user_data, uint32_t timeout_ms) Initialize and start a DNS-SD service browsing session. |
| SYN_Status | syn_dnssd_build_query (const char * service_type, uint8_t * query_buf, size_t max_len, size_t * query_len) Build an mDNS service discovery query (RFC 6762 / RFC 6763). |
| SYN_Status | syn_dnssd_discover (const SYN_DnsSd * sd, const char * service_type) Send an mDNS discovery query for a specific service type on multicast UDP. |
| SYN_Status | syn_dnssd_init (SYN_DnsSd * sd) Initialize DNS-SD daemon context. |
| SYN_Status | syn_dnssd_parse_response (const uint8_t * resp_buf, size_t resp_len, SYN_DnsSd_Discovered * out_disc) Parse an incoming mDNS response packet into a discovered service structure. |
| SYN_Status | syn_dnssd_process_query (const SYN_DnsSd * sd, const uint8_t * query_buf, size_t query_len, uint8_t * resp_buf, size_t max_resp_len, size_t * resp_len) Process an incoming mDNS / DNS-SD query packet and format response. |
| SYN_Status | syn_dnssd_register (SYN_DnsSd * sd, const SYN_DnsSd_Service * svc) Register a service for DNS-SD broadcast/discovery. |
| SYN_PT_Status | syn_dnssd_task (SYN_PT * pt, SYN_Task * task) Cooperative protothread task for responding to DNS-SD discovery queries. |
Public Static Functions¶
| Type | Name |
|---|---|
| bool | match_qname_service (const uint8_t * buf, size_t buf_len, size_t * offset, const char * service_type) Match DNS question name against registered service type. |
| SYN_Status | pack_service_response (const SYN_DnsSd_Service * svc, uint8_t * resp_buf, size_t max_resp_len, size_t * resp_len) Pack DNS-SD response packet for a service (PTR, SRV, TXT, A records). |
| void | skip_or_read_name (const uint8_t * buf, size_t buf_len, size_t * pos, char * out, size_t max_out) Helper to skip or extract a DNS domain name (handling pointers). |
| void | write_hostname_fqdn (uint8_t * buf, size_t * pos, const char * hostname) Write DNS hostname FQDN to buffer. |
| void | write_instance_fqdn (uint8_t * buf, size_t * pos, const char * instance, const char * service_type) Write DNS instance FQDN to buffer. |
| void | write_label (uint8_t * buf, size_t * pos, const char * str) Write DNS label with length prefix to buffer. |
| void | write_service_type_name (uint8_t * buf, size_t * pos, const char * service_type) Write DNS service type domain name to buffer. |
| void | write_u16 (uint8_t * buf, size_t * pos, uint16_t val) Write 16-bit big-endian integer to buffer. |
| void | write_u32 (uint8_t * buf, size_t * pos, uint32_t val) Write 32-bit big-endian integer to buffer. |
Macros¶
| Type | Name |
|---|---|
| define | DNSSD_MCAST_ADDR "224.0.0.251"Multicast DNS IPv4 address. |
| define | DNSSD_TTL_PTR 4500UDefault TTL for PTR records (75 minutes) |
| define | DNSSD_TTL_SRV 120UDefault TTL for SRV/A records (2 minutes) |
Public Functions Documentation¶
function syn_dnssd_announce¶
Format and send gratuitous multicast DNS-SD announcement (RFC 6762 §8.3).
SYN_Status syn_dnssd_announce (
const SYN_DnsSd * sd,
size_t service_index,
uint8_t * resp_buf,
size_t max_resp_len,
size_t * resp_len
)
Parameters:
sdDNS-SD context.service_indexIndex of service to announce.resp_buf[out] Buffer to receive formatted response packet.max_resp_lenCapacity of resp_buf.resp_len[out] Number of bytes written to resp_buf.
Returns:
SYN_OK on success, SYN_ERROR on invalid parameters or send failure.
function syn_dnssd_browse_task¶
Cooperative protothread coroutine for background DNS-SD browsing.
Yields until responses arrive or timeout expires. Parses incoming packets and invokes the discovery callback.
Parameters:
ptProtothread pointer.taskTask descriptor with user_data pointing to SYN_DnsSd_Browser.
Returns:
PT_WAITING while running, PT_EXITED when discovery timeout elapses.
function syn_dnssd_browser_init¶
Initialize and start a DNS-SD service browsing session.
SYN_Status syn_dnssd_browser_init (
SYN_DnsSd_Browser * browser,
const SYN_DnsSd * sd,
const char * service_type,
SYN_DnsSd_DiscoverCallback cb,
void * user_data,
uint32_t timeout_ms
)
Transmits the initial multicast PTR query and arms the browser context.
Parameters:
browserBrowser context instance.sdInitialized DNS-SD daemon instance (provides socket).service_typeService type to search for (e.g. "_http._tcp", "_coap._udp").cbCallback invoked whenever a valid response is received.user_dataOptional user context pointer.timeout_msMaximum time in ms to listen for discovery responses.
Returns:
SYN_OK on success, SYN_ERROR on invalid parameters.
function syn_dnssd_build_query¶
Build an mDNS service discovery query (RFC 6762 / RFC 6763).
SYN_Status syn_dnssd_build_query (
const char * service_type,
uint8_t * query_buf,
size_t max_len,
size_t * query_len
)
Formats a standard PTR query for _service._proto.local.
Parameters:
service_typeService type to search for (e.g. "_http._tcp", "_coap._udp").query_buf[out] Output buffer for DNS query packet.max_lenCapacity of query_buf.query_len[out] Written length of query packet.
Returns:
SYN_OK on success, SYN_ERROR on buffer overflow or invalid arguments.
function syn_dnssd_discover¶
Send an mDNS discovery query for a specific service type on multicast UDP.
Parameters:
sdDNS-SD context containing open multicast socket.service_typeService type to query for (e.g. "_http._tcp").
Returns:
SYN_OK on successful multicast transmit, SYN_ERROR otherwise.
function syn_dnssd_init¶
Initialize DNS-SD daemon context.
Parameters:
sdDNS-SD instance.
Returns:
SYN_OK on success, SYN_ERROR on socket/multicast error.
function syn_dnssd_parse_response¶
Parse an incoming mDNS response packet into a discovered service structure.
SYN_Status syn_dnssd_parse_response (
const uint8_t * resp_buf,
size_t resp_len,
SYN_DnsSd_Discovered * out_disc
)
Parameters:
resp_bufBuffer containing raw DNS response.resp_lenLength of raw DNS response.out_disc[out] Structure to receive parsed service attributes.
Returns:
SYN_OK if successfully parsed, SYN_ERROR otherwise.
function syn_dnssd_process_query¶
Process an incoming mDNS / DNS-SD query packet and format response.
SYN_Status syn_dnssd_process_query (
const SYN_DnsSd * sd,
const uint8_t * query_buf,
size_t query_len,
uint8_t * resp_buf,
size_t max_resp_len,
size_t * resp_len
)
Parameters:
sdDNS-SD context containing registered services.query_bufIncoming raw DNS packet.query_lenQuery packet byte length.resp_buf[out] Buffer to receive formatted response packet.max_resp_lenCapacity of resp_buf.resp_len[out] Number of bytes written to resp_buf.
Returns:
SYN_OK if query matched and response generated, SYN_ERROR/SYN_NOT_FOUND otherwise.
function syn_dnssd_register¶
Register a service for DNS-SD broadcast/discovery.
Parameters:
sdDNS-SD instance.svcService configuration to register.
Returns:
SYN_OK on success, SYN_ERROR if table is full or invalid parameters.
function syn_dnssd_task¶
Cooperative protothread task for responding to DNS-SD discovery queries.
Parameters:
ptProtothread pointer.taskTask structure with user_data pointing to SYN_DnsSd instance.
Returns:
PT_WAITING while running, PT_EXITED when done.
Public Static Functions Documentation¶
function match_qname_service¶
Match DNS question name against registered service type.
static bool match_qname_service (
const uint8_t * buf,
size_t buf_len,
size_t * offset,
const char * service_type
)
Parameters:
bufInput buffer containing DNS question.buf_lenTotal buffer length.offsetOffset within buffer.service_typeExpected service type.
Returns:
True if question matches service type, false otherwise.
function pack_service_response¶
Pack DNS-SD response packet for a service (PTR, SRV, TXT, A records).
static SYN_Status pack_service_response (
const SYN_DnsSd_Service * svc,
uint8_t * resp_buf,
size_t max_resp_len,
size_t * resp_len
)
Parameters:
svcService definition.resp_bufBuffer to receive response packet.max_resp_lenCapacity of resp_buf.resp_lenBytes written.
Returns:
SYN_OK on success, SYN_ERROR on buffer overflow.
function skip_or_read_name¶
Helper to skip or extract a DNS domain name (handling pointers).
static void skip_or_read_name (
const uint8_t * buf,
size_t buf_len,
size_t * pos,
char * out,
size_t max_out
)
Parameters:
bufInput buffer containing DNS packet.buf_lenTotal buffer length.posOffset within buffer.outOutput string buffer (or NULL to skip).max_outMaximum capacity of out buffer.
function write_hostname_fqdn¶
Write DNS hostname FQDN to buffer.
Parameters:
bufOutput buffer.posCurrent buffer offset.hostnameHostname string.
function write_instance_fqdn¶
Write DNS instance FQDN to buffer.
static void write_instance_fqdn (
uint8_t * buf,
size_t * pos,
const char * instance,
const char * service_type
)
Parameters:
bufOutput buffer.posCurrent buffer offset.instanceInstance name.service_typeService type.
function write_label¶
Write DNS label with length prefix to buffer.
Parameters:
bufOutput buffer.posCurrent buffer offset.strLabel string.
function write_service_type_name¶
Write DNS service type domain name to buffer.
Parameters:
bufOutput buffer.posCurrent buffer offset.service_typeService type string.
function write_u16¶
Write 16-bit big-endian integer to buffer.
Parameters:
bufOutput buffer.posCurrent buffer offset.valValue to write.
function write_u32¶
Write 32-bit big-endian integer to buffer.
Parameters:
bufOutput buffer.posCurrent buffer offset.valValue to write.
Macro Definition Documentation¶
define DNSSD_MCAST_ADDR¶
Multicast DNS IPv4 address.
define DNSSD_TTL_PTR¶
Default TTL for PTR records (75 minutes)
define DNSSD_TTL_SRV¶
Default TTL for SRV/A records (2 minutes)
The documentation for this class was generated from the following file src/syntropic/net/syn_dnssd.c