1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-02-14 19:42:01 +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,
unsigned int nip, unsigned int expire);
typedef void (*g_dhcp_event_fn) (const char *mac, const char *ip, void *data);
struct _GDHCPServer;
typedef struct _GDHCPServer GDHCPServer;
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);
void g_dhcp_server_stop(GDHCPServer *server);

View file

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

View file

@ -107,7 +107,7 @@ struct manager {
* D:<addr> # primary DNS server
* G:<addr> # primary gateway
* 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)
{
@ -372,6 +372,12 @@ static void server_log_fn(const char *str, void *data)
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,
gpointer data)
{
@ -584,7 +590,7 @@ static int manager_new(struct manager **out)
}
m->server = g_dhcp_server_new(G_DHCP_IPV4, m->ifindex,
&serr);
&serr, server_event_fn, m);
if (!m->server) {
r = -EINVAL;
@ -684,6 +690,8 @@ static int manager_run(struct manager *m)
log_error("cannot start DHCP server: %d", r);
return -EFAULT;
}
writef_comm("L:%s", arg_local);
}
g_main_loop_run(m->loop);