1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +00:00

dhcp: send comm-events as server

Add a gdhcp callback for server-side lease events. Then raise L: and R:
lines for each event we get so miracled can react to it.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
David Herrmann 2014-02-17 12:20:06 +01:00
parent 024ea8c733
commit f12a042306
3 changed files with 25 additions and 4 deletions

View file

@ -201,12 +201,14 @@ typedef enum {
typedef void (*GDHCPSaveLeaseFunc) (unsigned char *mac, typedef void (*GDHCPSaveLeaseFunc) (unsigned char *mac,
unsigned int nip, unsigned int expire); unsigned int nip, unsigned int expire);
typedef void (*g_dhcp_event_fn) (const char *mac, const char *ip, void *data);
struct _GDHCPServer; struct _GDHCPServer;
typedef struct _GDHCPServer GDHCPServer; typedef struct _GDHCPServer GDHCPServer;
GDHCPServer *g_dhcp_server_new(GDHCPType type, GDHCPServer *g_dhcp_server_new(GDHCPType type,
int ifindex, GDHCPServerError *error); int ifindex, GDHCPServerError *error,
g_dhcp_event_fn event_fn, void *fn_data);
int g_dhcp_server_start(GDHCPServer *server); int g_dhcp_server_start(GDHCPServer *server);
void g_dhcp_server_stop(GDHCPServer *server); void g_dhcp_server_stop(GDHCPServer *server);

View file

@ -34,6 +34,7 @@
#include <netpacket/packet.h> #include <netpacket/packet.h>
#include <net/ethernet.h> #include <net/ethernet.h>
#include <net/if_arp.h> #include <net/if_arp.h>
#include <netinet/ether.h>
#include <linux/if.h> #include <linux/if.h>
#include <linux/filter.h> #include <linux/filter.h>
@ -67,6 +68,8 @@ struct _GDHCPServer {
GDHCPSaveLeaseFunc save_lease_func; GDHCPSaveLeaseFunc save_lease_func;
GDHCPDebugFunc debug_func; GDHCPDebugFunc debug_func;
gpointer debug_data; gpointer debug_data;
g_dhcp_event_fn event_fn;
void *fn_data;
}; };
struct dhcp_lease { struct dhcp_lease {
@ -347,7 +350,8 @@ done:
} }
GDHCPServer *g_dhcp_server_new(GDHCPType type, GDHCPServer *g_dhcp_server_new(GDHCPType type,
int ifindex, GDHCPServerError *error) int ifindex, GDHCPServerError *error,
g_dhcp_event_fn event_fn, void *fn_data)
{ {
GDHCPServer *dhcp_server = NULL; GDHCPServer *dhcp_server = NULL;
@ -400,6 +404,8 @@ GDHCPServer *g_dhcp_server_new(GDHCPType type,
dhcp_server->save_lease_func = NULL; dhcp_server->save_lease_func = NULL;
dhcp_server->debug_func = NULL; dhcp_server->debug_func = NULL;
dhcp_server->debug_data = NULL; dhcp_server->debug_data = NULL;
dhcp_server->event_fn = event_fn;
dhcp_server->fn_data = fn_data;
*error = G_DHCP_SERVER_ERROR_NONE; *error = G_DHCP_SERVER_ERROR_NONE;
@ -612,6 +618,11 @@ static void send_ACK(GDHCPServer *dhcp_server,
send_packet_to_client(dhcp_server, &packet); send_packet_to_client(dhcp_server, &packet);
add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr); add_lease(dhcp_server, 0, packet.chaddr, packet.yiaddr);
if (dhcp_server->event_fn)
dhcp_server->event_fn(ether_ntoa((void*)packet.chaddr),
inet_ntoa(addr),
dhcp_server->fn_data);
} }
static void send_NAK(GDHCPServer *dhcp_server, static void send_NAK(GDHCPServer *dhcp_server,

View file

@ -107,7 +107,7 @@ struct manager {
* D:<addr> # primary DNS server * D:<addr> # primary DNS server
* G:<addr> # primary gateway * G:<addr> # primary gateway
* sent on remote lease: * sent on remote lease:
* R:<addr> # addr given to remote device * R:<mac> <addr> # addr given to remote device
*/ */
static void write_comm(const void *msg, size_t size) static void write_comm(const void *msg, size_t size)
{ {
@ -372,6 +372,12 @@ static void server_log_fn(const char *str, void *data)
log_format(NULL, 0, NULL, "gdhcp", LOG_DEBUG, "%s", str); log_format(NULL, 0, NULL, "gdhcp", LOG_DEBUG, "%s", str);
} }
static void server_event_fn(const char *mac, const char *lease, void *data)
{
log_debug("remote lease: %s %s", mac, lease);
writef_comm("R:%s %s", mac, lease);
}
static gboolean manager_signal_fn(GIOChannel *chan, GIOCondition mask, static gboolean manager_signal_fn(GIOChannel *chan, GIOCondition mask,
gpointer data) gpointer data)
{ {
@ -584,7 +590,7 @@ static int manager_new(struct manager **out)
} }
m->server = g_dhcp_server_new(G_DHCP_IPV4, m->ifindex, m->server = g_dhcp_server_new(G_DHCP_IPV4, m->ifindex,
&serr); &serr, server_event_fn, m);
if (!m->server) { if (!m->server) {
r = -EINVAL; r = -EINVAL;
@ -684,6 +690,8 @@ static int manager_run(struct manager *m)
log_error("cannot start DHCP server: %d", r); log_error("cannot start DHCP server: %d", r);
return -EFAULT; return -EFAULT;
} }
writef_comm("L:%s", arg_local);
} }
g_main_loop_run(m->loop); g_main_loop_run(m->loop);