Mercurial > louis > mq > lightsd
view add_ipv4_to_ieee8023mac.patch @ 556:ac035949357d default tip master
Finish some patches
author | Louis Opter <louis@opter.org> |
---|---|
date | Thu, 18 May 2017 12:09:23 -0700 |
parents | aecc19ba45d9 |
children |
line wrap: on
line source
# HG changeset patch # Parent cb2ea88a7a426fb93e3c781fbc146126e574a9de diff --git a/core/proto.c b/core/proto.c --- a/core/proto.c +++ b/core/proto.c @@ -202,11 +202,13 @@ struct lgtd_lifx_bulb *bulb = device->device; char buf[2048], + gw_addr[LGTD_LIFX_ADDR_STRLEN], site_addr[LGTD_LIFX_ADDR_STRLEN], bulb_addr[LGTD_LIFX_ADDR_STRLEN]; int i = 0; LGTD_IEEE8023MACTOA(bulb->addr, bulb_addr); + LGTD_IEEE8023MACTOA(bulb->gw->addr, gw_addr); LGTD_IEEE8023MACTOA(bulb->gw->site.as_array, site_addr); LGTD_SNPRINTF_APPEND( @@ -215,11 +217,12 @@ "\"_lifx\":{" "\"addr\": \"%s\"," "\"gateway\":{" + "\"addr\":\"%s\"," "\"site\":\"%s\"," "\"url\":\"tcp://[%s]:%hu\"," "\"latency\":%ju" "},", - bulb_addr, site_addr, + bulb_addr, gw_addr, site_addr, bulb->gw->ip_addr, bulb->gw->port, (uintmax_t)LGTD_LIFX_GATEWAY_LATENCY(bulb->gw) ); diff --git a/lifx/gateway.c b/lifx/gateway.c --- a/lifx/gateway.c +++ b/lifx/gateway.c @@ -15,12 +15,15 @@ // You should have received a copy of the GNU General Public License // along with lighstd. If not, see <http://www.gnu.org/licenses/>. +#include <sys/ioctl.h> #include <sys/queue.h> +#include <sys/socket.h> #include <sys/tree.h> #include <assert.h> #include <endian.h> #include <err.h> #include <errno.h> +#include <net/if_arp.h> #include <stdarg.h> #include <stdbool.h> #include <stdint.h> @@ -279,6 +282,28 @@ return bulb; } +// TODO: make a separate shared library to resolve ip addresses to mac +// addresses: +static bool +lgtd_lifx_gateway_resolve_ipv4_addr(int socket, + const struct sockaddr_in *sin, + uint8_t *hw_addr) +{ + assert(sin); + assert(hw_addr); + assert(socket >= 0); + + struct arpreq req; + memset(&req, 0, sizeof(req)); + memcpy(&req.arp_pa, sin, sizeof(*sin)); + memcpy(req.arp_dev, "br0", 4); + if (!ioctl(socket, SIOCGARP, &req)) { + memcpy(hw_addr, req.arp_ha.sa_data, LGTD_LIFX_ADDR_LENGTH); + return true; + } + return false; +} + struct lgtd_lifx_gateway * lgtd_lifx_gateway_open(const struct sockaddr_storage *peer, ev_socklen_t addrlen, @@ -314,10 +339,20 @@ gw->refresh_ev = evtimer_new( lgtd_ev_base, lgtd_lifx_gateway_refresh_callback, gw ); + memcpy(&gw->peer, peer, sizeof(gw->peer)); lgtd_sockaddrtoa(peer, gw->ip_addr, sizeof(gw->ip_addr)); gw->port = lgtd_sockaddrport(peer); memcpy(gw->site.as_array, site, sizeof(gw->site.as_array)); + if (peer->ss_family == AF_INET) { + bool ok = lgtd_lifx_gateway_resolve_ipv4_addr( + gw->socket, (const struct sockaddr_in *)peer, gw->addr + ); + if (!ok) { + lgtd_warn("couldn't resolve %s to a LIFX address", gw->ip_addr); + } + } + gw->last_req_at = received_at; gw->next_req_at = received_at; gw->last_pkt_at = received_at; @@ -332,11 +367,11 @@ goto error_allocate; } - char site_addr[LGTD_LIFX_ADDR_STRLEN]; + char site_addr[LGTD_LIFX_ADDR_STRLEN], addr[LGTD_LIFX_ADDR_STRLEN]; lgtd_info( - "gateway for site %s at [%s]:%hu", + "gateway for site %s at [%s]:%hu (%s)", LGTD_IEEE8023MACTOA(gw->site.as_array, site_addr), - gw->ip_addr, gw->port + gw->ip_addr, gw->port, LGTD_IEEE8023MACTOA(gw->addr, addr) ); LIST_INSERT_HEAD(&lgtd_lifx_gateways, gw, link);