Reconecto el manager, eventos y comandos de interfaces.
parent
dab460efb6
commit
38ebabf853
6
INSTALL
6
INSTALL
|
@ -1,8 +1,8 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||
Foundation, Inc.
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
|
@ -225,7 +225,7 @@ order to use an ANSI C compiler:
|
|||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX 'make' updates targets which have the same time stamps as their
|
||||
HP-UX 'make' updates targets which have the same timestamps as their
|
||||
prerequisites, which makes it generally unusable when shipped generated
|
||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include "ni-marshal.h"
|
||||
#include "ni-route.h"
|
||||
|
||||
#include "../src/network-inador-manager.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
#define COMMAND_SOCKET_PATH "/tmp/network-inador.socket"
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include "ni-ip.h"
|
||||
#include "ni-marshal.h"
|
||||
|
||||
#include "../src/network-inador-manager.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
struct _NIInterfacePrivate {
|
||||
NIClient *ni_client;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include "ni-interface.h"
|
||||
#include "ni-ip.h"
|
||||
|
||||
#include "../src/network-inador-manager.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
struct _NIIPPrivate {
|
||||
NIInterface *ni_interface;
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "ni-route.h"
|
||||
#include "ni-ip.h"
|
||||
|
||||
#include "../src/network-inador-manager.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
struct _NIRoutePrivate {
|
||||
NIClient *ni_client;
|
||||
|
|
|
@ -478,7 +478,7 @@ _f_list_remove_link (FList *list,
|
|||
{
|
||||
if (link->prev->next == link)
|
||||
link->prev->next = link->next;
|
||||
//else
|
||||
else
|
||||
printf ("corrupted double-linked list detected");
|
||||
}
|
||||
if (link->next)
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
|
||||
lib_LTLIBRARIES = libnetworkinador.la
|
||||
libnetworkinador_la_SOURCES = network-inador.h \
|
||||
network-inador-private.h \
|
||||
network-inador-link-types.h \
|
||||
libnetworkinador_la_SOURCES = network-inador-public.h \
|
||||
event_notify.c event_notify.h \
|
||||
getters.c network-inador-private.h \
|
||||
network-inador-link-types.h network-inador-manager.h network-inador-events.h \
|
||||
struct_addr_union.h wireless_struct.h \
|
||||
handle.c \
|
||||
netlink-events.c netlink-events.h \
|
||||
|
@ -29,7 +30,7 @@ libnetworkinador_la_CFLAGS = -I$(top_srcdir)/common $(LIBNL3_CFLAGS) $(LIBNLGEN3
|
|||
LDADD = $(LIBINTL)
|
||||
|
||||
libnetworkinadordir = $(includedir)/libnetworkinador
|
||||
libnetworkinador_HEADERS = network-inador.h network-inador-link-types.h
|
||||
libnetworkinador_HEADERS = network-inador-public.h network-inador-link-types.h network-inador-manager.h network-inador-events.h
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
dist_pkgconfig_DATA = network-inador.pc
|
||||
|
|
|
@ -35,13 +35,13 @@
|
|||
|
||||
#include "interfaces.h"
|
||||
#include "network-inador-private.h"
|
||||
//#include "manager.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
#include "dhcp_client.h"
|
||||
#include "resolv_manager.h"
|
||||
#include "launch_process.h"
|
||||
|
||||
#include "network-inador-manager.h"
|
||||
#include "event_notify.h"
|
||||
|
||||
static void interfaces_dhcp_clear_info (InterfaceDHCPClientInfo *dhcpc);
|
||||
|
||||
|
@ -111,7 +111,7 @@ void interfaces_dhcp_client_killed_cb (void *data, pid_t pid, int status) {
|
|||
|
||||
/* Enviar actualización de estado aquí */
|
||||
iface->dhcpc.dhcp_state = DHCP_CLIENT_KILLED;
|
||||
//manager_send_event_dhcp_change (iface->handle, &iface->dhcpc);
|
||||
network_manager_trigger_dhcp_event (iface->handle, &iface->dhcpc);
|
||||
|
||||
if (iface->dhcpc.type == IFACE_ISC_DHCLIENT || iface->dhcpc.type == IFACE_BUSYBOX_UDHCPC) {
|
||||
if (iface->dhcpc.flags & DHCP_CLIENT_FLAG_AUTO_RESTART) {
|
||||
|
@ -252,7 +252,7 @@ int interfaces_dhcp_client_run (NetworkInadorHandle *handle, int index, int type
|
|||
iface->dhcpc.process_watch = handle->ops.process_watch (iface->dhcpc.process_pid, interfaces_dhcp_client_killed_cb, iface);
|
||||
}
|
||||
|
||||
//manager_send_event_dhcp_change (handle, &iface->dhcpc);
|
||||
network_manager_trigger_dhcp_event (handle, &iface->dhcpc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -293,7 +293,7 @@ int interfaces_dhcp_client_stop (NetworkInadorHandle *handle, int index) {
|
|||
resolv_manager_clear_dhcp_nameservers (handle, iface);
|
||||
|
||||
/* Enviar actualización de estado aquí */
|
||||
//manager_send_event_dhcp_change (handle, &iface->dhcpc);
|
||||
network_manager_trigger_dhcp_event (handle, &iface->dhcpc);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -417,6 +417,6 @@ void interfaces_dhcp_client_internal_feed_from_client (NetworkInadorHandle *hand
|
|||
resolv_manager_clear_dhcp_nameservers (handle, iface);
|
||||
}
|
||||
|
||||
//manager_send_event_dhcp_change (handle, &iface->dhcpc);
|
||||
network_manager_trigger_dhcp_event (handle, &iface->dhcpc);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#define __DHCPC_DEFS_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include "flist.h"
|
||||
|
||||
#include "struct_addr_union.h"
|
||||
|
||||
|
@ -52,7 +51,7 @@ enum {
|
|||
#define DHCP_CLIENT_FLAG_DONT_ADD_ROUTE_INFO 0x0004
|
||||
#define DHCP_CLIENT_FLAG_DONT_ADD_IP_INFO 0x0008
|
||||
|
||||
typedef struct {
|
||||
typedef struct _InterfaceDHCPClientInfo {
|
||||
int type;
|
||||
|
||||
uint32_t flags;
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* event_notify.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2024 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "network-inador-private.h"
|
||||
#include "network-inador-events.h"
|
||||
#include "interfaces.h"
|
||||
#include "ip-address.h"
|
||||
//#include "dhcp_defs.h"
|
||||
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
|
||||
/* Agregar vigilancias */
|
||||
void network_manager_add_watch_dhcp (NetworkInadorHandle *handle, NetworkInadorDHCPEventCB cb, void *data) {
|
||||
handle->notify_list.dhcp_event_cb = cb;
|
||||
handle->notify_list.dhcp_event_data = data;
|
||||
}
|
||||
|
||||
void network_manager_add_watch_interface_added (NetworkInadorHandle *handle, NetworkInadorInterfaceAddEventCB cb, void *data) {
|
||||
handle->notify_list.interface_add_event_cb = cb;
|
||||
handle->notify_list.interface_add_event_data = data;
|
||||
}
|
||||
|
||||
void network_manager_add_watch_interface_updated (NetworkInadorHandle *handle, NetworkInadorInterfaceUpdateEventCB cb, void *data) {
|
||||
handle->notify_list.interface_update_event_cb = cb;
|
||||
handle->notify_list.interface_update_event_data = data;
|
||||
}
|
||||
|
||||
void network_manager_add_watch_interface_deleted (NetworkInadorHandle *handle, NetworkInadorInterfaceDeleteEventCB cb, void *data) {
|
||||
handle->notify_list.interface_del_event_cb = cb;
|
||||
handle->notify_list.interface_del_event_data = data;
|
||||
}
|
||||
|
||||
void network_manager_add_watch_ip_added (NetworkInadorHandle *handle, NetworkInadorIPAddEventCB cb, void *data) {
|
||||
handle->notify_list.ip_add_event_cb = cb;
|
||||
handle->notify_list.ip_add_event_data = data;
|
||||
}
|
||||
|
||||
void network_manager_add_watch_ip_deleted (NetworkInadorHandle *handle, NetworkInadorIPDelEventCB cb, void *data) {
|
||||
handle->notify_list.ip_del_event_cb = cb;
|
||||
handle->notify_list.ip_del_event_data = data;
|
||||
}
|
||||
|
||||
/* Disparar las vigilancias */
|
||||
void network_manager_trigger_dhcp_event (NetworkInadorHandle *handle, InterfaceDHCPClientInfo *dhcpc) {
|
||||
Interface *iface = container_of (dhcpc, Interface, dhcpc);
|
||||
|
||||
if (handle->notify_list.dhcp_event_cb != NULL) {
|
||||
handle->notify_list.dhcp_event_cb (handle, iface, dhcpc, handle->notify_list.dhcp_event_data);
|
||||
}
|
||||
}
|
||||
|
||||
/* Triggers de interfaces */
|
||||
void network_manager_trigger_interface_added_event (NetworkInadorHandle *handle, Interface *iface) {
|
||||
if (handle->notify_list.interface_add_event_cb != NULL) {
|
||||
handle->notify_list.interface_add_event_cb (handle, iface, handle->notify_list.interface_add_event_data);
|
||||
}
|
||||
}
|
||||
|
||||
void network_manager_trigger_interface_updated_event (NetworkInadorHandle *handle, Interface *iface) {
|
||||
if (handle->notify_list.interface_update_event_cb != NULL) {
|
||||
handle->notify_list.interface_update_event_cb (handle, iface, handle->notify_list.interface_update_event_data);
|
||||
}
|
||||
}
|
||||
|
||||
void network_manager_trigger_interface_deleted_event (NetworkInadorHandle *handle, uint32_t index) {
|
||||
if (handle->notify_list.interface_del_event_cb != NULL) {
|
||||
handle->notify_list.interface_del_event_cb (handle, index, handle->notify_list.interface_del_event_data);
|
||||
}
|
||||
}
|
||||
|
||||
/* Triggers de ips */
|
||||
void network_manager_trigger_ip_added_event (NetworkInadorHandle *handle, IPAddr *ip_addr) {
|
||||
if (handle->notify_list.ip_add_event_cb != NULL) {
|
||||
handle->notify_list.ip_add_event_cb (handle, ip_addr, handle->notify_list.ip_add_event_data);
|
||||
}
|
||||
}
|
||||
|
||||
void network_manager_trigger_ip_deleted_event (NetworkInadorHandle *handle, IPAddr *ip_addr) {
|
||||
if (handle->notify_list.ip_del_event_cb != NULL) {
|
||||
handle->notify_list.ip_del_event_cb (handle, ip_addr, handle->notify_list.ip_del_event_data);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* event_notify.h
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2024 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __EVENT_NOTIFY_H__
|
||||
#define __EVENT_NOTIFY_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "network-inador-events.h"
|
||||
|
||||
void network_manager_trigger_dhcp_event (NetworkInadorHandle *handle, InterfaceDHCPClientInfo *dhcpc);
|
||||
void network_manager_trigger_interface_added_event (NetworkInadorHandle *handle, Interface *iface);
|
||||
void network_manager_trigger_interface_updated_event (NetworkInadorHandle *handle, Interface *iface);
|
||||
void network_manager_trigger_interface_deleted_event (NetworkInadorHandle *handle, uint32_t index);
|
||||
void network_manager_trigger_ip_added_event (NetworkInadorHandle *handle, IPAddr *ip_addr);
|
||||
void network_manager_trigger_ip_deleted_event (NetworkInadorHandle *handle, IPAddr *ip_addr);
|
||||
|
||||
#endif /* __EVENT_NOTIFY_H__ */
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
* getters.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2025 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "network-inador-private.h"
|
||||
#include "interfaces.h"
|
||||
#include "ip-address.h"
|
||||
|
||||
uint32_t *network_inador_list_ifaces (NetworkInadorHandle *handle) {
|
||||
uint32_t *memory;
|
||||
FList *g;
|
||||
Interface *iface;
|
||||
int c;
|
||||
|
||||
memory = (uint32_t *) malloc ((handle->interfaces_counter + 1) * sizeof (uint32_t));
|
||||
|
||||
if (memory == NULL) return NULL;
|
||||
|
||||
c = 0;
|
||||
for (g = handle->interfaces; g != NULL; g = g->next) {
|
||||
iface = (Interface *) g->data;
|
||||
|
||||
memory[c] = iface->index;
|
||||
c++;
|
||||
}
|
||||
memory[c] = 0;
|
||||
|
||||
return memory;
|
||||
}
|
||||
|
||||
Interface *network_inador_get_iface (NetworkInadorHandle *handle, uint32_t index) {
|
||||
_interfaces_locate_by_index (handle->interfaces, index);
|
||||
}
|
||||
|
||||
const unsigned char *network_inador_iface_get_name (Interface *iface) {
|
||||
return iface->name;
|
||||
}
|
||||
|
||||
uint32_t network_inador_iface_get_index (Interface *iface) {
|
||||
return iface->index;
|
||||
}
|
||||
|
||||
uint32_t network_inador_iface_get_link_type (Interface *iface) {
|
||||
return iface->link_type;
|
||||
}
|
||||
|
||||
uint32_t network_inador_iface_get_master_index (Interface *iface) {
|
||||
return iface->master_index;
|
||||
}
|
||||
|
||||
uint32_t network_inador_iface_get_mtu (Interface *iface) {
|
||||
return iface->mtu;
|
||||
}
|
||||
|
||||
uint16_t network_inador_iface_get_flags (Interface *iface) {
|
||||
return iface->flags;
|
||||
}
|
||||
|
||||
uint8_t network_inador_iface_get_is_wireless (Interface *iface) {
|
||||
return iface->is_wireless;
|
||||
}
|
||||
|
||||
uint8_t network_inador_iface_get_num_ips (Interface *iface) {
|
||||
return iface->address_counter;
|
||||
}
|
||||
|
||||
IPAddr *network_inador_iface_get_ipaddr_by_index (Interface *iface, int index) {
|
||||
FList *pos;
|
||||
pos = f_list_nth (f_list_first (iface->address), index);
|
||||
if (pos == NULL) return NULL;
|
||||
return (IPAddr *) (pos->data);
|
||||
}
|
||||
|
||||
Interface *network_inador_ipaddr_get_iface (IPAddr *ip_addr) {
|
||||
return ip_addr->iface;
|
||||
}
|
||||
|
||||
uint8_t network_inador_ipaddr_get_family (IPAddr *ip_addr) {
|
||||
return ip_addr->family;
|
||||
}
|
||||
|
||||
uint8_t network_inador_ipaddr_get_prefix (IPAddr *ip_addr) {
|
||||
return ip_addr->prefix;
|
||||
}
|
||||
|
||||
uint8_t network_inador_ipaddr_has_local (IPAddr *ip_addr) {
|
||||
return ip_addr->has_local;
|
||||
}
|
||||
|
||||
uint8_t network_inador_ipaddr_has_brd (IPAddr *ip_addr) {
|
||||
return ip_addr->has_brd;
|
||||
}
|
||||
|
||||
uint8_t network_inador_ipaddr_get_scope (IPAddr *ip_addr) {
|
||||
return ip_addr->scope;
|
||||
}
|
||||
|
||||
uint32_t network_inador_ipaddr_get_flags (IPAddr *ip_addr) {
|
||||
return ip_addr->flags;
|
||||
}
|
||||
|
||||
void network_inador_ipaddr_get_cacheinfo (IPAddr *ip_addr, struct ifa_cacheinfo *cacheinfo) {
|
||||
memcpy (cacheinfo, &ip_addr->cacheinfo, sizeof (struct ifa_cacheinfo));
|
||||
}
|
||||
|
||||
void network_inador_ipaddr_get_addr (IPAddr *ip_addr, void *addr, int *addr_size) {
|
||||
int family_size = 0;
|
||||
|
||||
if (ip_addr->family == AF_INET) {
|
||||
family_size = sizeof (struct in_addr);
|
||||
} else if (ip_addr->family == AF_INET6) {
|
||||
family_size = sizeof (struct in6_addr);
|
||||
}
|
||||
|
||||
if (addr_size != NULL) {
|
||||
/* Verificar que no supere el máximo de la dirección */
|
||||
if (*addr_size < family_size) {
|
||||
family_size = *addr_size;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy (addr, &ip_addr->addr, family_size);
|
||||
|
||||
if (addr_size != NULL) {
|
||||
*addr_size = family_size;
|
||||
}
|
||||
}
|
||||
|
||||
void network_inador_ipaddr_get_local_addr (IPAddr *ip_addr, void *addr, int *addr_size) {
|
||||
int family_size = 0;
|
||||
|
||||
if (ip_addr->family == AF_INET) {
|
||||
family_size = sizeof (struct in_addr);
|
||||
} else if (ip_addr->family == AF_INET6) {
|
||||
family_size = sizeof (struct in6_addr);
|
||||
}
|
||||
|
||||
if (addr_size != NULL) {
|
||||
/* Verificar que no supere el máximo de la dirección */
|
||||
if (*addr_size < family_size) {
|
||||
family_size = *addr_size;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy (addr, &ip_addr->local_addr, family_size);
|
||||
|
||||
if (addr_size != NULL) {
|
||||
*addr_size = family_size;
|
||||
}
|
||||
}
|
||||
|
||||
void network_inador_ipaddr_get_brd_addr (IPAddr *ip_addr, void *addr, int *addr_size) {
|
||||
int family_size = 0;
|
||||
|
||||
if (ip_addr->family == AF_INET) {
|
||||
family_size = sizeof (struct in_addr);
|
||||
} else if (ip_addr->family == AF_INET6) {
|
||||
family_size = sizeof (struct in6_addr);
|
||||
}
|
||||
|
||||
if (addr_size != NULL) {
|
||||
/* Verificar que no supere el máximo de la dirección */
|
||||
if (*addr_size < family_size) {
|
||||
family_size = *addr_size;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy (addr, &ip_addr->brd_addr, family_size);
|
||||
|
||||
if (addr_size != NULL) {
|
||||
*addr_size = family_size;
|
||||
}
|
||||
}
|
||||
|
||||
const unsigned char *network_inador_ipaddr_get_label (IPAddr *ip_addr) {
|
||||
return ip_addr->label;
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* main.c
|
||||
* handle.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2024 - Félix Arreola Rodríguez
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "routes.h"
|
||||
#include "ip-address.h"
|
||||
#include "wireless_if.h"
|
||||
//#include "manager.h"
|
||||
#include "event_notify.h"
|
||||
|
||||
#include "network-inador-link-types.h"
|
||||
|
||||
|
@ -117,6 +117,7 @@ static int _interfaces_receive_message_interface (struct nl_msg *msg, void *arg,
|
|||
memset (iface, 0, sizeof (Interface));
|
||||
iface->handle = handle;
|
||||
|
||||
handle->interfaces_counter++;
|
||||
handle->interfaces = f_list_append (handle->interfaces, iface);
|
||||
|
||||
was_new = 1;
|
||||
|
@ -137,7 +138,7 @@ static int _interfaces_receive_message_interface (struct nl_msg *msg, void *arg,
|
|||
|
||||
//printf ("Interface %d agregada a la interfaz %d (bridge)\n", iface->index, iface->master_index);
|
||||
was_update = 1;
|
||||
//manager_send_event_interface_update (handle, iface);
|
||||
network_manager_trigger_interface_updated_event (handle, iface);
|
||||
|
||||
return NL_SKIP;
|
||||
}
|
||||
|
@ -286,9 +287,9 @@ static int _interfaces_receive_message_interface (struct nl_msg *msg, void *arg,
|
|||
|
||||
iface->link_type = interfaces_check_link_type (iface);
|
||||
|
||||
//manager_send_event_interface_add (handle, iface);
|
||||
network_manager_trigger_interface_added_event (handle, iface);
|
||||
} else if (was_update) {
|
||||
//manager_send_event_interface_update (handle, iface);
|
||||
network_manager_trigger_interface_updated_event (handle, iface);
|
||||
}
|
||||
|
||||
return NL_SKIP;
|
||||
|
@ -389,7 +390,7 @@ int interface_receive_message_dellink (struct nl_msg *msg, void *arg) {
|
|||
//printf ("Interface %d se sacó de su bridge\n", iface->index);
|
||||
|
||||
/* Generar EVENTO AQUI */
|
||||
//manager_send_event_interface_update (handle, iface);
|
||||
network_manager_trigger_interface_updated_event (handle, iface);
|
||||
|
||||
return NL_SKIP;
|
||||
}
|
||||
|
@ -398,11 +399,12 @@ int interface_receive_message_dellink (struct nl_msg *msg, void *arg) {
|
|||
//printf ("----- Interfaz eliminada: %s\n", iface->name);
|
||||
|
||||
handle->interfaces = f_list_remove (handle->interfaces, iface);
|
||||
handle->interfaces_counter--;
|
||||
|
||||
/* Antes de eliminar la interfaz, eliminar la lista ligada de todas las direcciones IP */
|
||||
f_list_free_full (iface->address, free);
|
||||
|
||||
//manager_send_event_interface_del (handle, iface->index);
|
||||
network_manager_trigger_interface_deleted_event (handle, iface->index);
|
||||
|
||||
free (iface);
|
||||
}
|
||||
|
@ -797,6 +799,7 @@ void interfaces_clean_up (NetworkInadorHandle *handle) {
|
|||
iface->address = NULL;
|
||||
}
|
||||
|
||||
handle->interfaces_counter = 0;
|
||||
f_list_free_full (handle->interfaces, free);
|
||||
handle->interfaces = NULL;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ struct inet6_data {
|
|||
uint8_t i6_addr_gen_mode;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
typedef struct _Interface {
|
||||
NetworkInadorHandle *handle;
|
||||
uint32_t index;
|
||||
char name[IFNAMSIZ];
|
||||
|
@ -64,7 +64,7 @@ typedef struct {
|
|||
/* Banderas estilo ioctl */
|
||||
short flags;
|
||||
|
||||
int is_wireless;
|
||||
uint8_t is_wireless;
|
||||
|
||||
char wireless_protocol[IFNAMSIZ];
|
||||
|
||||
|
@ -77,6 +77,9 @@ typedef struct {
|
|||
/* La lista de direcciones IP, ambas */
|
||||
FList *address;
|
||||
|
||||
/* Contador auxiliar para la lista de direcciones IP */
|
||||
int address_counter;
|
||||
|
||||
InterfaceDHCPClientInfo dhcpc;
|
||||
|
||||
/* Información wireless */
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include "network-inador-private.h"
|
||||
#include "ip-address.h"
|
||||
#include "interfaces.h"
|
||||
//#include "manager.h"
|
||||
#include "event_notify.h"
|
||||
#include "routes.h"
|
||||
|
||||
IPAddr *_ip_address_search_addr (Interface *iface, sa_family_t family, void *addr, uint32_t prefix, void *local_addr) {
|
||||
|
@ -162,6 +162,7 @@ int ip_address_receive_message_newaddr (struct nl_msg *msg, void *arg) {
|
|||
memset (ip_addr, 0, sizeof (*ip_addr));
|
||||
|
||||
iface->address = f_list_append (iface->address, ip_addr);
|
||||
iface->address_counter++;
|
||||
|
||||
ip_addr->family = addr_msg->ifa_family;
|
||||
memcpy (&ip_addr->addr, &addr, family_size);
|
||||
|
@ -203,7 +204,7 @@ int ip_address_receive_message_newaddr (struct nl_msg *msg, void *arg) {
|
|||
}
|
||||
|
||||
if (was_new) {
|
||||
//manager_send_event_ip_add (handle, ip_addr);
|
||||
network_manager_trigger_ip_added_event (handle, ip_addr);
|
||||
} else {
|
||||
/* En caso contrario, enviar una actualización de IP */
|
||||
}
|
||||
|
@ -286,10 +287,11 @@ int ip_address_receive_message_deladdr (struct nl_msg *msg, void *arg) {
|
|||
printf ("Dirección IP - %s/%d sobre interfaz: %d, scope: %d, flags: %u\n", buffer, ip_addr->prefix, iface->index, (unsigned int) ip_addr->scope, ip_addr->flags);
|
||||
|
||||
/* Eliminar de la lista ligada */
|
||||
iface->address_counter--;
|
||||
iface->address = f_list_remove (iface->address, ip_addr);
|
||||
|
||||
/* Notificar del evento */
|
||||
//manager_send_event_ip_del (handle, ip_addr);
|
||||
network_manager_trigger_ip_deleted_event (handle, ip_addr);
|
||||
|
||||
free (ip_addr);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#define INFINITY_LIFE_TIME 0xFFFFFFFFU
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
typedef struct _IPAddr {
|
||||
sa_family_t family;
|
||||
|
||||
uint8_t prefix;
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* network-inador-events.h
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2024 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __NETWORK_INADOR_EVENTS_H__
|
||||
#define __NETWORK_INADOR_EVENTS_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct _NetworkInadorHandle NetworkInadorHandle;
|
||||
typedef struct _Interface Interface;
|
||||
typedef struct _InterfaceDHCPClientInfo InterfaceDHCPClientInfo;
|
||||
typedef struct _IPAddr IPAddr;
|
||||
|
||||
typedef void (*NetworkInadorDHCPEventCB) (NetworkInadorHandle *handle, Interface *iface, InterfaceDHCPClientInfo *dhcp_info, void *data);
|
||||
typedef void (*NetworkInadorInterfaceAddEventCB) (NetworkInadorHandle *handle, Interface *iface, void *data);
|
||||
typedef void (*NetworkInadorInterfaceUpdateEventCB) (NetworkInadorHandle *handle, Interface *iface, void *data);
|
||||
typedef void (*NetworkInadorInterfaceDeleteEventCB) (NetworkInadorHandle *handle, uint32_t index, void *data);
|
||||
typedef void (*NetworkInadorIPAddEventCB) (NetworkInadorHandle *handle, IPAddr *addr, void *data);
|
||||
typedef void (*NetworkInadorIPDelEventCB) (NetworkInadorHandle *handle, IPAddr *addr, void *data);
|
||||
|
||||
/* Pendiente notificar rutas */
|
||||
void network_manager_add_watch_dhcp (NetworkInadorHandle *handle, NetworkInadorDHCPEventCB cb, void *data);
|
||||
void network_manager_add_watch_interface_added (NetworkInadorHandle *handle, NetworkInadorInterfaceAddEventCB cb, void *data);
|
||||
void network_manager_add_watch_interface_updated (NetworkInadorHandle *handle, NetworkInadorInterfaceUpdateEventCB cb, void *data);
|
||||
void network_manager_add_watch_interface_deleted (NetworkInadorHandle *handle, NetworkInadorInterfaceDeleteEventCB cb, void *data);
|
||||
void network_manager_add_watch_ip_added (NetworkInadorHandle *handle, NetworkInadorIPAddEventCB cb, void *data);
|
||||
void network_manager_add_watch_ip_deleted (NetworkInadorHandle *handle, NetworkInadorIPDelEventCB cb, void *data);
|
||||
|
||||
#endif /* __NETWORK_INADOR_EVENTS_H__ */
|
||||
|
|
@ -31,8 +31,9 @@
|
|||
#include <netlink/socket.h>
|
||||
#include <netlink/msg.h>
|
||||
|
||||
#include "network-inador.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "flist.h"
|
||||
#include "network-inador-events.h"
|
||||
|
||||
/* Para vigilar eventos */
|
||||
typedef struct {
|
||||
|
@ -40,6 +41,23 @@ typedef struct {
|
|||
unsigned int source;
|
||||
} NetlinkEventPair;
|
||||
|
||||
typedef struct _NetworkInadorEventList {
|
||||
NetworkInadorDHCPEventCB dhcp_event_cb;
|
||||
void *dhcp_event_data;
|
||||
|
||||
NetworkInadorInterfaceAddEventCB interface_add_event_cb;
|
||||
void *interface_add_event_data;
|
||||
NetworkInadorInterfaceUpdateEventCB interface_update_event_cb;
|
||||
void *interface_update_event_data;
|
||||
NetworkInadorInterfaceDeleteEventCB interface_del_event_cb;
|
||||
void *interface_del_event_data;
|
||||
|
||||
NetworkInadorIPAddEventCB ip_add_event_cb;
|
||||
void *ip_add_event_data;
|
||||
NetworkInadorIPDelEventCB ip_del_event_cb;
|
||||
void *ip_del_event_data;
|
||||
} NetworkInadorEventList;
|
||||
|
||||
/* La definición principal que engloba todo */
|
||||
struct _NetworkInadorHandle {
|
||||
struct NetworkInadorOps ops;
|
||||
|
@ -50,6 +68,9 @@ struct _NetworkInadorHandle {
|
|||
FList *route_v6_tables;
|
||||
FList *route_tables_names;
|
||||
|
||||
/* Auxiliar contador de la lista ligada de interfaces */
|
||||
int interfaces_counter;
|
||||
|
||||
/* Entradas para el resolv conf */
|
||||
FList *resolver_entries;
|
||||
int resolver_inotify_fd;
|
||||
|
@ -69,6 +90,8 @@ struct _NetworkInadorHandle {
|
|||
/* El pipe de vigilancia especial de las rutas eliminadas */
|
||||
int pipe_routes[2];
|
||||
unsigned int source_pipe_routes;
|
||||
|
||||
struct _NetworkInadorEventList notify_list;
|
||||
};
|
||||
|
||||
#endif /* __NETWORK_INADOR_PRIVATE_H__ */
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <linux/if_addr.h>
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
@ -38,8 +40,6 @@
|
|||
#define TRUE !FALSE
|
||||
#endif
|
||||
|
||||
typedef struct _NetworkInadorHandle NetworkInadorHandle;
|
||||
|
||||
/* Función que define una lectura desde un FD */
|
||||
typedef void (*NetworkInadorInputFunc) (void *, int, int);
|
||||
typedef void (*NetworkInadorChildWatchFunc) (void *, pid_t, int);
|
||||
|
@ -56,6 +56,10 @@ struct NetworkInadorOps {
|
|||
/* Ver si agregamos timers aquí */
|
||||
};
|
||||
|
||||
typedef struct _NetworkInadorHandle NetworkInadorHandle;
|
||||
typedef struct _Interface Interface;
|
||||
typedef struct _IPAddr IPAddr;
|
||||
|
||||
NetworkInadorHandle * network_inador_init_handle (struct NetworkInadorOps *network_inador_ops);
|
||||
void network_inador_destroy_handle (NetworkInadorHandle *handle);
|
||||
|
||||
|
@ -72,5 +76,30 @@ int interfaces_change_name (NetworkInadorHandle *handle, int index, char * new_n
|
|||
int interfaces_dhcp_client_run (NetworkInadorHandle *handle, int index, int type, uint32_t flags);
|
||||
int interfaces_dhcp_client_stop (NetworkInadorHandle *handle, int index);
|
||||
|
||||
/* Lista de getters */
|
||||
uint32_t *network_inador_list_ifaces (NetworkInadorHandle *handle);
|
||||
Interface * network_inador_get_iface (NetworkInadorHandle *handle, uint32_t index);
|
||||
const unsigned char *network_inador_iface_get_name (Interface *iface);
|
||||
uint32_t network_inador_iface_get_index (Interface *iface);
|
||||
uint32_t network_inador_iface_get_link_type (Interface *iface);
|
||||
uint32_t network_inador_iface_get_master_index (Interface *iface);
|
||||
uint32_t network_inador_iface_get_mtu (Interface *iface);
|
||||
uint16_t network_inador_iface_get_flags (Interface *iface);
|
||||
uint8_t network_inador_iface_get_is_wireless (Interface *iface);
|
||||
uint8_t network_inador_iface_get_num_ips (Interface *iface);
|
||||
IPAddr *network_inador_iface_get_ipaddr_by_index (Interface *iface, int index);
|
||||
Interface *network_inador_ipaddr_get_iface (IPAddr *ip_addr);
|
||||
uint8_t network_inador_ipaddr_get_family (IPAddr *ip_addr);
|
||||
uint8_t network_inador_ipaddr_get_prefix (IPAddr *ip_addr);
|
||||
uint8_t network_inador_ipaddr_has_local (IPAddr *ip_addr);
|
||||
uint8_t network_inador_ipaddr_has_brd (IPAddr *ip_addr);
|
||||
uint8_t network_inador_ipaddr_get_scope (IPAddr *ip_addr);
|
||||
uint32_t network_inador_ipaddr_get_flags (IPAddr *ip_addr);
|
||||
void network_inador_ipaddr_get_cacheinfo (IPAddr *ip_addr, struct ifa_cacheinfo *cacheinfo);
|
||||
void network_inador_ipaddr_get_addr (IPAddr *ip_addr, void *addr, int *addr_size);
|
||||
void network_inador_ipaddr_get_local_addr (IPAddr *ip_addr, void *addr, int *addr_size);
|
||||
void network_inador_ipaddr_get_brd_addr (IPAddr *ip_addr, void *addr, int *addr_size);
|
||||
const unsigned char *network_inador_ipaddr_get_label (IPAddr *ip_addr);
|
||||
|
||||
#endif /* __NETWORK_INADOR_H__ */
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
# Automake file for NetworkInador
|
||||
|
||||
bin_PROGRAMS = network-inador
|
||||
network_inador_SOURCES = main.c
|
||||
# manager.c manager.h
|
||||
sbin_PROGRAMS = network-inador resolvconf
|
||||
network_inador_SOURCES = main.c \
|
||||
manager.c manager-private.h \
|
||||
manager-interfaces.c manager-interfaces.h \
|
||||
manager-ip.c manager-ip.h
|
||||
|
||||
sbin_PROGRAMS = resolvconf
|
||||
resolvconf_SOURCES = resolv_conf_helper.c \
|
||||
../common/flist.c ../common/flist.h \
|
||||
../common/resolv_conf_parser.c ../common/resolv_conf_parser.h \
|
||||
|
@ -16,7 +17,7 @@ resolvconf_LDADD =
|
|||
libexec_PROGRAMS = ni-dhcp-helper
|
||||
|
||||
ni_dhcp_helper_SOURCES = ni-dhcp-iface-helper.c
|
||||
ni_dhcp_helper_CPPFLAGS = $(AM_CPPFLAGS)
|
||||
ni_dhcp_helper_CPPFLAGS = -I$(top_srcdir)/lib $(AM_CPPFLAGS)
|
||||
ni_dhcp_helper_CFLAGS = $(AM_CFLAGS)
|
||||
|
||||
#network_inador_CPPFLAGS = -DGAMEDATA_DIR=\"$(gamedatadir)/\" -DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS)
|
||||
|
|
|
@ -38,7 +38,8 @@
|
|||
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "network-inador.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "manager-private.h"
|
||||
|
||||
/* Usados para salir en caso de una señal */
|
||||
static int sigterm_pipe_fds[2] = { -1, -1 };
|
||||
|
@ -152,6 +153,7 @@ struct NetworkInadorOps network_ops = {
|
|||
int main (int argc, char *argv[]) {
|
||||
NetworkInadorHandle *handle;
|
||||
GMainLoop *loop = NULL;
|
||||
Manager *unix_socket_manager;
|
||||
|
||||
#if !defined(GLIB_VERSION_2_36)
|
||||
g_type_init ();
|
||||
|
@ -166,6 +168,8 @@ int main (int argc, char *argv[]) {
|
|||
|
||||
_main_setup_signal (loop);
|
||||
|
||||
unix_socket_manager = manager_new (handle, 0);
|
||||
|
||||
interfaces_dhcp_client_run (handle, 3, 1, 1);
|
||||
/*IPAddr addr;
|
||||
inet_pton (AF_INET, "192.19.5.6", &addr.sin_addr);
|
||||
|
|
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
* manager-interfaces.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2025 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <linux/if.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "manager-private.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
/* Empaquetador de datos */
|
||||
int _manager_pack_interface_info (unsigned char *buffer, Interface *iface) {
|
||||
const unsigned char *iface_name;
|
||||
uint32_t u32; uint16_t u16; uint8_t u8;
|
||||
int string_len;
|
||||
|
||||
iface_name = network_inador_iface_get_name (iface);
|
||||
string_len = strlen (iface_name);
|
||||
|
||||
u32 = network_inador_iface_get_index (iface);
|
||||
memcpy (&buffer[0], &u32, 4);
|
||||
|
||||
u32 = network_inador_iface_get_link_type (iface);
|
||||
memcpy (&buffer[4], &u32, 4);
|
||||
|
||||
u32 = network_inador_iface_get_master_index (iface);
|
||||
memcpy (&buffer[8], &u32, 4);
|
||||
|
||||
u32 = network_inador_iface_get_mtu (iface);
|
||||
memcpy (&buffer[12], &u32, 4);
|
||||
|
||||
u16 = network_inador_iface_get_flags (iface);
|
||||
memcpy (&buffer[16], &u16, 2);
|
||||
|
||||
buffer[18] = network_inador_iface_get_is_wireless (iface);
|
||||
buffer[19] = string_len;
|
||||
memcpy (&buffer[20], iface_name, string_len);
|
||||
|
||||
return 20 + string_len;
|
||||
}
|
||||
|
||||
/* Los comandos que verdaderamente envian */
|
||||
void _manager_send_interface (ManagerClientInfo *manager_client, Interface *iface, uint8_t is_event) {
|
||||
unsigned char buffer[32 + IFNAMSIZ + IFNAMSIZ];
|
||||
int size;
|
||||
|
||||
if (is_event) {
|
||||
buffer[0] = NET_INADOR_TYPE_EVENT;
|
||||
buffer[1] = NET_INADOR_EVENT_IFACE_ADDED;
|
||||
} else {
|
||||
buffer[0] = NET_INADOR_TYPE_RESPONSE;
|
||||
buffer[1] = NET_INADOR_RESPONSE_IFACE;
|
||||
}
|
||||
|
||||
size = 2 + _manager_pack_interface_info (&buffer[2], iface);
|
||||
|
||||
send (manager_client->fd, buffer, size, 0);
|
||||
}
|
||||
|
||||
void _manager_send_interface_deleted (ManagerClientInfo *manager_client, uint32_t index) {
|
||||
unsigned char buffer[32];
|
||||
|
||||
buffer[0] = NET_INADOR_TYPE_EVENT;
|
||||
buffer[1] = NET_INADOR_EVENT_IFACE_REMOVED;
|
||||
|
||||
memcpy (&buffer[2], &index, 4);
|
||||
|
||||
send (manager_client->fd, buffer, 6, 0);
|
||||
}
|
||||
|
||||
void _manager_interface_handle_list_interfaces (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
uint32_t *list_index;
|
||||
int g;
|
||||
Interface *iface;
|
||||
|
||||
list_index = network_inador_list_ifaces (manager_client->manager->handle);
|
||||
|
||||
/* TODO Analizar si podemos hacer todo en un solo envio incluyendo el comando de fin de listado */
|
||||
if (list_index == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_UNKNOWN, NET_INADOR_COMMAND_LIST_IFACES);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
g = 0;
|
||||
while (list_index[g] != 0) {
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, list_index[g]);
|
||||
if (iface == NULL) continue;
|
||||
|
||||
_manager_send_interface (manager_client, iface, FALSE);
|
||||
|
||||
g++;
|
||||
}
|
||||
|
||||
_manager_send_end_command (manager_client, NET_INADOR_COMMAND_LIST_IFACES);
|
||||
free (list_index);
|
||||
}
|
||||
|
||||
void _manager_interface_handle_get_interface (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
Interface *iface;
|
||||
uint32_t u32;
|
||||
|
||||
if (buffer_len < 6) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_GET_IFACE);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, NET_INADOR_COMMAND_GET_IFACE);
|
||||
return;
|
||||
}
|
||||
|
||||
_manager_send_interface (manager_client, iface, FALSE);
|
||||
}
|
||||
|
||||
void _manager_interface_handle_up_down_command (ManagerClientInfo *manager_client, uint8_t is_up, unsigned char *buffer, int buffer_len) {
|
||||
Interface *iface;
|
||||
uint32_t u32;
|
||||
int ret;
|
||||
|
||||
if (buffer_len < 6) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, (is_up ? NET_INADOR_COMMAND_IFACE_UP : NET_INADOR_COMMAND_IFACE_DOWN));
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, (is_up ? NET_INADOR_COMMAND_IFACE_UP : NET_INADOR_COMMAND_IFACE_DOWN));
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_up) {
|
||||
ret = interfaces_change_set_up (manager_client->manager->handle, u32);
|
||||
} else {
|
||||
ret = interfaces_change_set_down (manager_client->manager->handle, u32);
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
/* OK */
|
||||
_manager_send_executed (manager_client);
|
||||
} else {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_NOT_EXECUTED, (is_up ? NET_INADOR_COMMAND_IFACE_UP : NET_INADOR_COMMAND_IFACE_DOWN));
|
||||
}
|
||||
}
|
||||
|
||||
void _manager_interface_handle_change_name (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
Interface *iface;
|
||||
uint32_t u32;
|
||||
int ret;
|
||||
int name_len;
|
||||
unsigned char name[IFNAMSIZ];
|
||||
|
||||
if (buffer_len < 7) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
return;
|
||||
}
|
||||
|
||||
name_len = buffer[6];
|
||||
if (name_len == 0 || name_len >= IFNAMSIZ) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_BAD_STRING, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
return;
|
||||
}
|
||||
|
||||
if (name_len + 7 < buffer_len) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (name, &buffer[7], name_len);
|
||||
if (name[0] == 0) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_BAD_STRING, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
return;
|
||||
}
|
||||
name[name_len] = 0;
|
||||
|
||||
ret = interfaces_change_name (manager_client->manager->handle, u32, name);
|
||||
|
||||
if (ret == 0) {
|
||||
/* OK */
|
||||
_manager_send_executed (manager_client);
|
||||
} else {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_NOT_EXECUTED, NET_INADOR_COMMAND_IFACE_CHANGE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
void _manager_interface_handle_change_mtu (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
Interface *iface;
|
||||
uint32_t u32, new_mtu;
|
||||
int ret;
|
||||
int name_len;
|
||||
unsigned char name[IFNAMSIZ];
|
||||
|
||||
if (buffer_len < 10) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_IFACE_CHANGE_MTU);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, NET_INADOR_COMMAND_IFACE_CHANGE_MTU);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&new_mtu, &buffer[6], 4);
|
||||
//new_mtu = ntohl (new_mtu);
|
||||
|
||||
/* TODO: Revisar el máximo de MTU que se puede poner */
|
||||
ret = interfaces_change_mtu (manager_client->manager->handle, u32, new_mtu);
|
||||
|
||||
if (ret == 0) {
|
||||
/* OK */
|
||||
_manager_send_executed (manager_client);
|
||||
} else {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_NOT_EXECUTED, NET_INADOR_COMMAND_IFACE_CHANGE_MTU);
|
||||
}
|
||||
}
|
||||
|
||||
/* Los eventos que vienen desde la librería */
|
||||
void _manager_interface_added_event_cb (NetworkInadorHandle *handle, Interface *iface, void *data) {
|
||||
Manager *manager = (Manager *) data;
|
||||
GList *g;
|
||||
ManagerClientInfo *manager_client;
|
||||
|
||||
printf ("___ MANAGER ___ Informando interfaz agregada: %s (%i)\n", network_inador_iface_get_name (iface), network_inador_iface_get_index (iface));
|
||||
|
||||
for (g = manager->connected_client_list; g != NULL; g = g->next) {
|
||||
manager_client = (ManagerClientInfo *) g->data;
|
||||
|
||||
if (manager_client->wanted_events & NET_INADOR_EVENT_MASK_INTERFACES) {
|
||||
printf ("___ MANAGER ___ Informando a la conexión (%i)\n", manager_client->fd);
|
||||
_manager_send_interface (manager_client, iface, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _manager_interface_updated_event_cb (NetworkInadorHandle *handle, Interface *iface, void *data) {
|
||||
Manager *manager = (Manager *) data;
|
||||
GList *g;
|
||||
ManagerClientInfo *manager_client;
|
||||
|
||||
printf ("___ MANAGER ___ Informando interfaz actualizada: %s (%i)\n", network_inador_iface_get_name (iface), network_inador_iface_get_index (iface));
|
||||
|
||||
for (g = manager->connected_client_list; g != NULL; g = g->next) {
|
||||
manager_client = (ManagerClientInfo *) g->data;
|
||||
|
||||
if (manager_client->wanted_events & NET_INADOR_EVENT_MASK_INTERFACES) {
|
||||
printf ("___ MANAGER ___ Informando a la conexión (%i)\n", manager_client->fd);
|
||||
_manager_send_interface (manager_client, iface, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _manager_interface_deleted_event_cb (NetworkInadorHandle *handle, uint32_t index, void *data) {
|
||||
Manager *manager = (Manager *) data;
|
||||
GList *g;
|
||||
ManagerClientInfo *manager_client;
|
||||
|
||||
printf ("___ MANAGER ___ Informando interfaz eliminada: %i\n", index);
|
||||
|
||||
for (g = manager->connected_client_list; g != NULL; g = g->next) {
|
||||
manager_client = (ManagerClientInfo *) g->data;
|
||||
|
||||
if (manager_client->wanted_events & NET_INADOR_EVENT_MASK_INTERFACES) {
|
||||
printf ("___ MANAGER ___ Informando a la conexión (%i)\n", manager_client->fd);
|
||||
_manager_send_interface_deleted (manager_client, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* manager-interfaces.h
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2025 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __MANAGER_INTERFACES_H__
|
||||
#define __MANAGER_INTERFACES_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "manager-private.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
void _manager_interface_handle_list_interfaces (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len);
|
||||
void _manager_interface_handle_get_interface (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len);
|
||||
void _manager_interface_handle_up_down_command (ManagerClientInfo *manager_client, uint8_t is_up, unsigned char *buffer, int buffer_len);
|
||||
void _manager_interface_handle_change_name (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len);
|
||||
void _manager_interface_handle_change_mtu (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len);
|
||||
|
||||
void _manager_interface_added_event_cb (NetworkInadorHandle *handle, Interface *iface, void *data);
|
||||
void _manager_interface_updated_event_cb (NetworkInadorHandle *handle, Interface *iface, void *data);
|
||||
void _manager_interface_deleted_event_cb (NetworkInadorHandle *handle, uint32_t index, void *data);
|
||||
|
||||
|
||||
#endif /* __MANAGER_INTERFACES_H__ */
|
||||
|
|
@ -0,0 +1,318 @@
|
|||
/*
|
||||
* manager-ip.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2025 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_addr.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "manager-private.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
int _manager_pack_ip_info (unsigned char *buffer, IPAddr *ip_addr) {
|
||||
int family_size = 0;
|
||||
int label_len;
|
||||
int pos;
|
||||
int family;
|
||||
uint32_t index, flags;
|
||||
Interface *iface;
|
||||
int has_brd, has_local;
|
||||
struct ifa_cacheinfo cacheinfo;
|
||||
const char *label;
|
||||
|
||||
union {
|
||||
struct in_addr v4;
|
||||
struct in6_addr v6;
|
||||
} addr;
|
||||
|
||||
/* Familia y máscara */
|
||||
family = network_inador_ipaddr_get_family (ip_addr);
|
||||
if (family == AF_INET) {
|
||||
family_size = sizeof (struct in_addr);
|
||||
} else if (family == AF_INET6) {
|
||||
family_size = sizeof (struct in6_addr);
|
||||
}
|
||||
|
||||
iface = network_inador_ipaddr_get_iface (ip_addr);
|
||||
index = network_inador_iface_get_index (iface);
|
||||
memcpy (&buffer[0], &index, 4);
|
||||
buffer[4] = family;
|
||||
buffer[5] = network_inador_ipaddr_get_prefix (ip_addr);
|
||||
|
||||
has_local = network_inador_ipaddr_has_local (ip_addr);
|
||||
has_brd = network_inador_ipaddr_has_brd (ip_addr);
|
||||
|
||||
/* Los campos de bits */
|
||||
buffer[6] = 0;
|
||||
if (has_local) {
|
||||
buffer[6] |= 0x01;
|
||||
}
|
||||
if (has_brd) {
|
||||
buffer[6] |= 0x02;
|
||||
}
|
||||
|
||||
/* Byte scope y las flags */
|
||||
buffer[7] = network_inador_ipaddr_get_scope (ip_addr);
|
||||
flags = network_inador_ipaddr_get_flags (ip_addr);
|
||||
memcpy (&buffer[8], &flags, 4);
|
||||
|
||||
network_inador_ipaddr_get_cacheinfo (ip_addr, &cacheinfo);
|
||||
/* La información de marcas de tiempo de las IPs */
|
||||
memcpy (&buffer[12], &cacheinfo, 16);
|
||||
|
||||
/* La dirección principal */
|
||||
network_inador_ipaddr_get_addr (ip_addr, &addr, NULL);
|
||||
memcpy (&buffer[28], &addr, family_size);
|
||||
pos = 28 + family_size;
|
||||
if (has_local) {
|
||||
network_inador_ipaddr_get_local_addr (ip_addr, &addr, NULL);
|
||||
memcpy (&buffer[pos], &addr, family_size);
|
||||
pos += family_size;
|
||||
}
|
||||
|
||||
if (has_brd) {
|
||||
network_inador_ipaddr_get_brd_addr (ip_addr, &addr, NULL);
|
||||
memcpy (&buffer[pos], &addr, family_size);
|
||||
pos += family_size;
|
||||
}
|
||||
|
||||
label = network_inador_ipaddr_get_label (ip_addr);
|
||||
if (label[0] != 0) {
|
||||
label_len = strlen (label);
|
||||
buffer[pos] = label_len;
|
||||
pos++;
|
||||
|
||||
memcpy (&buffer[pos], &label, label_len);
|
||||
pos += label_len;
|
||||
} else {
|
||||
buffer[pos] = 0;
|
||||
pos++;
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
/* Los comandos que verdaderamente envian */
|
||||
void _manager_send_ipaddr (ManagerClientInfo *manager_client, IPAddr *ip_addr, uint8_t is_event) {
|
||||
unsigned char buffer[80];
|
||||
int size;
|
||||
|
||||
if (is_event) {
|
||||
buffer[0] = NET_INADOR_TYPE_EVENT;
|
||||
buffer[1] = NET_INADOR_EVENT_IPADDR_ADDED;
|
||||
} else {
|
||||
buffer[0] = NET_INADOR_TYPE_RESPONSE;
|
||||
buffer[1] = NET_INADOR_RESPONSE_IPADDR;
|
||||
}
|
||||
|
||||
size = 2 + _manager_pack_ip_info (&buffer[2], ip_addr);
|
||||
|
||||
send (manager_client->fd, buffer, size, 0);
|
||||
}
|
||||
|
||||
void _manager_send_ipaddr_deleted (ManagerClientInfo *manager_client, IPAddr *ip_addr) {
|
||||
unsigned char buffer[80];
|
||||
int family_size = 0;
|
||||
int pos;
|
||||
int family;
|
||||
uint32_t index;
|
||||
Interface *iface;
|
||||
int has_brd, has_local;
|
||||
|
||||
union {
|
||||
struct in_addr v4;
|
||||
struct in6_addr v6;
|
||||
} addr;
|
||||
|
||||
buffer[0] = NET_INADOR_TYPE_EVENT;
|
||||
buffer[1] = NET_INADOR_EVENT_IPADDR_REMOVED;
|
||||
|
||||
/* Familia y máscara */
|
||||
family = network_inador_ipaddr_get_family (ip_addr);
|
||||
if (family == AF_INET) {
|
||||
family_size = sizeof (struct in_addr);
|
||||
} else if (family == AF_INET6) {
|
||||
family_size = sizeof (struct in6_addr);
|
||||
}
|
||||
iface = network_inador_ipaddr_get_iface (ip_addr);
|
||||
index = network_inador_iface_get_index (iface);
|
||||
memcpy (&buffer[2], &index, 4);
|
||||
buffer[6] = family;
|
||||
buffer[7] = network_inador_ipaddr_get_prefix (ip_addr);
|
||||
|
||||
has_local = network_inador_ipaddr_has_local (ip_addr);
|
||||
|
||||
buffer[8] = 0;
|
||||
if (has_local) {
|
||||
buffer[8] |= 0x01;
|
||||
}
|
||||
|
||||
buffer[9] = 0;
|
||||
|
||||
network_inador_ipaddr_get_addr (ip_addr, &addr, NULL);
|
||||
memcpy (&buffer[10], &addr, family_size);
|
||||
pos = 10 + family_size;
|
||||
if (has_local) {
|
||||
network_inador_ipaddr_get_local_addr (ip_addr, &addr, NULL);
|
||||
memcpy (&buffer[pos], &addr, family_size);
|
||||
pos += family_size;
|
||||
}
|
||||
|
||||
send (manager_client->fd, buffer, pos, 0);
|
||||
}
|
||||
|
||||
void _manager_ip_handle_list_ips (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
Interface *iface;
|
||||
int family, ip_family;
|
||||
uint32_t u32;
|
||||
int c, total;
|
||||
IPAddr *ip_addr;
|
||||
|
||||
if (buffer_len < 7) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_LIST_IP);
|
||||
return;
|
||||
}
|
||||
|
||||
family = buffer[6];
|
||||
|
||||
if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_FAMILY, NET_INADOR_COMMAND_LIST_IP);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, NET_INADOR_COMMAND_LIST_IP);
|
||||
return;
|
||||
}
|
||||
|
||||
total = network_inador_iface_get_num_ips (iface);
|
||||
for (c = 0; c < total; c++) {
|
||||
ip_addr = network_inador_iface_get_ipaddr_by_index (iface, c);
|
||||
|
||||
ip_family = network_inador_ipaddr_get_family (ip_addr);
|
||||
|
||||
if (family != AF_UNSPEC && family != ip_family) continue;
|
||||
|
||||
_manager_send_ipaddr (manager_client, ip_addr, FALSE);
|
||||
}
|
||||
|
||||
_manager_send_end_command (manager_client, NET_INADOR_COMMAND_LIST_IP);
|
||||
}
|
||||
|
||||
void _manager_ip_handle_clear_ips (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len) {
|
||||
int family, ip_family;
|
||||
Interface *iface;
|
||||
IPAddr *ip_addr;
|
||||
uint32_t u32;
|
||||
int ret;
|
||||
int c, total;
|
||||
|
||||
if (buffer_len < 7) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INCOMPLETE_REQUEST, NET_INADOR_COMMAND_CLEAR_IP);
|
||||
return;
|
||||
}
|
||||
|
||||
family = buffer[6];
|
||||
|
||||
if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_FAMILY, NET_INADOR_COMMAND_CLEAR_IP);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (&u32, &buffer[2], 4);
|
||||
iface = network_inador_get_iface (manager_client->manager->handle, u32);
|
||||
if (iface == NULL) {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_INVALID_IFACE_INDEX, NET_INADOR_COMMAND_CLEAR_IP);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
total = network_inador_iface_get_num_ips (iface);
|
||||
for (c = 0; c < total; c++) {
|
||||
ip_addr = network_inador_iface_get_ipaddr_by_index (iface, c);
|
||||
|
||||
ip_family = network_inador_ipaddr_get_family (ip_addr);
|
||||
|
||||
if (family != AF_UNSPEC && family != ip_family) continue;
|
||||
|
||||
// AQUÍ GATUNO
|
||||
//ret |= ip_address_del_ip (manager_client->manager->handle, iface->index, ip_addr);
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
/* OK */
|
||||
_manager_send_executed (manager_client);
|
||||
} else {
|
||||
_manager_send_error (manager_client, NET_INADOR_ERROR_NOT_EXECUTED, NET_INADOR_COMMAND_CLEAR_IP);
|
||||
}
|
||||
}
|
||||
|
||||
/* Los eventos que vienen desde la librería */
|
||||
void _manager_ip_added_event_cb (NetworkInadorHandle *handle, IPAddr *ip_addr, void *data) {
|
||||
Manager *manager = (Manager *) data;
|
||||
GList *g;
|
||||
ManagerClientInfo *manager_client;
|
||||
Interface *iface;
|
||||
|
||||
iface = network_inador_ipaddr_get_iface (ip_addr);
|
||||
printf ("___ MANAGER ___ Informando ip agregada: %s (%i)\n", network_inador_iface_get_name (iface), network_inador_iface_get_index (iface));
|
||||
|
||||
for (g = manager->connected_client_list; g != NULL; g = g->next) {
|
||||
manager_client = (ManagerClientInfo *) g->data;
|
||||
|
||||
if (manager_client->wanted_events & NET_INADOR_EVENT_MASK_INTERFACES) {
|
||||
printf ("___ MANAGER ___ Informando a la conexión (%i)\n", manager_client->fd);
|
||||
_manager_send_ipaddr (manager_client, ip_addr, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _manager_ip_deleted_event_cb (NetworkInadorHandle *handle, IPAddr *ip_addr, void *data) {
|
||||
Manager *manager = (Manager *) data;
|
||||
GList *g;
|
||||
ManagerClientInfo *manager_client;
|
||||
Interface *iface;
|
||||
|
||||
iface = network_inador_ipaddr_get_iface (ip_addr);
|
||||
printf ("___ MANAGER ___ Informando ip eliminada: %s (%i)\n", network_inador_iface_get_name (iface), network_inador_iface_get_index (iface));
|
||||
|
||||
for (g = manager->connected_client_list; g != NULL; g = g->next) {
|
||||
manager_client = (ManagerClientInfo *) g->data;
|
||||
|
||||
if (manager_client->wanted_events & NET_INADOR_EVENT_MASK_IP) {
|
||||
printf ("___ MANAGER ___ Informando a la conexión (%i)\n", manager_client->fd);
|
||||
_manager_send_ipaddr_deleted (manager_client, ip_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* manager-ip.h
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2025 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __MANAGER_IP_H__
|
||||
#define __MANAGER_IP_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "manager-private.h"
|
||||
#include "network-inador-public.h"
|
||||
#include "network-inador-manager.h"
|
||||
|
||||
void _manager_ip_handle_list_ips (ManagerClientInfo *manager_client, unsigned char *buffer, int buffer_len);
|
||||
|
||||
void _manager_ip_added_event_cb (NetworkInadorHandle *handle, IPAddr *addr, void *data);
|
||||
void _manager_ip_deleted_event_cb (NetworkInadorHandle *handle, IPAddr *addr, void *data);
|
||||
|
||||
#endif /* __MANAGER_IP_H__ */
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* manager-private.h
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2024 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __MANAGER_PRIVATE_H__
|
||||
#define __MANAGER_PRIVATE_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "network-inador-public.h"
|
||||
|
||||
/* Para los clientes y sus respectivos eventos */
|
||||
typedef struct {
|
||||
int socket;
|
||||
|
||||
guint source;
|
||||
GList *connected_client_list;
|
||||
NetworkInadorHandle *handle;
|
||||
} Manager;
|
||||
|
||||
typedef struct {
|
||||
int fd;
|
||||
|
||||
/* Los eventos que quieren ser recibidos en este cliente */
|
||||
uint32_t wanted_events;
|
||||
guint source;
|
||||
Manager *manager;
|
||||
} ManagerClientInfo;
|
||||
|
||||
Manager * manager_new (NetworkInadorHandle *handle, int type);
|
||||
|
||||
void _manager_send_error (ManagerClientInfo *manager_client, int error, int orig_cmd);
|
||||
void _manager_send_executed (ManagerClientInfo *manager_client);
|
||||
void _manager_send_end_command (ManagerClientInfo *manager_client, int orig_cmd);
|
||||
|
||||
#endif /* __MANAGER_PRIVATE_H__ */
|
||||
|
1735
src/manager.c
1735
src/manager.c
File diff suppressed because it is too large
Load Diff
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* manager.h
|
||||
* This file is part of Network Inador
|
||||
*
|
||||
* Copyright (C) 2021 - Gatuno
|
||||
*
|
||||
* Network Inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network Inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network Inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __MANAGER_H__
|
||||
#define __MANAGER_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
int manager_init (NetworkInadorHandle *handle);
|
||||
void manager_send_event_interface_add (NetworkInadorHandle *handle, Interface *iface);
|
||||
void manager_send_event_interface_del (NetworkInadorHandle *handle, uint32_t index);
|
||||
void manager_send_event_interface_update (NetworkInadorHandle *handle, Interface *iface);
|
||||
void manager_send_event_ip_add (NetworkInadorHandle *handle, IPAddr *ip_addr);
|
||||
void manager_send_event_ip_del (NetworkInadorHandle *handle, IPAddr *ip_addr);
|
||||
void manager_send_event_dhcp_change (NetworkInadorHandle *handle, InterfaceDHCPClientInfo *dhcpc);
|
||||
void manager_send_event_route_add (NetworkInadorHandle *handle, Route *route);
|
||||
void manager_send_event_route_del (NetworkInadorHandle *handle, Route *route);
|
||||
void manager_send_event_route_update (NetworkInadorHandle *handle, Route *route);
|
||||
void manager_send_event_route_table_del (NetworkInadorHandle *handle, RouteTable *rtable);
|
||||
void manager_send_event_route_table_add (NetworkInadorHandle *handle, RouteTable *rtable);
|
||||
|
||||
#endif /* __MANAGER_H__ */
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
#ifndef __NETWOR_INADOR_MANAGER_H__
|
||||
#define __NETWOR_INADOR_MANAGER_H__
|
||||
|
||||
enum {
|
||||
NET_INADOR_TYPE_COMMAND = 1,
|
||||
NET_INADOR_TYPE_RESPONSE = 2,
|
||||
NET_INADOR_TYPE_RESPONSE_ERROR = 3,
|
||||
NET_INADOR_TYPE_RESPONSE_LISTING_END = 4,
|
||||
NET_INADOR_TYPE_EVENT = 16
|
||||
};
|
||||
|
||||
/* Lista de eventos */
|
||||
#define NET_INADOR_EVENT_MASK_INTERFACES 0x01
|
||||
#define NET_INADOR_EVENT_MASK_IP 0x02
|
||||
#define NET_INADOR_EVENT_MASK_DHCP_STATUS 0x04
|
||||
#define NET_INADOR_EVENT_MASK_ROUTES 0x08
|
||||
#define NET_INADOR_EVENT_MASK_ROUTE_TABLES 0x10
|
||||
|
||||
enum {
|
||||
NET_INADOR_COMMAND_LIST_IFACES = 1,
|
||||
|
||||
NET_INADOR_COMMAND_GET_IFACE,
|
||||
|
||||
NET_INADOR_COMMAND_IFACE_UP,
|
||||
NET_INADOR_COMMAND_IFACE_DOWN,
|
||||
|
||||
NET_INADOR_COMMAND_IFACE_CHANGE_NAME,
|
||||
|
||||
NET_INADOR_COMMAND_IFACE_CHANGE_MTU,
|
||||
|
||||
NET_INADOR_COMMAND_CREATE_BRIDGE = 16,
|
||||
NET_INADOR_COMMAND_CLEAR_MASTER,
|
||||
NET_INADOR_COMMAND_SET_MASTER,
|
||||
|
||||
NET_INADOR_COMMAND_LIST_IP = 32,
|
||||
NET_INADOR_COMMAND_CLEAR_IP,
|
||||
NET_INADOR_COMMAND_ADD_IP,
|
||||
NET_INADOR_COMMAND_REMOVE_IP,
|
||||
|
||||
NET_INADOR_COMMAND_RUN_DHCP = 48,
|
||||
NET_INADOR_COMMAND_STOP_DHCP,
|
||||
NET_INADOR_COMMAND_GET_DHCP_STATUS,
|
||||
|
||||
NET_INADOR_COMMAND_LIST_ROUTES = 64,
|
||||
NET_INADOR_COMMAND_ADD_ROUTE,
|
||||
NET_INADOR_COMMAND_REMOVE_ROUTE,
|
||||
|
||||
NET_INADOR_COMMAND_LIST_ROUTE_TABLES = 72,
|
||||
|
||||
NET_INADOR_COMMAND_SET_EVENT_MASK = 192,
|
||||
|
||||
/* Los siguientes comandos son para uso interno */
|
||||
NET_INADOR_COMMAND_DHCP_CLIENT_FEED = 224,
|
||||
NET_INADOR_COMMAND_RESOLVCONF_FEED = 225,
|
||||
NET_INADOR_COMMAND_RESOLVCONF_REMOVE = 226,
|
||||
};
|
||||
|
||||
enum {
|
||||
NET_INADOR_ERROR_UNKNOWN = 0,
|
||||
|
||||
NET_INADOR_ERROR_WRONG_COMMAND,
|
||||
NET_INADOR_ERROR_INCOMPLETE_REQUEST,
|
||||
NET_INADOR_ERROR_INVALID_IFACE_INDEX,
|
||||
NET_INADOR_ERROR_INVALID_FAMILY,
|
||||
NET_INADOR_ERROR_INVALID_VALUE,
|
||||
NET_INADOR_ERROR_NOT_EXECUTED,
|
||||
NET_INADOR_ERROR_BAD_STRING,
|
||||
};
|
||||
|
||||
enum {
|
||||
NET_INADOR_EVENT_IFACE_ADDED = 2,
|
||||
NET_INADOR_EVENT_IPADDR_ADDED,
|
||||
NET_INADOR_EVENT_IFACE_REMOVED,
|
||||
NET_INADOR_EVENT_IPADDR_REMOVED,
|
||||
|
||||
NET_INADOR_EVENT_DHCP_STATUS = 6,
|
||||
|
||||
NET_INADOR_EVENT_ROUTE_ADDED = 10,
|
||||
NET_INADOR_EVENT_ROUTE_REMOVED,
|
||||
|
||||
NET_INADOR_EVENT_ROUTE_TABLE_ADDED = 14,
|
||||
NET_INADOR_EVENT_ROUTE_TABLE_REMOVED,
|
||||
};
|
||||
|
||||
enum {
|
||||
NET_INADOR_RESPONSE_EXECUTED = 1,
|
||||
|
||||
NET_INADOR_RESPONSE_IFACE = 2,
|
||||
NET_INADOR_RESPONSE_IPADDR,
|
||||
|
||||
NET_INADOR_RESPONSE_DHCP_STATUS = 6,
|
||||
|
||||
NET_INADOR_RESPONSE_ROUTE = 10,
|
||||
|
||||
NET_INADOR_RESPONSE_ROUTE_TABLE = 14
|
||||
};
|
||||
|
||||
enum {
|
||||
NET_INADOR_DHCP_STATUS_SELECTING = 1,
|
||||
NET_INADOR_DHCP_STATUS_BOUND,
|
||||
NET_INADOR_DHCP_STATUS_RENEWED,
|
||||
|
||||
NET_INADOR_DHCP_STATUS_EXPIRED,
|
||||
NET_INADOR_DHCP_STATUS_FAILED,
|
||||
|
||||
};
|
||||
|
||||
#endif /* __NETWOR_INADOR_MANAGER_H__ */
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* resolv_manager.c
|
||||
* This file is part of Network-inador
|
||||
*
|
||||
* Copyright (C) 2022 - Félix Arreola Rodríguez
|
||||
*
|
||||
* Network-inador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Network-inador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Network-inador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "utils.h"
|
||||
#include "resolv_conf_parser.h"
|
||||
|
||||
GList * resolv_manager_clear_entries (GList *entries, char *prog) {
|
||||
GList *g, *next;
|
||||
ResolvConfEntry *entry;
|
||||
|
||||
g = entries;
|
||||
while (g != NULL) {
|
||||
next = g->next;
|
||||
|
||||
entry = (ResolvConfEntry *) g->data;
|
||||
|
||||
if (strcmp (entry->owner_prog, prog) == 0) {
|
||||
/* Hay que eliminar esta entrada, coincide por nombre de programa */
|
||||
|
||||
}
|
||||
|
||||
|
||||
g = next;
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
GList *resolv_manager_generate_entries (NetworkInadorHandle *handle) {
|
||||
|
||||
}
|
||||
|
||||
void resolv_manager_init (NetworkInadorHandle *handle) {
|
||||
FILE *fd;
|
||||
GList *entries;
|
||||
|
||||
/* Debemos primero instalar el manejador de eventos de escritura sobre el resolv.conf */
|
||||
|
||||
handle->resolver_entries = NULL;
|
||||
/* Luego, leer el resolv.conf */
|
||||
fd = fopen ("/etc/resolv.conf", "r");
|
||||
if (fd != NULL) {
|
||||
entries = resolv_manager_parse_file (fd, RESOLV_ORIGIN_RESOLVCONF);
|
||||
|
||||
handle->resolver_entries_from_file = entries;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* struct_addr_union.h
|
||||
* This file is part of NetworkInador
|
||||
*
|
||||
* Copyright (C) 2023 - Félix Arreola Rodríguez
|
||||
*
|
||||
* NetworkInador is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* NetworkInador is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with NetworkInador; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __STRUCT_ADDR_UNION_H__
|
||||
#define __STRUCT_ADDR_UNION_H__
|
||||
|
||||
typedef union {
|
||||
struct in_addr v4;
|
||||
struct in6_addr v6;
|
||||
} struct_addr;
|
||||
|
||||
#endif /* __STRUCT_ADDR_UNION_H__ */
|
||||
|
Loading…
Reference in New Issue