Update of questd to support igmp

This commit is contained in:
Stefan Nygren 2015-05-05 18:09:55 +02:00 committed by Martin Schröder
parent 762f1f534b
commit ff98718ec8
7 changed files with 251 additions and 4 deletions

View file

@ -6,8 +6,8 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=questd
PKG_VERSION:=2.0.0
PKG_RELEASE:=1
PKG_VERSION:=2.0.3
PKG_RELEASE:=3
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
@ -41,6 +41,7 @@ endef
define Package/questd/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_DIR) $(1)/tmp
$(INSTALL_BIN) $(PKG_BUILD_DIR)/questd $(1)/sbin/
$(CP) ./files/* $(1)/
endef

View file

@ -0,0 +1,5 @@
igmp snooping 2 proxy 1 lan2lan-snooping 0/0, rate-limit 0pps, priority -1
bridge device src-dev #tags lan-tci wan-tci group mode RxGroup source reporter timeout Index ExcludPt
br-lan eth5 eth2.1 00 0x0000 0xffffffff 0xe0027ffe EX 0xe0027ffe 0x00000000 0xc0a801f1 258 0x401e0001 -1
br-lan eth5 eth2.1 00 0x0000 0xffffffff 0xefc3ffff EX 0xefc3ffff 0x00000000 0xc0a801f1 258 0x400e0001 -1
br-lan eth5 eth2.1 00 0x0000 0xffffffff 0xefffffff EX 0xefffffff 0x00000000 0xc0a801f1 258 0x40070001 -1

View file

@ -2,8 +2,8 @@ CC = gcc
CFLAGS = -g -Wall
LOCLIBS =
LIBS = -luci -lubus -lubox -lpthread
OBJS = questd.o dumper.o port.o arping.o usb.o ndisc.o dslstats.o tools.o
SRCS = questd.c dumper.c port.c arping.c usb.c ndisc.c dslstats.c tools.c
OBJS = questd.o dumper.o port.o arping.o usb.o ndisc.o dslstats.o tools.o igmp.o
SRCS = questd.c dumper.c port.c arping.c usb.c ndisc.c dslstats.c tools.c igmp.c
LIBSRCS =
ISRCS = questd.h

184
questd/src/igmp.c Normal file
View file

@ -0,0 +1,184 @@
/*
* igmp.c
*
* Created on: May 5, 2015
* Author: stefan
*/
#include "questd.h"
#include "igmp.h"
static void tokenize_line(char *str, const char **tokens, size_t tokens_size) {
char *ptr = str;
const char **token = tokens; // = line;
while (*ptr) {
if (*ptr == '\t' || *ptr == ' ' || *ptr == '\n') {
*ptr++ = 0;
continue;
} else {
*token++ = ptr;
tokens_size--;
if (tokens_size == 0) {
return;
}
while (*ptr && *ptr != '\t' && *ptr != ' ' && *ptr != '\n')
ptr++;
continue;
}
ptr++;
}
}
int igmp_rpc(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
struct blob_attr *msg) {
struct blob_buf bb;
int row = 0, idx = 0;
FILE *in;
char line[256];
IGMPtable table[128];
const char *tokens[32] = { 0 };
void *object, *array,*t;
blob_buf_init(&bb, 0);
if (!(in = fopen("/tmp/igmp_snooping", "r")))
return 1;
array = blobmsg_open_array(&bb, "tables");
struct element {
char *string;
struct element *next;
};
while (fgets(line, sizeof(line), in)) {
if (row < 2) {
row++;
continue;
}
//remove_newline(line);
tokenize_line(line, tokens, sizeof(tokens) / sizeof(char*));
int tok_pos = 0;
const char **token = tokens;
const char *names[] = { "bridge", "dev", "srcdev", "tags", "lantci",
"wantci", "group", "mode", "rxgroup", "source", "reporter",
"timeout", "index", "excludept" };
while (*token) {
printf("<%d>\n",tok_pos);
switch (tok_pos) {
case 0:
snprintf(table[row-2].bridge,"%s",token);
printf("%s\n%s\n",table[row-2].bridge,token);
break;
case 1:
snprintf(table[row-2].device,"%s",token);
break;
case 2:
snprintf(table[row - 2].tags ,"%s",token);
break;
case 3: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].lantci, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 4: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].wantci, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 5: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].group, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 6:
snprintf(table[row - 2].mode,"%s",token);
break;
case 7: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].RxGroup, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 8: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].source, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 9: {
uint32_t ip;
char str[17];
sscanf(token, "%8x", &ip);
sprintf(table[row - 2].reporter, "%d.%d.%d.%d", (ip >> 16),
(ip >> 8) & 0xff, ip & 0xff, (ip >> 24) & 0xff);
}
break;
case 10:
snprintf(table[row - 2].timeout,"%s",token);
break;
case 11:
snprintf(table[row - 2].Index,"%s",token);
break;
case 12:
snprintf(table[row - 2].ExcludPt,"%s",token);
break;
default:
break;
}
token++;
tok_pos++;
printf("</%d\n>",tok_pos);
}
row++;
}
for (idx = 0; idx < (row - 2); idx++) {
object = blobmsg_open_table(&bb, NULL);
blobmsg_add_string(&bb,"bridge", table[idx].bridge);
blobmsg_add_string(&bb,"device", table[idx].device);
blobmsg_add_string(&bb,"srcdev", table[idx].srcdev);
blobmsg_add_string(&bb,"tags", table[idx].tags);
blobmsg_add_string(&bb,"lantci", table[idx].lantci);
blobmsg_add_string(&bb,"wantci", table[idx].wantci);
blobmsg_add_string(&bb,"group", table[idx].group);
blobmsg_add_string(&bb,"mode", table[idx].mode);
blobmsg_add_string(&bb,"rxgroup", table[idx].RxGroup);
blobmsg_add_string(&bb,"source", table[idx].source);
blobmsg_add_string(&bb,"reporter", table[idx].reporter);
blobmsg_add_string(&bb,"timeout", table[idx].timeout);
blobmsg_add_string(&bb,"index", table[idx].Index);
blobmsg_add_string(&bb,"excludpt", table[idx].ExcludPt);
blobmsg_close_table(&bb, object);
}
blobmsg_close_array(&bb, array);
ubus_send_reply(ctx, req, bb.head);
return 0;
}

38
questd/src/igmp.h Normal file
View file

@ -0,0 +1,38 @@
/*
* igmp.h
*
* Created on: May 5, 2015
* Author: stefan
*/
#ifndef IGMP_H_
#define IGMP_H_
#ifndef NULL
#define NULL ((void *) 0)
#endif
int igmp_rpc(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
struct blob_attr *msg);
typedef struct igmp_table {
char bridge[32];
char device[32];
char srcdev[32];
char tags[32];
char lantci[32];
char wantci[32];
char group[32];
char mode[32];
char RxGroup[32];
char source[32];
char reporter[32];
char timeout[32];
char Index[32];
char ExcludPt[32];
}IGMPtable;
#endif /* IGMP_H_ */

View file

@ -1297,6 +1297,21 @@ quest_router_connected_clients6(struct ubus_context *ctx, struct ubus_object *ob
return 0;
}
static int
quest_router_igmp_table(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
struct blob_attr *msg)
{
struct blob_attr *tb[__QUEST_MAX];
blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
blob_buf_init(&bb, 0);
router_dump_connected_clients6(&bb);
ubus_send_reply(ctx, req, bb.head);
return 0;
}
static int
quest_router_clients6(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
@ -1492,6 +1507,7 @@ static struct ubus_method router_object_methods[] = {
UBUS_METHOD_NOARG("clients6", quest_router_clients6),
UBUS_METHOD_NOARG("connected", quest_router_connected_clients),
UBUS_METHOD_NOARG("connected6", quest_router_connected_clients6),
UBUS_METHOD_NOARG("igmptable", igmp_rpc),
UBUS_METHOD("sta", quest_router_wireless_stas, wl_policy),
UBUS_METHOD_NOARG("stas", quest_router_stas),
UBUS_METHOD("ports", quest_router_ports, network_policy),
@ -1683,6 +1699,8 @@ quest_ubus_reconnect_timer(struct uloop_timeout *timeout)
quest_ubus_add_fd();
}
static void
quest_ubus_connection_lost(struct ubus_context *ctx)
{

View file

@ -21,6 +21,7 @@
#include <libubus.h>
#include "dslstats.h"
#include "igmp.h"
#define MAX_VIF 8
#define MAX_NETWORK 16