static void send_ptr_record(struct mdns_state *ms, const char *domain, int service) { struct pbuf *hdr = populate_header(1, 0, 3); uint16_t first_ptr = htons(DATA_POINTER | hdr->len); //PTR Record int service_len = strlen(ms->service_host); char service_name[service_len + 2]; strcpy(service_name, ms->service_host); memcpy(&service_name[service_len], &first_ptr, sizeof(first_ptr)); uint16_t srv_ptr = populate_record(domain, QTYPE_PTR, QCLASS_IN, TTL, service_name, sizeof(service_name), hdr); //SRV Record char buf[sizeof(struct srv_record) + service_len + dotlocal_len]; struct srv_record *srv_rec = (struct srv_record *) buf; srv_rec->priority = htons(50); srv_rec->weight = htons(0); srv_rec->port = htons(ms->services[service].port); memcpy(srv_rec->target, ms->service_host, service_len); memcpy(srv_rec->target + service_len, dotlocal, dotlocal_len); uint16_t arec_ptr = populate_record((char *)&srv_ptr, QTYPE_SRV, QCLASS_IN, TTL, buf, sizeof(buf), hdr); arec_ptr = htons(ntohs(arec_ptr) + sizeof(struct srv_record)); //TXT Record populate_record((char *) &srv_ptr, QTYPE_TXT, QCLASS_IN, TTL, ms->txt_records, strlen(ms->txt_records) + 1, hdr); //A Record populate_record((char *) &srv_ptr, QTYPE_A, QCLASS_IN, TTL, &ms->netif->ip_addr, sizeof(ms->netif->ip_addr), hdr); udp_send(ms->sendpcb, hdr); LWIP_DEBUGF(MDNS_DEBUG | LWIP_DBG_STATE, ("mdns: sending PTR response\n")); pbuf_free(hdr); }
static void send_a_record(struct mdns_state *ms, const char *name) { struct pbuf *hdr = populate_header(1, 0, 0); populate_record(name, QTYPE_A, QCLASS_IN, TTL, &ms->netif->ip_addr, sizeof(ms->netif->ip_addr), hdr); udp_send(ms->sendpcb, hdr); LWIP_DEBUGF(MDNS_DEBUG | LWIP_DBG_STATE, ("mdns: sending A response\n")); pbuf_free(hdr); }
void mdns_announce() { struct mdns_state *ms = &mdns_state; int count = sizeof(ms->hostnames) / sizeof(*ms->hostnames); struct pbuf *hdr = populate_header(count, 0, 0); for (int i = 0; i < count; i++) { populate_record(ms->hostnames[i], QTYPE_A, QCLASS_IN | CACHE_FLUSH, TTL, &ms->netif->ip_addr, sizeof(ms->netif->ip_addr), hdr); } udp_send(ms->sendpcb, hdr); LWIP_DEBUGF(MDNS_DEBUG | LWIP_DBG_STATE, ("mdns: sending announcment\n")); pbuf_free(hdr); }
static void send_rev_record(struct mdns_state *ms, const char *domain) { struct pbuf *hdr = populate_header(1, 0, 0); int service_len = strlen(ms->service_host); char service_name[service_len + dotlocal_len]; strcpy(service_name, ms->service_host); strcat(service_name, dotlocal); populate_record(domain, QTYPE_PTR, QCLASS_IN, TTL, service_name, sizeof(service_name), hdr); udp_send(ms->sendpcb, hdr); LWIP_DEBUGF(MDNS_DEBUG | LWIP_DBG_STATE, ("mdns: sending REV PTR response\n")); pbuf_free(hdr); }
/* * Append the DRTT to the payload * and send packet. The kernel will * attach the timestamp along the way. */ void send_cntp_packet() { unsigned char *pkt = malloc(C_HLEN + TIMESTAMP_LEN); memset(pkt, 0, C_HLEN + TIMESTAMP_LEN); struct sockaddr_ll sk; int send_sock_fd = create_sending_socket(globals.sender_inf, &sk); populate_header(globals.dest_node, globals.dest_node, globals.src_node, CNTP_PORT, &pkt); struct timestamp *drtt_st = (struct timestamp *)(pkt + C_HLEN); drtt_st->sec = 0; drtt_st->fsec = atoi(globals.drtt); send_packet(send_sock_fd, &sk, pkt, C_HLEN + TIMESTAMP_LEN); print_drtt_packet_net(pkt); print_timestamp((struct timestamp*)(pkt + C_HLEN)); }
static void send_all_services(struct mdns_state *ms, const char *name) { struct pbuf *hdr = populate_header(ms->num_services, 0, 0); uint16_t first_ptr = htons(DATA_POINTER | hdr->len); for (int i = 0; i < ms->num_services; i++) { if (i != 0) name = (char *) &first_ptr; populate_record(name, QTYPE_PTR, QCLASS_IN, TTL, ms->services[i].name, strlen(ms->services[i].name)+1, hdr); } udp_send(ms->sendpcb, hdr); LWIP_DEBUGF(MDNS_DEBUG | LWIP_DBG_STATE, ("mdns: sending ALL response\n")); pbuf_free(hdr); }