init (first ubus try)

This commit is contained in:
Martin/Geno 2018-07-16 08:21:11 +02:00
commit 0decaae1eb
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A
9 changed files with 403 additions and 0 deletions

11
MAINTAINERS Normal file
View File

@ -0,0 +1,11 @@
# _______ ________ __
# | |.-----.-----.-----.| | | |.----.| |_
# | - || _ | -__| || | | || _|| _|
# |_______|| __|_____|__|__||________||__| |____|
# |__| W I R E L E S S F R E E D O M
#
# People listed here are managing the OpenWrt telephony
feed. Use
# alphabetical order when updating the list.
Martin/Geno <geno+dev@fireorbit.de>

28
README.md Normal file
View File

@ -0,0 +1,28 @@
# Wifi control deamon packages feed
## Description
This is an OpenWrt package feed containing community
maintained wifictld packages.
## Usage
To use these packages, add the following line to the
feeds.conf
in the OpenWrt buildroot:
```
src-git wifictld git@dev.sum7.eu:wifictld/wifictld.git
```
This feed should be included and enabled by default in the
OpenWrt buildroot. To install all its package definitions,
run:
```
./scripts/feeds update wifictld
./scripts/feeds install -a -p wifictld
```
The wifictld packages should now appear in menuconfig.

View File

@ -0,0 +1,62 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=wifictld
PKG_VERSION:=1.0
PKG_RELEASE:=1
PKG_MAINTAINER:=Martin/Geno <geno+dev@fireorbit.de>
PKG_LICENSE:=APGL
include $(INCLUDE_DIR)/package.mk
define Package/wifictld/Default
SECTION:=net
CATEGORY:=Network
TITLE:=wireless control daemon
URL:=https://dev.sum7.eu/wifictld/wifictld
DEPENDS:=+libubus +libubox
endef
define Package/wifictld
$(call Package/wifictld/Default)
TITLE+= (full)
VARIANT:=full
TARGET_CFLAGS += -DDEBUG
endef
define Package/wifictld-mini
$(call Package/wifictld/Default)
TITLE+= (local)
VARIANT:=mini
TARGET_CFLAGS += -DMINI
endef
define Package/wifictld/description
$(call Package/wifictld-mini/Default)
endef
define Package/wifictld-mini/description
This package is a wifi control daemon
which use ubus to communicate with hostapd
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
cp ./src/* $(PKG_BUILD_DIR)
$(Build/Patch)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) CC="$(TARGET_CC)" CFLAGS="$(TARGET_CFLAGS)"
endef
define Package/wifictld/install
$(INSTALL_DIR) $(1)/usr/sbin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/wifictld $(1)/usr/sbin/
endef
Package/wifictld-mini/install = $(Package/hostapd/install)
$(eval $(call BuildPackage,wifictld))
$(eval $(call BuildPackage,wifictld-mini))

View File

@ -0,0 +1,23 @@
all: wifictld
CC = gcc
CFLAGS = -Wall
LDFLAGS = -lubox -lubus
DEPS = $(wildcard *.h)
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
wifictld: $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
.PHONY: clean
clean:
rm -f wifictld *.o

View File

@ -0,0 +1,14 @@
#ifndef __WIFICTLD_LOG_H
#define __WIFICTLD_LOG_H
#ifdef DEBUG
#define DEBUG_COMPILE 1
#else
#define DEBUG_COMPILE 0
#endif
#define debug_print(fmt) \
do { if (DEBUG_COMPILE) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
__LINE__, __func__); } while (0)
#endif

View File

@ -0,0 +1,105 @@
#ifndef IEEE802_11_DEFS_H
#define IEEE802_11_DEFS_H
//TODO showd use hostapd/../src/common/ieee802_11_defs.h
/* Status codes (IEEE Std 802.11-2016, 9.4.1.9, Table 9-46) */
#define WLAN_STATUS_SUCCESS 0
#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
#define WLAN_STATUS_TDLS_WAKEUP_ALTERNATE 2
#define WLAN_STATUS_TDLS_WAKEUP_REJECT 3
#define WLAN_STATUS_SECURITY_DISABLED 5
#define WLAN_STATUS_UNACCEPTABLE_LIFETIME 6
#define WLAN_STATUS_NOT_IN_SAME_BSS 7
#define WLAN_STATUS_CAPS_UNSUPPORTED 10
#define WLAN_STATUS_REASSOC_NO_ASSOC 11
#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
#define WLAN_STATUS_CHALLENGE_FAIL 15
#define WLAN_STATUS_AUTH_TIMEOUT 16
#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
#define WLAN_STATUS_ASSOC_DENIED_RATES 18
#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22
#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23
#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24
#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25
#define WLAN_STATUS_ASSOC_DENIED_NO_HT 27
#define WLAN_STATUS_R0KH_UNREACHABLE 28
#define WLAN_STATUS_ASSOC_DENIED_NO_PCO 29
#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30
#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31
#define WLAN_STATUS_UNSPECIFIED_QOS_FAILURE 32
#define WLAN_STATUS_DENIED_INSUFFICIENT_BANDWIDTH 33
#define WLAN_STATUS_DENIED_POOR_CHANNEL_CONDITIONS 34
#define WLAN_STATUS_DENIED_QOS_NOT_SUPPORTED 35
#define WLAN_STATUS_REQUEST_DECLINED 37
#define WLAN_STATUS_INVALID_PARAMETERS 38
#define WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES 39
#define WLAN_STATUS_INVALID_IE 40
#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41
#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42
#define WLAN_STATUS_AKMP_NOT_VALID 43
#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44
#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45
#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46
#define WLAN_STATUS_TS_NOT_CREATED 47
#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48
#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49
#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50
#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51
#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52
#define WLAN_STATUS_INVALID_PMKID 53
#define WLAN_STATUS_INVALID_MDIE 54
#define WLAN_STATUS_INVALID_FTIE 55
#define WLAN_STATUS_REQUESTED_TCLAS_NOT_SUPPORTED 56
#define WLAN_STATUS_INSUFFICIENT_TCLAS_PROCESSING_RESOURCES 57
#define WLAN_STATUS_TRY_ANOTHER_BSS 58
#define WLAN_STATUS_GAS_ADV_PROTO_NOT_SUPPORTED 59
#define WLAN_STATUS_NO_OUTSTANDING_GAS_REQ 60
#define WLAN_STATUS_GAS_RESP_NOT_RECEIVED 61
#define WLAN_STATUS_STA_TIMED_OUT_WAITING_FOR_GAS_RESP 62
#define WLAN_STATUS_GAS_RESP_LARGER_THAN_LIMIT 63
#define WLAN_STATUS_REQ_REFUSED_HOME 64
#define WLAN_STATUS_ADV_SRV_UNREACHABLE 65
#define WLAN_STATUS_REQ_REFUSED_SSPN 67
#define WLAN_STATUS_REQ_REFUSED_UNAUTH_ACCESS 68
#define WLAN_STATUS_INVALID_RSNIE 72
#define WLAN_STATUS_U_APSD_COEX_NOT_SUPPORTED 73
#define WLAN_STATUS_U_APSD_COEX_MODE_NOT_SUPPORTED 74
#define WLAN_STATUS_BAD_INTERVAL_WITH_U_APSD_COEX 75
#define WLAN_STATUS_ANTI_CLOGGING_TOKEN_REQ 76
#define WLAN_STATUS_FINITE_CYCLIC_GROUP_NOT_SUPPORTED 77
#define WLAN_STATUS_CANNOT_FIND_ALT_TBTT 78
#define WLAN_STATUS_TRANSMISSION_FAILURE 79
#define WLAN_STATUS_REQ_TCLAS_NOT_SUPPORTED 80
#define WLAN_STATUS_TCLAS_RESOURCES_EXCHAUSTED 81
#define WLAN_STATUS_REJECTED_WITH_SUGGESTED_BSS_TRANSITION 82
#define WLAN_STATUS_REJECT_WITH_SCHEDULE 83
#define WLAN_STATUS_REJECT_NO_WAKEUP_SPECIFIED 84
#define WLAN_STATUS_SUCCESS_POWER_SAVE_MODE 85
#define WLAN_STATUS_PENDING_ADMITTING_FST_SESSION 86
#define WLAN_STATUS_PERFORMING_FST_NOW 87
#define WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW 88
#define WLAN_STATUS_REJECT_U_PID_SETTING 89
#define WLAN_STATUS_REFUSED_EXTERNAL_REASON 92
#define WLAN_STATUS_REFUSED_AP_OUT_OF_MEMORY 93
#define WLAN_STATUS_REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED 94
#define WLAN_STATUS_QUERY_RESP_OUTSTANDING 95
#define WLAN_STATUS_REJECT_DSE_BAND 96
#define WLAN_STATUS_TCLAS_PROCESSING_TERMINATED 97
#define WLAN_STATUS_TS_SCHEDULE_CONFLICT 98
#define WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL 99
#define WLAN_STATUS_MCCAOP_RESERVATION_CONFLICT 100
#define WLAN_STATUS_MAF_LIMIT_EXCEEDED 101
#define WLAN_STATUS_MCCA_TRACK_LIMIT_EXCEEDED 102
#define WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT 103
#define WLAN_STATUS_ASSOC_DENIED_NO_VHT 104
#define WLAN_STATUS_ENABLEMENT_DENIED 105
#define WLAN_STATUS_RESTRICTION_FROM_AUTHORIZED_GDB 106
#define WLAN_STATUS_AUTHORIZATION_DEENABLED 107
#define WLAN_STATUS_FILS_AUTHENTICATION_FAILURE 112
#define WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER 113
#endif

View File

@ -0,0 +1,120 @@
#include <stdlib.h>
#include <string.h>
#include <libubox/blobmsg.h>
#include <libubox/ulog.h>
#include <libubus.h>
#include "temp_defs.h"
#include "log.h"
static struct blob_buf b;
struct ubus_context *ctx_main;
static int receive_request(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg)
{
const char *attr_name, *addr;
uint16_t freq, ssi_signal = -1;
struct blob_attr *pos;
int rem = blobmsg_data_len(msg);
// read msg
blobmsg_for_each_attr(pos, msg, rem) {
attr_name = blobmsg_name(pos);
if (!strcmp(attr_name, "address")){
addr = blobmsg_get_string(pos);
} else if(!strcmp(attr_name, "signal")){
ssi_signal = blobmsg_get_u32(pos);
} else if(!strcmp(attr_name, "freq")){
freq = blobmsg_get_u32(pos);
}
}
/*
blob_buf_init(&b, 0);
blob_put_u32(&b, 0, WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA);
ubus_send_reply(ctx, req, b.head);
*/
if (!strcmp(method, "probe")) {
ULOG_NOTE("probe\n");
return WLAN_STATUS_SUCCESS;
}
if (!strcmp(method, "auth")) {
if (freq <= 5000) {
ULOG_WARN("auth [drop]-> %s\n", addr);
return WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
}
ULOG_WARN("auth [accept]-> %s\n", addr);
}
// learn by freq and address
ULOG_INFO("%s\n", method);
return WLAN_STATUS_SUCCESS;
}
struct ubus_subscriber sub = {
.cb = receive_request,
};
void wifictld_ubus_interfaces(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv)
{
int ret = 0;
const char *str = "notify_response";
if (obj->path == NULL || !strstr(obj->path, "hostapd.")) {
return;
}
//switch to notify
blob_buf_init(&b, 0);
blobmsg_add_u32(&b, str, 1);
ret = ubus_invoke(ctx, obj->id, str, b.head, NULL, NULL, 100);
if (ret) {
ULOG_ERR("Error while register response for event '%s': %s\n", obj->path, ubus_strerror(ret));
}
//subscribe
ret = ubus_subscribe(ctx, &sub, obj->id);
if (ret) {
ULOG_ERR("Error while register subscribe for event '%s': %s\n", obj->path, ubus_strerror(ret));
}
printf("sub %s: %d:%d\n", obj->path, obj->id, obj->type_id);
}
int wifictld_ubus_init()
{
int ret = 0;
ctx_main = ubus_connect(NULL);
if (!ctx_main) {
ULOG_ERR("Failed to connect to ubus");
return 1;
}
ret = ubus_register_subscriber(ctx_main, &sub);
if (ret) {
ULOG_ERR("Error while registering subscriber: %s", ubus_strerror(ret));
ubus_free(ctx_main);
return 2;
}
ubus_lookup(ctx_main, NULL, wifictld_ubus_interfaces, NULL);
ubus_add_uloop(ctx_main);
return 0;
}
void wifictld_ubus_close()
{
ubus_free(ctx_main);
}

View File

@ -0,0 +1,9 @@
#ifndef __WIFICTLD_UBUS_EVENT_H
#define __WIFICTLD_UBUS_EVENT_H
#include <libubus.h>
int wifictld_ubus_init();
void wifictld_ubus_close();
#endif

View File

@ -0,0 +1,31 @@
#include <stdio.h>
#include <libubox/ulog.h>
#include <libubus.h>
#include "ubus_events.h"
int main(void)
{
int ret = 0;
#ifdef MINI
ULOG_NOTE("start wifictld (mini)\n");
#else
ULOG_NOTE("start wifictld (full)\n");
#endif
uloop_init();
//bind to loop
ret = wifictld_ubus_init();
if (ret)
{
return ret;
}
uloop_run();
uloop_done();
wifictld_ubus_close();
return 0;
}