Agrego tipo bridge y vlan a interfaces.

master
Félix Arreola Rodríguez 2018-08-17 19:43:06 -05:00
parent 56e9f4b67d
commit 5e57e34de4
3 changed files with 44 additions and 38 deletions

View File

@ -44,7 +44,7 @@
#include "interfaces.h"
Interface * interfaces_locate_by_index (Interface *list, int index);
static void _interfaces_append_ipv4_to_struct (Interface *interface, struct in_addr address, uint32_t prefix);
static IPv4 * _interfaces_append_ipv4_to_struct (Interface *interface, struct in_addr address, uint32_t prefix);
int global_nl_seq = 1;
@ -74,7 +74,7 @@ Interface * interfaces_locate_by_index (Interface *list, int index) {
return NULL;
}
static void _interfaces_append_ipv4_to_struct (Interface *interface, struct in_addr address, uint32_t prefix) {
static IPv4 * _interfaces_append_ipv4_to_struct (Interface *interface, struct in_addr address, uint32_t prefix) {
IPv4 *new_addr, *last;
new_addr = (IPv4 *) malloc (sizeof (IPv4));
@ -95,6 +95,8 @@ static void _interfaces_append_ipv4_to_struct (Interface *interface, struct in_a
last->next = new_addr;
}
return new_addr;
}
static IPv4 * _interfaces_serach_ipv4 (Interface *interface, struct in_addr address, uint32_t prefix) {
@ -191,12 +193,12 @@ void interfaces_add_or_update_rtnl_link (NetworkInadorHandle *handle, struct nlm
iface = NLMSG_DATA(h);
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct ifinfomsg));
printf ("Mensaje de nueva interfaz: %i\n", iface->ifi_index);
//printf ("Mensaje de nueva interfaz: %i\n", iface->ifi_index);
new = interfaces_locate_by_index (handle->interfaces, iface->ifi_index);
/* Si el objeto interface no existe, crearlo y ligarlo en la lista de interfaces */
if (new == NULL) {
printf ("Creando...\n");
//printf ("Creando...\n");
new = malloc (sizeof (Interface));
memset (new, 0, sizeof (Interface));
new->next = NULL;
@ -260,13 +262,13 @@ void interfaces_add_or_update_rtnl_link (NetworkInadorHandle *handle, struct nlm
case IFLA_MASTER:
if (first_time) {
memcpy (&new->master_index, RTA_DATA (attribute), 4);
printf ("Interface %d has master: %i\n", iface->ifi_index, new->master_index);
//printf ("Interface %d has master: %i\n", iface->ifi_index, new->master_index);
}
break;
case IFLA_MTU:
memcpy (&new->mtu, RTA_DATA (attribute), attribute->rta_len);
printf ("Interface %d has mtu: %u\n", iface->ifi_index, new->mtu);
//printf ("Interface %d has mtu: %u\n", iface->ifi_index, new->mtu);
break;
case IFLA_OPERSTATE:
{
@ -274,7 +276,7 @@ void interfaces_add_or_update_rtnl_link (NetworkInadorHandle *handle, struct nlm
memcpy (&operstate, RTA_DATA (attribute), sizeof (operstate));
}
break;
case IFLA_AF_SPEC:
/*case IFLA_AF_SPEC:
{
struct rtattr * sub_attr;
int sub_len;
@ -297,7 +299,7 @@ void interfaces_add_or_update_rtnl_link (NetworkInadorHandle *handle, struct nlm
sub_attr = (struct rtattr *) (((char *) sub_attr) + RTA_ALIGN (nla_len));
}
}
break;
break;*/
case IFLA_LINKINFO:
{
struct rtattr * nest_attr;
@ -311,38 +313,22 @@ void interfaces_add_or_update_rtnl_link (NetworkInadorHandle *handle, struct nlm
sub_len = nest_attr->rta_len;
if (sub_len > nest_size) {
printf ("Los sub atributos se acabaron prematuramente\n");
//printf ("Los sub atributos se acabaron prematuramente\n");
break;
}
printf ("Interface %d, IFLA_LINKINFO, sub attributo type: %i\n", iface->ifi_index, nest_attr->rta_type);
//printf ("Interface %d, IFLA_LINKINFO, sub attributo type: %i\n", iface->ifi_index, nest_attr->rta_type);
if (nest_attr->rta_type == IFLA_INFO_KIND) {
printf ("IFLA_INFO_KIND: %s\n", RTA_DATA (nest_attr));
} else if (nest_attr->rta_type == IFLA_INFO_DATA) {
printf ("Segunda anidación: IFLA_INFO_DATA: size: %d\n", nest_attr->rta_len);
struct rtattr *nest2_attr;
int nest2_size;
int sub2_len;
nest2_size = nest_attr->rta_len;
nest2_attr = RTA_DATA (nest_attr);
while (nest2_size > sizeof (nest2_attr)) {
sub2_len = nest2_attr->rta_len;
printf ("------ Nest2_attr->rta_len = %d. El tamaño es: %d\n", sub2_len, nest2_size);
if (sub2_len > nest2_size) {
printf ("Los sub atributos se acabaron prematuramente\n");
break;
}
printf ("Interface %d, IFLA_INFO_DATA, sub attributo type: %i, size: %d\n", iface->ifi_index, nest2_attr->rta_type, nest2_attr->rta_len);
//if (
nest2_size -= RTA_ALIGN (sub2_len);
nest2_attr = (struct rtattr *) (((char *) nest2_attr) + RTA_ALIGN (sub2_len));
if (strcmp (RTA_DATA (nest_attr), "vlan") == 0) {
new->is_vlan = 1;
} else if (strcmp (RTA_DATA (nest_attr), "nlmon") == 0) {
new->is_nlmon = 1;
} else if (strcmp (RTA_DATA (nest_attr), "bridge") == 0) {
new->is_bridge = 1;
}
}
nest_size -= RTA_ALIGN (sub_len);
nest_attr = (struct rtattr *) (((char *) nest_attr) + RTA_ALIGN (sub_len));
}
@ -462,8 +448,11 @@ void interfaces_add_or_update_ipv4 (NetworkInadorHandle *handle, struct nlmsghdr
if (new == NULL) {
printf ("Agregando IP a la lista de IP's\n");
_interfaces_append_ipv4_to_struct (iface, ip, prefix);
new = _interfaces_append_ipv4_to_struct (iface, ip, prefix);
}
new->flags = addr->ifa_flags;
}
void interfaces_del_ipv4 (NetworkInadorHandle *handle, struct nlmsghdr *h) {

View File

@ -56,9 +56,11 @@ enum {
MANAGER_RESPONSE_LIST_ROUTES,
};
#define MANAGER_IFACE_TYPE_WIRELESS 2
#define MANAGER_IFACE_TYPE_BRIDGE 4
#define MANAGER_IFACE_TYPE_LOOPBACK 8
#define MANAGER_IFACE_TYPE_WIRELESS 0x02
#define MANAGER_IFACE_TYPE_BRIDGE 0x04
#define MANAGER_IFACE_TYPE_LOOPBACK 0x8
#define MANAGER_IFACE_TYPE_VLAN 0x10
#define MANAGER_IFACE_TYPE_NLMON 0x20
static void _manager_send_invalid_request (int sock, struct sockaddr_un *client, socklen_t socklen, int seq) {
unsigned char buffer[128];
@ -106,6 +108,14 @@ static void _manager_send_list_interfaces (NetworkInadorHandle *handle, int sock
flags |= MANAGER_IFACE_TYPE_BRIDGE;
}
if (iface_g->is_vlan) {
flags |= MANAGER_IFACE_TYPE_VLAN;
}
if (iface_g->is_nlmon) {
flags |= MANAGER_IFACE_TYPE_NLMON;
}
buffer[pos + 1] = flags;
/* Copiar la mac address */

View File

@ -33,26 +33,33 @@ typedef struct _IPv4 {
struct in_addr sin_addr;
uint32_t prefix;
unsigned char flags;
struct _IPv4 *next;
} IPv4;
typedef struct _Interface {
char name[IFNAMSIZ];
int ifi_type;
char real_hw[ETHER_ADDR_LEN * 2 + 1];
unsigned char real_hw[ETHER_ADDR_LEN * 2 + 1];
unsigned int index;
/* Para las interfaces dentro de un bridge */
unsigned int master_index;
unsigned int mtu;
/* Banderas estilo ioctl */
short flags;
char wireless_protocol[IFNAMSIZ];
/* Tipo */
int is_loopback;
int is_wireless;
int is_bridge;
int is_vlan;
int is_nlmon;
IPv4 *v4_address;