From 0489132d8e1e570fec0b2f6f82b39bf3a8f50cb1 Mon Sep 17 00:00:00 2001 From: Dan Staples Date: Wed, 2 Apr 2014 14:39:54 -0400 Subject: [PATCH 1/2] remove periodic mDNS querying --- lib/dnssd/src/NetworkInterfaces.c | 107 +++---------------------- lib/dnssd/src/NetworkInterfaces.h | 5 -- lib/dnssd/src/dnssd.c | 126 +----------------------------- lib/dnssd/src/dnssd.h | 1 - 4 files changed, 11 insertions(+), 228 deletions(-) diff --git a/lib/dnssd/src/NetworkInterfaces.c b/lib/dnssd/src/NetworkInterfaces.c index 8be2b5fc..e37b1c19 100644 --- a/lib/dnssd/src/NetworkInterfaces.c +++ b/lib/dnssd/src/NetworkInterfaces.c @@ -76,66 +76,9 @@ /* List of network interface objects used by BMF plugin */ -struct DnssdInterface *OlsrInterfaces = NULL; struct DnssdInterface *nonOlsrInterfaces = NULL; struct DnssdInterface *lastNonOlsrInterface = NULL; -int CreateIPSocket(const char *ifName) -{ - int skfd; - const int off = 0, ttl = 255; - struct sockaddr_in addr; - struct ifreq ifr; - - skfd = socket(AF_INET, SOCK_DGRAM, 0); - if (skfd < 0) { - P2pdPError("socket error"); - return -1; - } - - // Turn off IP_MULTICAST_LOOP, so packet isn't captured and sent over olsr - if (setsockopt (skfd, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof (off)) < 0) { - P2pdPError("setsockopt(IP_MULTICAST_LOOP) error"); - close(skfd); - return -1; - } - - if (setsockopt (skfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof (ttl)) < 0) { - P2pdPError("setsockopt(IP_MULTICAST_TTL) error"); - close(skfd); - return -1; - } - - // Get IP address of interface - memset(&ifr, 0, sizeof(struct ifreq)); - memcpy(ifr.ifr_name,ifName,IFNAMSIZ); - ifr.ifr_name[IFNAMSIZ] = '\0'; - if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0) { - P2pdPError("ioctl(SIOCGIFADDR) error"); - close(skfd); - return -1; - } - - // Bind socket to interface - if (setsockopt (skfd, IPPROTO_IP, IP_MULTICAST_IF, &((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr.s_addr, sizeof(struct in_addr)) < 0) { - P2pdPError("setsockopt(IP_MULTICAST_IF) error"); - close(skfd); - return -1; - } - - memset(&addr, 0, sizeof(struct sockaddr_in)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - - if (bind(skfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - P2pdPError("bind() error"); - close(skfd); - return -1; - } - - return skfd; -} - /* ------------------------------------------------------------------------- * Function : CreateEncapsulationSocket * Description: Create socket for forwarding captured multicast IP traffic @@ -289,7 +232,6 @@ CreateInterface(const char *ifName, struct in_addr *addr, struct interface *olsr int capturingSkfd = -1; int encapsulatingSkfd = -1; int listeningSkfd = -1; - int ipSkfd = -1; int ioctlSkfd; struct ifreq ifr; int nOpened = 0; @@ -324,26 +266,10 @@ CreateInterface(const char *ifName, struct in_addr *addr, struct interface *olsr } nOpened++; } - - /* Create IP socket for sending mDNS queries, in order to prompt Avahi - * to periodically send out announcements */ - if (olsrIntf) { - ipSkfd = CreateIPSocket(ifName); - if (ipSkfd < 0) { - close(encapsulatingSkfd); - close(capturingSkfd); - return 0; - } - nOpened++; - } /* For ioctl operations on the network interface, use either capturingSkfd * or encapsulatingSkfd, whichever is available */ - if (olsrIntf) { - ioctlSkfd = ipSkfd; - } else { - ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; - } + ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; /* Retrieve the MAC address of the interface. */ memset(&ifr, 0, sizeof(struct ifreq)); @@ -361,7 +287,6 @@ CreateInterface(const char *ifName, struct in_addr *addr, struct interface *olsr newIf->capturingSkfd = capturingSkfd; newIf->encapsulatingSkfd = encapsulatingSkfd; newIf->listeningSkfd = listeningSkfd; - newIf->ipSkfd = ipSkfd; memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); memcpy(newIf->ifName, ifName, IFNAMSIZ); newIf->olsrIntf = olsrIntf; @@ -402,28 +327,16 @@ CreateInterface(const char *ifName, struct in_addr *addr, struct interface *olsr /* Add new DnssdInterface object to global list. OLSR interfaces are * added at the front of the list, non-OLSR interfaces at the back. */ - if (olsrIntf == NULL) { - if (nonOlsrInterfaces == NULL) { - /* First DnssdInterface object in list */ - newIf->next = NULL; - nonOlsrInterfaces = newIf; - lastNonOlsrInterface = newIf; - } else { - /* Add new DnssdInterface object at back of list */ - newIf->next = NULL; - lastNonOlsrInterface->next = newIf; - lastNonOlsrInterface = newIf; - } + if (nonOlsrInterfaces == NULL) { + /* First DnssdInterface object in list */ + newIf->next = NULL; + nonOlsrInterfaces = newIf; + lastNonOlsrInterface = newIf; } else { - if (OlsrInterfaces == NULL) { - /* First DnssdInterface object in list */ - newIf->next = NULL; - OlsrInterfaces = newIf; - } else { - /* Add new DnssdInterface object at front of list */ - newIf->next = OlsrInterfaces; - OlsrInterfaces = newIf; - } + /* Add new DnssdInterface object at back of list */ + newIf->next = NULL; + lastNonOlsrInterface->next = newIf; + lastNonOlsrInterface = newIf; } OLSR_PRINTF( diff --git a/lib/dnssd/src/NetworkInterfaces.h b/lib/dnssd/src/NetworkInterfaces.h index 8c863079..05319469 100644 --- a/lib/dnssd/src/NetworkInterfaces.h +++ b/lib/dnssd/src/NetworkInterfaces.h @@ -63,10 +63,6 @@ struct DnssdInterface { /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */ int encapsulatingSkfd; - - /* IP socket for sending mDNS queries, in order to prompt Avahi - * to periodically send out announcements */ - int ipSkfd; /* File descriptor of UDP packet socket, used for listening to encapsulation packets. * Used only when PlParam "P2pdMechanism" is set to "UnicastPromiscuous". */ @@ -154,7 +150,6 @@ void AddMulticastRoute(void); void DeleteMulticastRoute(void); int CreateEncapsulationSocket(const char *ifName); int CreateCaptureSocket(const char *ifName); -int CreateIPSocket(const char *ifName); #endif /* _BMF_NETWORKINTERFACES_H */ diff --git a/lib/dnssd/src/dnssd.c b/lib/dnssd/src/dnssd.c index 8f94c6d8..c8f45682 100644 --- a/lib/dnssd/src/dnssd.c +++ b/lib/dnssd/src/dnssd.c @@ -1203,7 +1203,7 @@ InitP2pd(struct interface *skipThisIntf) //Creates captures sockets and register them to the OLSR scheduler CreateNonOlsrNetworkInterfaces(skipThisIntf); - AddInterface(olsr_cnf->interfaces->interf); +// AddInterface(olsr_cnf->interfaces->interf); olsr_start_timer(0, 0, OLSR_TIMER_ONESHOT, SetSignalHandler, NULL, 0); @@ -1534,133 +1534,9 @@ int SetupServiceList(const char *value, void *data __attribute__ ((unused)), set // set timer for period ServiceList updating service_update_timer = olsr_start_timer(ServiceUpdateInterval * MSEC_PER_SEC, EMISSION_JITTER, OLSR_TIMER_PERIODIC, UpdateServices, NULL, 0); - // set timer for periodically prompting service announcements - service_query_timer = olsr_start_timer(SERVICE_QUERY_INTERVAL * MSEC_PER_SEC, EMISSION_JITTER, OLSR_TIMER_PERIODIC, PromptAnnouncements, NULL, 0); - return 0; } -void PromptAnnouncements(void *context __attribute__((unused))) { - int ret; - const char dnssd_type[] = "_services._dns-sd._udp.mesh.local"; - char srv_type[256]; - uint8_t *pkt_buf = NULL; - size_t buf_size = 0; - struct MdnsService *service = NULL; - ldns_rdf *rdf = NULL; - ldns_rr *question_rr = NULL; - ldns_rr_list *rr_list = NULL; - ldns_pkt *pkt = NULL; - struct DnssdInterface *ifwalker = NULL; - struct UdpDestPort *walker = NULL; - union olsr_sockaddr addr; - - ret = ldns_pkt_query_new_frm_str(&pkt, dnssd_type, LDNS_RR_TYPE_PTR, LDNS_RR_CLASS_IN, 0); - if (ret != LDNS_STATUS_OK) { - P2pdPError("Failed to create ldns packet: %s\n", ldns_get_errorstr_by_id(ret)); - if (pkt) - ldns_pkt_free(pkt); - return; - } - - for (service = ServiceList; service != NULL; service=service->hh.next) { - memset(srv_type, 0, 256); - strcpy(srv_type, service->service_type); - strcat(srv_type, ".mesh.local"); - ret = ldns_str2rdf_dname(&rdf, srv_type); - if (ret != LDNS_STATUS_OK) { - P2pdPError("Failed to create rdf: %s\n", ldns_get_errorstr_by_id(ret)); - if (rdf) - ldns_rdf_free(rdf); - ldns_pkt_free(pkt); - return; - } - - // Don't add duplicate RRs - if ((rr_list = ldns_pkt_rr_list_by_name(pkt, rdf, LDNS_SECTION_QUESTION))) { - ldns_rr_list_free(rr_list); - ldns_rdf_free(rdf); - continue; - } - - question_rr = ldns_rr_new(); - if (!question_rr) { - P2pdPError("Failed to create rr"); - ldns_rdf_free(rdf); - ldns_pkt_free(pkt); - return; - } - ldns_rr_set_owner(question_rr, rdf); - ldns_rr_set_type(question_rr, LDNS_RR_TYPE_PTR); - ldns_rr_set_class(question_rr, LDNS_RR_CLASS_IN); - ldns_rr_set_question(question_rr, 1); - ldns_pkt_push_rr(pkt, LDNS_SECTION_QUESTION, question_rr); - } - - // Convert packet to wire format - ret = ldns_pkt2wire(&pkt_buf, pkt, &buf_size); - if (ret != LDNS_STATUS_OK) { - P2pdPError("Error converting dns packet to wire format: %s\n", ldns_get_errorstr_by_id(ret)); - ldns_pkt_free(pkt); - if (pkt_buf) - free(pkt_buf); - return; - } - ldns_pkt_free(pkt); - - // Send packet to local interface(s) and UDP destination addresses - for (ifwalker = OlsrInterfaces; ifwalker != NULL; ifwalker = ifwalker->next) { - - for (walker = UdpDestPortList; walker; walker = walker->next) { - int nBytesWritten; - - memset(&addr, 0, sizeof(union olsr_sockaddr)); - -// if (walker->ip_version == AF_INET) { - addr.in4.sin_family = AF_INET; - addr.in4.sin_port = htons(walker->port); - addr.in4.sin_addr.s_addr = walker->address.v4.s_addr; - - nBytesWritten = sendto(ifwalker->ipSkfd, - pkt_buf, - buf_size, - 0, - (struct sockaddr *) &addr.in4, - sizeof(struct sockaddr)); - -// } else /* ip_version == AF_INET6 */ { -// addr.in6.sin6_family = AF_INET; -// addr.in6.sin6_port = walker->port; -// memcpy(&addr.in6.sin6_addr.s6_addr, walker->address.v6.s6_addr, 16); -// -// nBytesWritten = sendto(ifwalker->ipSkfd, -// pkt_buf, -// buf_size, -// 0, -// (struct sockaddr *) &addr.in6, -// sizeof(struct sockaddr)); - -// } - - if (nBytesWritten != buf_size) { - P2pdPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", - ifwalker->ifName); - } else { -#ifdef INCLUDE_DEBUG_OUTPUT - OLSR_PRINTF( - 2, - "%s: Sent mDNS queries on \"%s\" to %s:%d\n", - PLUGIN_NAME_SHORT, - ifwalker->ifName, - inet_ntoa(addr.in4.sin_addr), - addr.in4.sin_port); -#endif - } - } - } - free(pkt_buf); -} - /* ------------------------------------------------------------------------- * Function : UpdateServices * Description: Fetches local Avahi service files with a TTL txt-record and diff --git a/lib/dnssd/src/dnssd.h b/lib/dnssd/src/dnssd.h index 097f691f..610764d4 100644 --- a/lib/dnssd/src/dnssd.h +++ b/lib/dnssd/src/dnssd.h @@ -74,7 +74,6 @@ #define UDP_HEADER_LENGTH 8 #define HOSTNAME_LEN 64 #define SERVICE_UPDATE_INTERVAL 300 -#define SERVICE_QUERY_INTERVAL 30 #define EMISSION_JITTER 25 /* percent */ /* Forward declaration of OLSR interface type */ From 72cfcbb50618df796da3abe012c1eaa3f31ef62f Mon Sep 17 00:00:00 2001 From: Dan Staples Date: Wed, 2 Apr 2014 14:40:24 -0400 Subject: [PATCH 2/2] dont send out mDNS packets with zero RRs --- lib/dnssd/src/dnssd.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/dnssd/src/dnssd.c b/lib/dnssd/src/dnssd.c index c8f45682..c9fc7122 100644 --- a/lib/dnssd/src/dnssd.c +++ b/lib/dnssd/src/dnssd.c @@ -814,17 +814,21 @@ P2pdPacketCaptured(unsigned char *encapsulationUdpData, int nBytes) } // Send packet with non-local RR list (this will include any question RRs) - p2 = ldns_pkt_clone(p); // create new mDNS packet p2 cloned from original packet - ldns_rr_list_deep_free(p2->_answer); - ldns_rr_list_deep_free(p2->_additional); - ldns_rr_list_deep_free(p2->_authority); - ldns_pkt_set_answer(p2, (nonlocal_list_count[0]) ? nonlocal_list[0] : NULL); - ldns_pkt_set_authority(p2, (nonlocal_list_count[1]) ? nonlocal_list[1] : NULL); - ldns_pkt_set_additional(p2, (nonlocal_list_count[2]) ? nonlocal_list[2] : NULL); - for (i = 0; i < 3; ++i) - ldns_pkt_set_section_count(p2, i + 1, nonlocal_list_count[i]); - DnssdSendPacket(p2, pkt_type, encapsulationUdpData, nBytes, 0); - ldns_pkt_free(p2); + if (nonlocal_list_count[0] + || nonlocal_list_count[1] + || nonlocal_list_count[2]) { + p2 = ldns_pkt_clone(p); // create new mDNS packet p2 cloned from original packet + ldns_rr_list_deep_free(p2->_answer); + ldns_rr_list_deep_free(p2->_additional); + ldns_rr_list_deep_free(p2->_authority); + ldns_pkt_set_answer(p2, (nonlocal_list_count[0]) ? nonlocal_list[0] : NULL); + ldns_pkt_set_authority(p2, (nonlocal_list_count[1]) ? nonlocal_list[1] : NULL); + ldns_pkt_set_additional(p2, (nonlocal_list_count[2]) ? nonlocal_list[2] : NULL); + for (i = 0; i < 3; ++i) + ldns_pkt_set_section_count(p2, i + 1, nonlocal_list_count[i]); + DnssdSendPacket(p2, pkt_type, encapsulationUdpData, nBytes, 0); + ldns_pkt_free(p2); + } // For each batch of RRs grouped by TTL, populate new mDNS packet to encapsulate in an OLSR packet and send to mesh for (ttl_bucket = rr_buf; ttl_bucket != NULL; ttl_bucket=ttl_bucket->hh.next) {