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);
}
Exemplo n.º 5
0
/*
 * 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);

}