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:
parent
024ea8c733
commit
f12a042306
3 changed files with 25 additions and 4 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue