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:
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,
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue