Skip to content

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 4500U
Default TTL for PTR records (75 minutes)
define DNSSD_TTL_SRV 120U
Default 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:

  • sd DNS-SD context.
  • service_index Index of service to announce.
  • resp_buf [out] Buffer to receive formatted response packet.
  • max_resp_len Capacity 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.

SYN_PT_Status syn_dnssd_browse_task (
    SYN_PT * pt,
    SYN_Task * task
) 

Yields until responses arrive or timeout expires. Parses incoming packets and invokes the discovery callback.

Parameters:

  • pt Protothread pointer.
  • task Task 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:

  • browser Browser context instance.
  • sd Initialized DNS-SD daemon instance (provides socket).
  • service_type Service type to search for (e.g. "_http._tcp", "_coap._udp").
  • cb Callback invoked whenever a valid response is received.
  • user_data Optional user context pointer.
  • timeout_ms Maximum 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_type Service type to search for (e.g. "_http._tcp", "_coap._udp").
  • query_buf [out] Output buffer for DNS query packet.
  • max_len Capacity 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.

SYN_Status syn_dnssd_discover (
    const SYN_DnsSd * sd,
    const char * service_type
) 

Parameters:

  • sd DNS-SD context containing open multicast socket.
  • service_type Service 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.

SYN_Status syn_dnssd_init (
    SYN_DnsSd * sd
) 

Parameters:

  • sd DNS-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_buf Buffer containing raw DNS response.
  • resp_len Length 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:

  • sd DNS-SD context containing registered services.
  • query_buf Incoming raw DNS packet.
  • query_len Query packet byte length.
  • resp_buf [out] Buffer to receive formatted response packet.
  • max_resp_len Capacity 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.

SYN_Status syn_dnssd_register (
    SYN_DnsSd * sd,
    const SYN_DnsSd_Service * svc
) 

Parameters:

  • sd DNS-SD instance.
  • svc Service 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.

SYN_PT_Status syn_dnssd_task (
    SYN_PT * pt,
    SYN_Task * task
) 

Parameters:

  • pt Protothread pointer.
  • task Task 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:

  • buf Input buffer containing DNS question.
  • buf_len Total buffer length.
  • offset Offset within buffer.
  • service_type Expected 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:

  • svc Service definition.
  • resp_buf Buffer to receive response packet.
  • max_resp_len Capacity of resp_buf.
  • resp_len Bytes 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:

  • buf Input buffer containing DNS packet.
  • buf_len Total buffer length.
  • pos Offset within buffer.
  • out Output string buffer (or NULL to skip).
  • max_out Maximum capacity of out buffer.

function write_hostname_fqdn

Write DNS hostname FQDN to buffer.

static void write_hostname_fqdn (
    uint8_t * buf,
    size_t * pos,
    const char * hostname
) 

Parameters:

  • buf Output buffer.
  • pos Current buffer offset.
  • hostname Hostname 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:

  • buf Output buffer.
  • pos Current buffer offset.
  • instance Instance name.
  • service_type Service type.

function write_label

Write DNS label with length prefix to buffer.

static void write_label (
    uint8_t * buf,
    size_t * pos,
    const char * str
) 

Parameters:

  • buf Output buffer.
  • pos Current buffer offset.
  • str Label string.

function write_service_type_name

Write DNS service type domain name to buffer.

static void write_service_type_name (
    uint8_t * buf,
    size_t * pos,
    const char * service_type
) 

Parameters:

  • buf Output buffer.
  • pos Current buffer offset.
  • service_type Service type string.

function write_u16

Write 16-bit big-endian integer to buffer.

static void write_u16 (
    uint8_t * buf,
    size_t * pos,
    uint16_t val
) 

Parameters:

  • buf Output buffer.
  • pos Current buffer offset.
  • val Value to write.

function write_u32

Write 32-bit big-endian integer to buffer.

static void write_u32 (
    uint8_t * buf,
    size_t * pos,
    uint32_t val
) 

Parameters:

  • buf Output buffer.
  • pos Current buffer offset.
  • val Value to write.

Macro Definition Documentation

define DNSSD_MCAST_ADDR

Multicast DNS IPv4 address.

#define DNSSD_MCAST_ADDR `"224.0.0.251"`


define DNSSD_TTL_PTR

Default TTL for PTR records (75 minutes)

#define DNSSD_TTL_PTR `4500U`


define DNSSD_TTL_SRV

Default TTL for SRV/A records (2 minutes)

#define DNSSD_TTL_SRV `120U`



The documentation for this class was generated from the following file src/syntropic/net/syn_dnssd.c