mirror of
https://github.com/Ysurac/openmptcprouter-feeds.git
synced 2025-03-09 15:40:03 +00:00
fix 60xx
This commit is contained in:
parent
62982618fb
commit
0b03f823c2
42 changed files with 16095 additions and 223 deletions
92
fast-classifier/Makefile
Executable file
92
fast-classifier/Makefile
Executable file
|
@ -0,0 +1,92 @@
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
|
PKG_NAME:=fast-classifier
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
PKG_CONFIG_DEPENDS := CONFIG_IPV6
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)/Default
|
||||||
|
SECTION:=kernel
|
||||||
|
CATEGORY:=Kernel modules
|
||||||
|
SUBMENU:=Network Support
|
||||||
|
DEPENDS:=+kmod-ipt-conntrack +kmod-shortcut-fe
|
||||||
|
TITLE:=Kernel driver for FAST Classifier
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/fast-classifier.ko
|
||||||
|
KCONFIG:=CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y CONFIG_NF_CONNTRACK_MARK=y
|
||||||
|
PROVIDES:=$(PKG_NAME)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)
|
||||||
|
$(call KernelPackage/$(PKG_NAME)/Default)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)-noload
|
||||||
|
$(call KernelPackage/$(PKG_NAME)/Default)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)/Default/description
|
||||||
|
FAST Classifier talks to SFE to make decisions about offloading connections
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)/description
|
||||||
|
$(call KernelPackage/$(PKG_NAME)/Default/description)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/$(PKG_NAME)-noload/description
|
||||||
|
$(call KernelPackage/$(PKG_NAME)/Default/description)
|
||||||
|
|
||||||
|
This package does not load $(PKG_NAME) at boot by default
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/fast-classifier-example
|
||||||
|
TITLE:=Example user space program for fast-classifier
|
||||||
|
DEPENDS:=+libnl +kmod-fast-classifier
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/fast-classifier-example/description
|
||||||
|
Example user space program that communicates with fast
|
||||||
|
classifier kernel module
|
||||||
|
endef
|
||||||
|
|
||||||
|
SFE_MAKE_OPTS:=SFE_SUPPORT_IPV6=$(if $(CONFIG_IPV6),y,n)
|
||||||
|
|
||||||
|
define Build/Compile/kmod
|
||||||
|
+$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" $(SFE_MAKE_OPTS) \
|
||||||
|
$(KERNEL_MAKE_FLAGS) \
|
||||||
|
$(PKG_MAKE_FLAGS) \
|
||||||
|
M="$(PKG_BUILD_DIR)" \
|
||||||
|
CONFIG_FAST_CLASSIFIER=m \
|
||||||
|
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
|
||||||
|
modules
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile/example
|
||||||
|
$(TARGET_CC) -o $(PKG_BUILD_DIR)/userspace_fast_classifier \
|
||||||
|
-I $(PKG_BUILD_DIR) \
|
||||||
|
-I$(STAGING_DIR)/usr/include/libnl \
|
||||||
|
-I$(STAGING_DIR)/usr/include/libnl3 \
|
||||||
|
-lnl-genl-3 -lnl-3 \
|
||||||
|
$(PKG_BUILD_DIR)/nl_classifier_test.c
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
$(Build/Compile/kmod)
|
||||||
|
$(if $(CONFIG_PACKAGE_fast-classifier-example),$(Build/Compile/example))
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/InstallDev
|
||||||
|
$(INSTALL_DIR) $(1)/usr/include
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/fast-classifier.h $(1)/usr/include/
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
define Package/fast-classifier-example/install
|
||||||
|
$(INSTALL_DIR) $(1)/sbin
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/userspace_fast_classifier $(1)/sbin/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call KernelPackage,$(PKG_NAME)))
|
||||||
|
$(eval $(call KernelPackage,$(PKG_NAME)-noload))
|
||||||
|
#$(eval $(call BuildPackage,fast-classifier-example))
|
10
fast-classifier/src/Makefile
Executable file
10
fast-classifier/src/Makefile
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
obj-$(CONFIG_FAST_CLASSIFIER) += fast-classifier.o
|
||||||
|
|
||||||
|
ifeq ($(SFE_SUPPORT_IPV6),)
|
||||||
|
SFE_SUPPORT_IPV6=y
|
||||||
|
endif
|
||||||
|
ccflags-$(SFE_SUPPORT_IPV6) += -DSFE_SUPPORT_IPV6
|
||||||
|
|
||||||
|
ccflags-y += -I$(obj)/../shortcut-fe
|
||||||
|
|
||||||
|
obj ?= .
|
1976
fast-classifier/src/fast-classifier.c
Executable file
1976
fast-classifier/src/fast-classifier.c
Executable file
File diff suppressed because it is too large
Load diff
57
fast-classifier/src/fast-classifier.h
Executable file
57
fast-classifier/src/fast-classifier.h
Executable file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* User space header to send message to the fast classifier
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013,2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/if_ether.h>
|
||||||
|
|
||||||
|
#define FAST_CLASSIFIER_GENL_VERSION (1)
|
||||||
|
#define FAST_CLASSIFIER_GENL_NAME "FC"
|
||||||
|
#define FAST_CLASSIFIER_GENL_MCGRP "FC_MCGRP"
|
||||||
|
#define FAST_CLASSIFIER_GENL_HDRSIZE (0)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FAST_CLASSIFIER_A_UNSPEC,
|
||||||
|
FAST_CLASSIFIER_A_TUPLE,
|
||||||
|
__FAST_CLASSIFIER_A_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FAST_CLASSIFIER_A_MAX (__FAST_CLASSIFIER_A_MAX - 1)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FAST_CLASSIFIER_C_UNSPEC,
|
||||||
|
FAST_CLASSIFIER_C_OFFLOAD,
|
||||||
|
FAST_CLASSIFIER_C_OFFLOADED,
|
||||||
|
FAST_CLASSIFIER_C_DONE,
|
||||||
|
__FAST_CLASSIFIER_C_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FAST_CLASSIFIER_C_MAX (__FAST_CLASSIFIER_C_MAX - 1)
|
||||||
|
|
||||||
|
struct fast_classifier_tuple {
|
||||||
|
unsigned short ethertype;
|
||||||
|
unsigned char proto;
|
||||||
|
union {
|
||||||
|
struct in_addr in;
|
||||||
|
struct in6_addr in6;
|
||||||
|
} src_saddr;
|
||||||
|
union {
|
||||||
|
struct in_addr in;
|
||||||
|
struct in6_addr in6;
|
||||||
|
} dst_saddr;
|
||||||
|
unsigned short sport;
|
||||||
|
unsigned short dport;
|
||||||
|
unsigned char smac[ETH_ALEN];
|
||||||
|
unsigned char dmac[ETH_ALEN];
|
||||||
|
};
|
281
fast-classifier/src/nl_classifier_test.c
Executable file
281
fast-classifier/src/nl_classifier_test.c
Executable file
|
@ -0,0 +1,281 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <netlink/genl/genl.h>
|
||||||
|
#include <netlink/genl/ctrl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#define NL_CLASSIFIER_GENL_VERSION 1
|
||||||
|
#define NL_CLASSIFIER_GENL_FAMILY "FC"
|
||||||
|
#define NL_CLASSIFIER_GENL_GROUP "FC_MCGRP"
|
||||||
|
#define NL_CLASSIFIER_GENL_HDRSIZE 0
|
||||||
|
|
||||||
|
enum NL_CLASSIFIER_CMD {
|
||||||
|
NL_CLASSIFIER_CMD_UNSPEC,
|
||||||
|
NL_CLASSIFIER_CMD_ACCEL,
|
||||||
|
NL_CLASSIFIER_CMD_ACCEL_OK,
|
||||||
|
NL_CLASSIFIER_CMD_CONNECTION_CLOSED,
|
||||||
|
NL_CLASSIFIER_CMD_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum NL_CLASSIFIER_ATTR {
|
||||||
|
NL_CLASSIFIER_ATTR_UNSPEC,
|
||||||
|
NL_CLASSIFIER_ATTR_TUPLE,
|
||||||
|
NL_CLASSIFIER_ATTR_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
union nl_classifier_tuple_ip {
|
||||||
|
struct in_addr in;
|
||||||
|
struct in6_addr in6;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nl_classifier_tuple {
|
||||||
|
unsigned short af;
|
||||||
|
unsigned char proto;
|
||||||
|
union nl_classifier_tuple_ip src_ip;
|
||||||
|
union nl_classifier_tuple_ip dst_ip;
|
||||||
|
unsigned short sport;
|
||||||
|
unsigned short dport;
|
||||||
|
unsigned char smac[6];
|
||||||
|
unsigned char dmac[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nl_classifier_instance {
|
||||||
|
struct nl_sock *sock;
|
||||||
|
int family_id;
|
||||||
|
int group_id;
|
||||||
|
int stop;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nl_classifier_instance nl_cls_inst;
|
||||||
|
|
||||||
|
static struct nla_policy nl_classifier_genl_policy[(NL_CLASSIFIER_ATTR_MAX+1)] = {
|
||||||
|
[NL_CLASSIFIER_ATTR_TUPLE] = { .type = NLA_UNSPEC },
|
||||||
|
};
|
||||||
|
|
||||||
|
void nl_classifier_dump_nl_tuple(struct nl_classifier_tuple *tuple)
|
||||||
|
{
|
||||||
|
char ip_str[64];
|
||||||
|
|
||||||
|
printf("protocol = %s\n", (tuple->proto == IPPROTO_UDP) ? "udp" : ((tuple->proto == IPPROTO_TCP) ? "tcp" : "unknown"));
|
||||||
|
printf("source ip = %s\n", inet_ntop(tuple->af, &tuple->src_ip, ip_str, sizeof(ip_str)));
|
||||||
|
printf("destination ip = %s\n", inet_ntop(tuple->af, &tuple->dst_ip, ip_str, sizeof(ip_str)));
|
||||||
|
printf("source port = %d\n", ntohs(tuple->sport));
|
||||||
|
printf("destination port = %d\n", ntohs(tuple->dport));
|
||||||
|
}
|
||||||
|
|
||||||
|
int nl_classifier_msg_recv(struct nl_msg *msg, void *arg)
|
||||||
|
{
|
||||||
|
struct nlmsghdr *nlh = nlmsg_hdr(msg);
|
||||||
|
struct genlmsghdr *gnlh = nlmsg_data(nlh);
|
||||||
|
struct nlattr *attrs[(NL_CLASSIFIER_ATTR_MAX+1)];
|
||||||
|
|
||||||
|
genlmsg_parse(nlh, NL_CLASSIFIER_GENL_HDRSIZE, attrs, NL_CLASSIFIER_ATTR_MAX, nl_classifier_genl_policy);
|
||||||
|
|
||||||
|
switch (gnlh->cmd) {
|
||||||
|
case NL_CLASSIFIER_CMD_ACCEL_OK:
|
||||||
|
printf("Acceleration successful:\n");
|
||||||
|
nl_classifier_dump_nl_tuple(nla_data(attrs[NL_CLASSIFIER_ATTR_TUPLE]));
|
||||||
|
return NL_OK;
|
||||||
|
case NL_CLASSIFIER_CMD_CONNECTION_CLOSED:
|
||||||
|
printf("Connection is closed:\n");
|
||||||
|
nl_classifier_dump_nl_tuple(nla_data(attrs[NL_CLASSIFIER_ATTR_TUPLE]));
|
||||||
|
return NL_OK;
|
||||||
|
default:
|
||||||
|
printf("nl classifier received unknow message %d\n", gnlh->cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NL_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nl_classifier_offload(struct nl_classifier_instance *inst,
|
||||||
|
unsigned char proto, unsigned long *src_saddr,
|
||||||
|
unsigned long *dst_saddr, unsigned short sport,
|
||||||
|
unsigned short dport, int af)
|
||||||
|
{
|
||||||
|
struct nl_msg *msg;
|
||||||
|
int ret;
|
||||||
|
struct nl_classifier_tuple classifier_msg;
|
||||||
|
|
||||||
|
memset(&classifier_msg, 0, sizeof(classifier_msg));
|
||||||
|
classifier_msg.af = af;
|
||||||
|
classifier_msg.proto = proto;
|
||||||
|
memcpy(&classifier_msg.src_ip, src_saddr, (af == AF_INET ? 4 : 16));
|
||||||
|
memcpy(&classifier_msg.dst_ip, dst_saddr, (af == AF_INET ? 4 : 16));
|
||||||
|
classifier_msg.sport = sport;
|
||||||
|
classifier_msg.dport = dport;
|
||||||
|
|
||||||
|
msg = nlmsg_alloc();
|
||||||
|
if (!msg) {
|
||||||
|
printf("Unable to allocate message\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, inst->family_id,
|
||||||
|
NL_CLASSIFIER_GENL_HDRSIZE, NLM_F_REQUEST,
|
||||||
|
NL_CLASSIFIER_CMD_ACCEL, NL_CLASSIFIER_GENL_VERSION);
|
||||||
|
nla_put(msg, NL_CLASSIFIER_ATTR_TUPLE, sizeof(classifier_msg), &classifier_msg);
|
||||||
|
|
||||||
|
ret = nl_send_auto(inst->sock, msg);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("send netlink message failed.\n");
|
||||||
|
nlmsg_free(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nlmsg_free(msg);
|
||||||
|
printf("nl classifier offload connection successful\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int nl_classifier_init(struct nl_classifier_instance *inst)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
inst->sock = nl_socket_alloc();
|
||||||
|
if (!inst->sock) {
|
||||||
|
printf("Unable to allocation socket.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
genl_connect(inst->sock);
|
||||||
|
|
||||||
|
inst->family_id = genl_ctrl_resolve(inst->sock, NL_CLASSIFIER_GENL_FAMILY);
|
||||||
|
if (inst->family_id < 0) {
|
||||||
|
printf("Unable to resolve family %s\n", NL_CLASSIFIER_GENL_FAMILY);
|
||||||
|
goto init_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->group_id = genl_ctrl_resolve_grp(inst->sock, NL_CLASSIFIER_GENL_FAMILY, NL_CLASSIFIER_GENL_GROUP);
|
||||||
|
if (inst->group_id < 0) {
|
||||||
|
printf("Unable to resolve mcast group %s\n", NL_CLASSIFIER_GENL_GROUP);
|
||||||
|
goto init_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = nl_socket_add_membership(inst->sock, inst->group_id);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("Unable to add membership\n");
|
||||||
|
goto init_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_socket_disable_seq_check(inst->sock);
|
||||||
|
nl_socket_modify_cb(inst->sock, NL_CB_VALID, NL_CB_CUSTOM, nl_classifier_msg_recv, NULL);
|
||||||
|
|
||||||
|
printf("nl classifier init successful\n");
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
init_failed:
|
||||||
|
if (inst->sock) {
|
||||||
|
nl_close(inst->sock);
|
||||||
|
nl_socket_free(inst->sock);
|
||||||
|
inst->sock = NULL;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nl_classifier_exit(struct nl_classifier_instance *inst)
|
||||||
|
{
|
||||||
|
if (inst->sock) {
|
||||||
|
nl_close(inst->sock);
|
||||||
|
nl_socket_free(inst->sock);
|
||||||
|
inst->sock = NULL;
|
||||||
|
}
|
||||||
|
printf("nl classifier exit successful\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int nl_classifier_parse_arg(int argc, char *argv[], unsigned char *proto, unsigned long *src_saddr,
|
||||||
|
unsigned long *dst_saddr, unsigned short *sport, unsigned short *dport, int *af)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned short port;
|
||||||
|
|
||||||
|
if (argc < 7) {
|
||||||
|
printf("help: nl_classifier <v4|v6> <udp|tcp> <source ip> <destination ip> <source port> <destination port>\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == strncmp(argv[1], "v4", 2)) {
|
||||||
|
*af = AF_INET;
|
||||||
|
} else if (0 == strncmp(argv[1], "v6", 2)) {
|
||||||
|
*af = AF_INET6;
|
||||||
|
} else {
|
||||||
|
printf("Address family is not supported");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == strncmp(argv[2], "udp", 3)) {
|
||||||
|
*proto = IPPROTO_UDP;
|
||||||
|
} else if (0 == strncmp(argv[2], "tcp", 3)) {
|
||||||
|
*proto = IPPROTO_TCP;
|
||||||
|
} else {
|
||||||
|
printf("Protocol is not supported");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = inet_pton(*af, argv[3], src_saddr);
|
||||||
|
if (ret <= 0) {
|
||||||
|
printf("source ip has wrong format\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = inet_pton(*af, argv[4], dst_saddr);
|
||||||
|
if (ret <= 0) {
|
||||||
|
printf("destination ip has wrong format\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
port = strtol(argv[5], NULL, 0);
|
||||||
|
*sport = htons(port);
|
||||||
|
port = strtol(argv[6], NULL, 0);
|
||||||
|
*dport = htons(port);
|
||||||
|
|
||||||
|
printf("nl classifier parse arguments successful\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct nl_classifier_instance *inst = &nl_cls_inst;
|
||||||
|
unsigned char proto;
|
||||||
|
unsigned long src_addr[4];
|
||||||
|
unsigned long dst_addr[4];
|
||||||
|
unsigned short sport;
|
||||||
|
unsigned short dport;
|
||||||
|
int af;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = nl_classifier_parse_arg(argc, argv, &proto, src_addr, dst_addr, &sport, &dport, &af);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("Failed to parse arguments\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = nl_classifier_init(inst);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("Unable to init generic netlink\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_classifier_offload(inst, proto, src_addr, dst_addr, sport, dport, af);
|
||||||
|
|
||||||
|
/* main loop to listen on message */
|
||||||
|
while (!inst->stop) {
|
||||||
|
nl_recvmsgs_default(inst->sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_classifier_exit(inst);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
114
fast-classifier/src/sfe.h
Executable file
114
fast-classifier/src/sfe.h
Executable file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* sfe.h
|
||||||
|
* Shortcut forwarding engine.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following are debug macros used throughout the SFE.
|
||||||
|
*
|
||||||
|
* The DEBUG_LEVEL enables the followings based on its value,
|
||||||
|
* when dynamic debug option is disabled.
|
||||||
|
*
|
||||||
|
* 0 = OFF
|
||||||
|
* 1 = ASSERTS / ERRORS
|
||||||
|
* 2 = 1 + WARN
|
||||||
|
* 3 = 2 + INFO
|
||||||
|
* 4 = 3 + TRACE
|
||||||
|
*/
|
||||||
|
#define DEBUG_LEVEL 2
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 1)
|
||||||
|
#define DEBUG_ASSERT(s, ...)
|
||||||
|
#define DEBUG_ERROR(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_ASSERT(c, s, ...) if (!(c)) { pr_emerg("ASSERT: %s:%d:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__); BUG(); }
|
||||||
|
#define DEBUG_ERROR(s, ...) pr_err("%s:%d:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||||
|
/*
|
||||||
|
* Compile messages for dynamic enable/disable
|
||||||
|
*/
|
||||||
|
#define DEBUG_WARN(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#define DEBUG_INFO(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#define DEBUG_TRACE(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Statically compile messages at different levels
|
||||||
|
*/
|
||||||
|
#if (DEBUG_LEVEL < 2)
|
||||||
|
#define DEBUG_WARN(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_WARN(s, ...) pr_warn("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 3)
|
||||||
|
#define DEBUG_INFO(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_INFO(s, ...) pr_notice("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 4)
|
||||||
|
#define DEBUG_TRACE(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_TRACE(s, ...) pr_info("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NF_FLOW_COOKIE
|
||||||
|
typedef int (*flow_cookie_set_func_t)(u32 protocol, __be32 src_ip, __be16 src_port,
|
||||||
|
__be32 dst_ip, __be16 dst_port, u16 flow_cookie);
|
||||||
|
/*
|
||||||
|
* sfe_register_flow_cookie_cb
|
||||||
|
* register a function in SFE to let SFE use this function to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* Hardware driver which support flow cookie should register a callback function in SFE. Then SFE
|
||||||
|
* can use this function to configure flow cookie for a flow.
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_register_flow_cookie_cb(flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_unregister_flow_cookie_cb
|
||||||
|
* unregister function which is used to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_unregister_flow_cookie_cb(flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
typedef int (*sfe_ipv6_flow_cookie_set_func_t)(u32 protocol, __be32 src_ip[4], __be16 src_port,
|
||||||
|
__be32 dst_ip[4], __be16 dst_port, u16 flow_cookie);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_register_flow_cookie_cb
|
||||||
|
* register a function in SFE to let SFE use this function to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* Hardware driver which support flow cookie should register a callback function in SFE. Then SFE
|
||||||
|
* can use this function to configure flow cookie for a flow.
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_register_flow_cookie_cb(sfe_ipv6_flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_unregister_flow_cookie_cb
|
||||||
|
* unregister function which is used to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_unregister_flow_cookie_cb(sfe_ipv6_flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
#endif /*CONFIG_NF_FLOW_COOKIE*/
|
195
fast-classifier/src/sfe_backport.h
Executable file
195
fast-classifier/src/sfe_backport.h
Executable file
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
* sfe_backport.h
|
||||||
|
* Shortcut forwarding engine compatible header file.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
|
||||||
|
#include <net/netfilter/nf_conntrack_timeout.h>
|
||||||
|
#else
|
||||||
|
enum udp_conntrack {
|
||||||
|
UDP_CT_UNREPLIED,
|
||||||
|
UDP_CT_REPLIED,
|
||||||
|
UDP_CT_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline unsigned int *
|
||||||
|
nf_ct_timeout_lookup(struct net *net, struct nf_conn *ct,
|
||||||
|
struct nf_conntrack_l4proto *l4proto)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||||
|
struct nf_conn_timeout *timeout_ext;
|
||||||
|
unsigned int *timeouts;
|
||||||
|
|
||||||
|
timeout_ext = nf_ct_timeout_find(ct);
|
||||||
|
if (timeout_ext)
|
||||||
|
timeouts = NF_CT_TIMEOUT_EXT_DATA(timeout_ext);
|
||||||
|
else
|
||||||
|
timeouts = l4proto->get_timeouts(net);
|
||||||
|
|
||||||
|
return timeouts;
|
||||||
|
#else
|
||||||
|
return l4proto->get_timeouts(net);
|
||||||
|
#endif /*CONFIG_NF_CONNTRACK_TIMEOUT*/
|
||||||
|
}
|
||||||
|
#endif /*KERNEL_VERSION(3, 7, 0)*/
|
||||||
|
#endif /*KERNEL_VERSION(3, 4, 0)*/
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(void *priv, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct nf_hook_state *state)
|
||||||
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(const struct nf_hook_ops *OPS, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct net_device *UNUSED, \
|
||||||
|
const struct net_device *OUT, \
|
||||||
|
int (*OKFN)(struct sk_buff *))
|
||||||
|
#else
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(unsigned int HOOKNUM, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct net_device *UNUSED, \
|
||||||
|
const struct net_device *OUT, \
|
||||||
|
int (*OKFN)(struct sk_buff *))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define sfe_cm_ipv4_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__sfe_cm_ipv4_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define sfe_cm_ipv6_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__sfe_cm_ipv6_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define fast_classifier_ipv4_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__fast_classifier_ipv4_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define fast_classifier_ipv6_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__fast_classifier_ipv6_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define SFE_IPV4_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.pf = NFPROTO_IPV4, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define SFE_IPV4_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.owner = THIS_MODULE, \
|
||||||
|
.pf = NFPROTO_IPV4, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define SFE_IPV6_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.pf = NFPROTO_IPV6, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define SFE_IPV6_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.owner = THIS_MODULE, \
|
||||||
|
.pf = NFPROTO_IPV6, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP6_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0))
|
||||||
|
#define SFE_NF_CT_DEFAULT_ZONE (&nf_ct_zone_dflt)
|
||||||
|
#else
|
||||||
|
#define SFE_NF_CT_DEFAULT_ZONE NF_CT_DEFAULT_ZONE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_dev_get_master
|
||||||
|
* get master of bridge port, and hold it
|
||||||
|
*/
|
||||||
|
static inline struct net_device *sfe_dev_get_master(struct net_device *dev)
|
||||||
|
{
|
||||||
|
struct net_device *master;
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
rcu_read_lock();
|
||||||
|
master = netdev_master_upper_dev_get_rcu(dev);
|
||||||
|
if (master)
|
||||||
|
dev_hold(master);
|
||||||
|
|
||||||
|
rcu_read_unlock();
|
||||||
|
#else
|
||||||
|
master = dev->master;
|
||||||
|
if (master)
|
||||||
|
dev_hold(master);
|
||||||
|
#endif
|
||||||
|
return master;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
|
||||||
|
#define SFE_DEV_EVENT_PTR(PTR) netdev_notifier_info_to_dev(PTR)
|
||||||
|
#else
|
||||||
|
#define SFE_DEV_EVENT_PTR(PTR) (struct net_device *)(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define SFE_NF_CONN_ACCT(NM) struct nf_conn_acct *NM
|
||||||
|
#else
|
||||||
|
#define SFE_NF_CONN_ACCT(NM) struct nf_conn_counter *NM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define SFE_ACCT_COUNTER(NM) ((NM)->counter)
|
||||||
|
#else
|
||||||
|
#define SFE_ACCT_COUNTER(NM) (NM)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
#define sfe_hash_for_each_possible(name, obj, node, member, key) \
|
||||||
|
hash_for_each_possible(name, obj, member, key)
|
||||||
|
#else
|
||||||
|
#define sfe_hash_for_each_possible(name, obj, node, member, key) \
|
||||||
|
hash_for_each_possible(name, obj, node, member, key)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
#define sfe_hash_for_each(name, bkt, node, obj, member) \
|
||||||
|
hash_for_each(name, bkt, obj, member)
|
||||||
|
#else
|
||||||
|
#define sfe_hash_for_each(name, bkt, node, obj, member) \
|
||||||
|
hash_for_each(name, bkt, node, obj, member)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
|
||||||
|
#define sfe_dst_get_neighbour(dst, daddr) dst_neigh_lookup(dst, daddr)
|
||||||
|
#else
|
||||||
|
static inline struct neighbour *
|
||||||
|
sfe_dst_get_neighbour(struct dst_entry *dst, void *daddr)
|
||||||
|
{
|
||||||
|
struct neighbour *neigh = dst_get_neighbour_noref(dst);
|
||||||
|
|
||||||
|
if (neigh)
|
||||||
|
neigh_hold(neigh);
|
||||||
|
|
||||||
|
return neigh;
|
||||||
|
}
|
||||||
|
#endif
|
259
fast-classifier/src/sfe_cm.h
Executable file
259
fast-classifier/src/sfe_cm.h
Executable file
|
@ -0,0 +1,259 @@
|
||||||
|
/*
|
||||||
|
* sfe_cm.h
|
||||||
|
* Shortcut forwarding engine.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection flags.
|
||||||
|
*/
|
||||||
|
#define SFE_CREATE_FLAG_NO_SEQ_CHECK BIT(0)
|
||||||
|
/* Indicates that we should not check sequence numbers */
|
||||||
|
#define SFE_CREATE_FLAG_REMARK_PRIORITY BIT(1)
|
||||||
|
/* Indicates that we should remark priority of skb */
|
||||||
|
#define SFE_CREATE_FLAG_REMARK_DSCP BIT(2)
|
||||||
|
/* Indicates that we should remark DSCP of packet */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IPv6 address structure
|
||||||
|
*/
|
||||||
|
struct sfe_ipv6_addr {
|
||||||
|
__be32 addr[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
__be32 ip;
|
||||||
|
struct sfe_ipv6_addr ip6[1];
|
||||||
|
} sfe_ip_addr_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection creation structure.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_create {
|
||||||
|
int protocol;
|
||||||
|
struct net_device *src_dev;
|
||||||
|
struct net_device *dest_dev;
|
||||||
|
u32 flags;
|
||||||
|
u32 src_mtu;
|
||||||
|
u32 dest_mtu;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t src_ip_xlate;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
sfe_ip_addr_t dest_ip_xlate;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 src_port_xlate;
|
||||||
|
__be16 dest_port;
|
||||||
|
__be16 dest_port_xlate;
|
||||||
|
u8 src_mac[ETH_ALEN];
|
||||||
|
u8 src_mac_xlate[ETH_ALEN];
|
||||||
|
u8 dest_mac[ETH_ALEN];
|
||||||
|
u8 dest_mac_xlate[ETH_ALEN];
|
||||||
|
u8 src_td_window_scale;
|
||||||
|
u32 src_td_max_window;
|
||||||
|
u32 src_td_end;
|
||||||
|
u32 src_td_max_end;
|
||||||
|
u8 dest_td_window_scale;
|
||||||
|
u32 dest_td_max_window;
|
||||||
|
u32 dest_td_end;
|
||||||
|
u32 dest_td_max_end;
|
||||||
|
u32 mark;
|
||||||
|
#ifdef CONFIG_XFRM
|
||||||
|
u32 original_accel;
|
||||||
|
u32 reply_accel;
|
||||||
|
#endif
|
||||||
|
u32 src_priority;
|
||||||
|
u32 dest_priority;
|
||||||
|
u32 src_dscp;
|
||||||
|
u32 dest_dscp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection destruction structure.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_destroy {
|
||||||
|
int protocol;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 dest_port;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum sfe_sync_reason {
|
||||||
|
SFE_SYNC_REASON_STATS, /* Sync is to synchronize stats */
|
||||||
|
SFE_SYNC_REASON_FLUSH, /* Sync is to flush a entry */
|
||||||
|
SFE_SYNC_REASON_DESTROY /* Sync is to destroy a entry(requested by connection manager) */
|
||||||
|
} sfe_sync_reason_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to sync connection stats/state back within the system.
|
||||||
|
*
|
||||||
|
* NOTE: The addresses here are NON-NAT addresses, i.e. the true endpoint addressing.
|
||||||
|
* 'src' is the creator of the connection.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_sync {
|
||||||
|
struct net_device *src_dev;
|
||||||
|
struct net_device *dest_dev;
|
||||||
|
int is_v6; /* Is it for ipv6? */
|
||||||
|
int protocol; /* IP protocol number (IPPROTO_...) */
|
||||||
|
sfe_ip_addr_t src_ip; /* Non-NAT source address, i.e. the creator of the connection */
|
||||||
|
sfe_ip_addr_t src_ip_xlate; /* NATed source address */
|
||||||
|
__be16 src_port; /* Non-NAT source port */
|
||||||
|
__be16 src_port_xlate; /* NATed source port */
|
||||||
|
sfe_ip_addr_t dest_ip; /* Non-NAT destination address, i.e. to whom the connection was created */
|
||||||
|
sfe_ip_addr_t dest_ip_xlate; /* NATed destination address */
|
||||||
|
__be16 dest_port; /* Non-NAT destination port */
|
||||||
|
__be16 dest_port_xlate; /* NATed destination port */
|
||||||
|
u32 src_td_max_window;
|
||||||
|
u32 src_td_end;
|
||||||
|
u32 src_td_max_end;
|
||||||
|
u64 src_packet_count;
|
||||||
|
u64 src_byte_count;
|
||||||
|
u32 src_new_packet_count;
|
||||||
|
u32 src_new_byte_count;
|
||||||
|
u32 dest_td_max_window;
|
||||||
|
u32 dest_td_end;
|
||||||
|
u32 dest_td_max_end;
|
||||||
|
u64 dest_packet_count;
|
||||||
|
u64 dest_byte_count;
|
||||||
|
u32 dest_new_packet_count;
|
||||||
|
u32 dest_new_byte_count;
|
||||||
|
u32 reason; /* reason for stats sync message, i.e. destroy, flush, period sync */
|
||||||
|
u64 delta_jiffies; /* Time to be added to the current timeout to keep the connection alive */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection mark structure
|
||||||
|
*/
|
||||||
|
struct sfe_connection_mark {
|
||||||
|
int protocol;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 dest_port;
|
||||||
|
u32 mark;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expose the hook for the receive processing.
|
||||||
|
*/
|
||||||
|
extern int (*athrs_fast_nat_recv)(struct sk_buff *skb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expose what should be a static flag in the TCP connection tracker.
|
||||||
|
*/
|
||||||
|
extern int nf_ct_tcp_no_window_check;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This callback will be called in a timer
|
||||||
|
* at 100 times per second to sync stats back to
|
||||||
|
* Linux connection track.
|
||||||
|
*
|
||||||
|
* A RCU lock is taken to prevent this callback
|
||||||
|
* from unregistering.
|
||||||
|
*/
|
||||||
|
typedef void (*sfe_sync_rule_callback_t)(struct sfe_connection_sync *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IPv4 APIs used by connection manager
|
||||||
|
*/
|
||||||
|
int sfe_ipv4_recv(struct net_device *dev, struct sk_buff *skb);
|
||||||
|
int sfe_ipv4_create_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv4_destroy_rule(struct sfe_connection_destroy *sid);
|
||||||
|
void sfe_ipv4_destroy_all_rules_for_dev(struct net_device *dev);
|
||||||
|
void sfe_ipv4_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
|
||||||
|
void sfe_ipv4_update_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv4_mark_rule(struct sfe_connection_mark *mark);
|
||||||
|
|
||||||
|
#ifdef SFE_SUPPORT_IPV6
|
||||||
|
/*
|
||||||
|
* IPv6 APIs used by connection manager
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb);
|
||||||
|
int sfe_ipv6_create_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid);
|
||||||
|
void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev);
|
||||||
|
void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
|
||||||
|
void sfe_ipv6_update_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark);
|
||||||
|
#else
|
||||||
|
static inline int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int sfe_ipv6_create_rule(struct sfe_connection_create *sic)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_update_rule(struct sfe_connection_create *sic)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_addr_equal()
|
||||||
|
* compare ipv6 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
static inline int sfe_ipv6_addr_equal(struct sfe_ipv6_addr *a,
|
||||||
|
struct sfe_ipv6_addr *b)
|
||||||
|
{
|
||||||
|
return a->addr[0] == b->addr[0] &&
|
||||||
|
a->addr[1] == b->addr[1] &&
|
||||||
|
a->addr[2] == b->addr[2] &&
|
||||||
|
a->addr[3] == b->addr[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv4_addr_equal()
|
||||||
|
* compare ipv4 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
#define sfe_ipv4_addr_equal(a, b) ((u32)(a) == (u32)(b))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_addr_equal()
|
||||||
|
* compare ipv4 or ipv6 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
static inline int sfe_addr_equal(sfe_ip_addr_t *a,
|
||||||
|
sfe_ip_addr_t *b, int is_v4)
|
||||||
|
{
|
||||||
|
return is_v4 ? sfe_ipv4_addr_equal(a->ip, b->ip) : sfe_ipv6_addr_equal(a->ip6, b->ip6);
|
||||||
|
}
|
232
fast-classifier/src/userspace_example.c
Executable file
232
fast-classifier/src/userspace_example.c
Executable file
|
@ -0,0 +1,232 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013,2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <netlink/genl/genl.h>
|
||||||
|
#include <netlink/genl/ctrl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include <fast-classifier.h>
|
||||||
|
|
||||||
|
static struct nl_sock *sock;
|
||||||
|
static struct nl_sock *sock_event;
|
||||||
|
static int family;
|
||||||
|
static int grp_id;
|
||||||
|
|
||||||
|
static struct nla_policy fast_classifier_genl_policy[FAST_CLASSIFIER_A_MAX + 1] = {
|
||||||
|
[FAST_CLASSIFIER_A_TUPLE] = { .type = NLA_UNSPEC },
|
||||||
|
};
|
||||||
|
|
||||||
|
void dump_fc_tuple(struct fast_classifier_tuple *fc_msg)
|
||||||
|
{
|
||||||
|
char src_str[INET_ADDRSTRLEN];
|
||||||
|
char dst_str[INET_ADDRSTRLEN];
|
||||||
|
|
||||||
|
printf("TUPLE: %d, %s, %s, %d, %d"
|
||||||
|
" SMAC=%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
|
" DMAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
fc_msg->proto,
|
||||||
|
inet_ntop(AF_INET,
|
||||||
|
&fc_msg->src_saddr.in.s_addr,
|
||||||
|
src_str,
|
||||||
|
INET_ADDRSTRLEN),
|
||||||
|
inet_ntop(AF_INET,
|
||||||
|
&fc_msg->dst_saddr.in.s_addr,
|
||||||
|
dst_str,
|
||||||
|
INET_ADDRSTRLEN),
|
||||||
|
fc_msg->sport, fc_msg->dport,
|
||||||
|
fc_msg->smac[0], fc_msg->smac[1], fc_msg->smac[2],
|
||||||
|
fc_msg->smac[3], fc_msg->smac[4], fc_msg->smac[5],
|
||||||
|
fc_msg->dmac[0], fc_msg->dmac[1], fc_msg->dmac[2],
|
||||||
|
fc_msg->dmac[3], fc_msg->dmac[4], fc_msg->dmac[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_cb(struct nl_msg *msg, void *arg)
|
||||||
|
{
|
||||||
|
struct nlmsghdr *nlh = nlmsg_hdr(msg);
|
||||||
|
struct genlmsghdr *gnlh = nlmsg_data(nlh);
|
||||||
|
struct nlattr *attrs[FAST_CLASSIFIER_A_MAX];
|
||||||
|
|
||||||
|
genlmsg_parse(nlh, 0, attrs, FAST_CLASSIFIER_A_MAX, fast_classifier_genl_policy);
|
||||||
|
|
||||||
|
switch (gnlh->cmd) {
|
||||||
|
case FAST_CLASSIFIER_C_OFFLOADED:
|
||||||
|
printf("Got a offloaded message\n");
|
||||||
|
dump_fc_tuple(nla_data(attrs[FAST_CLASSIFIER_A_TUPLE]));
|
||||||
|
return NL_OK;
|
||||||
|
case FAST_CLASSIFIER_C_DONE:
|
||||||
|
printf("Got a done message\n");
|
||||||
|
dump_fc_tuple(nla_data(attrs[FAST_CLASSIFIER_A_TUPLE]));
|
||||||
|
return NL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NL_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fast_classifier_init(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
sock = nl_socket_alloc();
|
||||||
|
if (!sock) {
|
||||||
|
printf("Unable to allocation socket.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
genl_connect(sock);
|
||||||
|
|
||||||
|
sock_event = nl_socket_alloc();
|
||||||
|
if (!sock_event) {
|
||||||
|
nl_close(sock);
|
||||||
|
nl_socket_free(sock);
|
||||||
|
printf("Unable to allocation socket.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
genl_connect(sock_event);
|
||||||
|
|
||||||
|
family = genl_ctrl_resolve(sock, FAST_CLASSIFIER_GENL_NAME);
|
||||||
|
if (family < 0) {
|
||||||
|
nl_close(sock_event);
|
||||||
|
nl_close(sock);
|
||||||
|
nl_socket_free(sock);
|
||||||
|
nl_socket_free(sock_event);
|
||||||
|
printf("Unable to resolve family\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grp_id = genl_ctrl_resolve_grp(sock, FAST_CLASSIFIER_GENL_NAME,
|
||||||
|
FAST_CLASSIFIER_GENL_MCGRP);
|
||||||
|
if (grp_id < 0) {
|
||||||
|
printf("Unable to resolve mcast group\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = nl_socket_add_membership(sock_event, grp_id);
|
||||||
|
if (err < 0) {
|
||||||
|
printf("Unable to add membership\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_socket_disable_seq_check(sock_event);
|
||||||
|
nl_socket_modify_cb(sock_event, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fast_classifier_close(void)
|
||||||
|
{
|
||||||
|
nl_close(sock_event);
|
||||||
|
nl_close(sock);
|
||||||
|
nl_socket_free(sock_event);
|
||||||
|
nl_socket_free(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fast_classifier_ipv4_offload(unsigned char proto, unsigned long src_saddr,
|
||||||
|
unsigned long dst_saddr, unsigned short sport,
|
||||||
|
unsigned short dport)
|
||||||
|
{
|
||||||
|
struct nl_msg *msg;
|
||||||
|
int ret;
|
||||||
|
#ifdef DEBUG
|
||||||
|
char src_str[INET_ADDRSTRLEN];
|
||||||
|
char dst_str[INET_ADDRSTRLEN];
|
||||||
|
#endif
|
||||||
|
struct fast_classifier_tuple fc_msg;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("DEBUG: would offload: %d, %s, %s, %d, %d\n", proto,
|
||||||
|
inet_ntop(AF_INET, &src_saddr, src_str, INET_ADDRSTRLEN),
|
||||||
|
inet_ntop(AF_INET, &dst_saddr, dst_str, INET_ADDRSTRLEN),
|
||||||
|
sport, dport);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fc_msg.proto = proto;
|
||||||
|
fc_msg.src_saddr.in.s_addr = src_saddr;
|
||||||
|
fc_msg.dst_saddr.in.s_addr = dst_saddr;
|
||||||
|
fc_msg.sport = sport;
|
||||||
|
fc_msg.dport = dport;
|
||||||
|
fc_msg.smac[0] = 'a';
|
||||||
|
fc_msg.smac[1] = 'b';
|
||||||
|
fc_msg.smac[2] = 'c';
|
||||||
|
fc_msg.smac[3] = 'd';
|
||||||
|
fc_msg.smac[4] = 'e';
|
||||||
|
fc_msg.smac[5] = 'f';
|
||||||
|
fc_msg.dmac[0] = 'f';
|
||||||
|
fc_msg.dmac[1] = 'e';
|
||||||
|
fc_msg.dmac[2] = 'd';
|
||||||
|
fc_msg.dmac[3] = 'c';
|
||||||
|
fc_msg.dmac[4] = 'b';
|
||||||
|
fc_msg.dmac[5] = 'a';
|
||||||
|
|
||||||
|
if (fast_classifier_init() < 0) {
|
||||||
|
printf("Unable to init generic netlink\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = nlmsg_alloc();
|
||||||
|
if (!msg) {
|
||||||
|
nl_socket_free(sock);
|
||||||
|
printf("Unable to allocate message\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family,
|
||||||
|
FAST_CLASSIFIER_GENL_HDRSIZE, NLM_F_REQUEST,
|
||||||
|
FAST_CLASSIFIER_C_OFFLOAD, FAST_CLASSIFIER_GENL_VERSION);
|
||||||
|
nla_put(msg, 1, sizeof(fc_msg), &fc_msg);
|
||||||
|
|
||||||
|
ret = nl_send_auto_complete(sock, msg);
|
||||||
|
|
||||||
|
nlmsg_free(msg);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("nlmsg_free failed");
|
||||||
|
nl_close(sock);
|
||||||
|
nl_socket_free(sock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = nl_wait_for_ack(sock);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("wait for ack failed");
|
||||||
|
nl_close(sock);
|
||||||
|
nl_socket_free(sock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fast_classifier_listen_for_messages(void)
|
||||||
|
{
|
||||||
|
printf("waiting for netlink events\n");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
nl_recvmsgs_default(sock_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (fast_classifier_init() < 0) {
|
||||||
|
printf("Unable to init generic netlink\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fast_classifier_ipv4_offload('a', 0, 0, 0, 0);
|
||||||
|
|
||||||
|
/* this never returns */
|
||||||
|
fast_classifier_listen_for_messages();
|
||||||
|
|
||||||
|
fast_classifier_close();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -25,7 +25,7 @@ GO_PKG:=github.com/golang/protobuf
|
||||||
GO_PKG_SOURCE_ONLY:=1
|
GO_PKG_SOURCE_ONLY:=1
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
|
include ../golang/golang-package.mk
|
||||||
|
|
||||||
define Package/golang-protobuf-dev
|
define Package/golang-protobuf-dev
|
||||||
$(call GoPackage/GoSubMenu)
|
$(call GoPackage/GoSubMenu)
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=iproute2
|
PKG_NAME:=iproute2
|
||||||
PKG_VERSION:=5.15.0
|
|
||||||
PKG_RELEASE:=$(AUTORELEASE)
|
PKG_RELEASE:=$(AUTORELEASE)
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
|
PKG_SOURCE_URL:=git://git.kernel.org/pub/scm/network/iproute2/iproute2.git
|
||||||
PKG_HASH:=38e3e4a5f9a7f5575c015027a10df097c149111eeb739993128e5b2b35b291ff
|
PKG_SOURCE_VERSION:=29da83f89f6e1fe528c59131a01f5d43bcd0a000
|
||||||
|
PKG_VERSION:=5.16.0-$(PKG_SOURCE_VERSION)
|
||||||
|
|
||||||
PKG_BUILD_PARALLEL:=1
|
PKG_BUILD_PARALLEL:=1
|
||||||
PKG_BUILD_DEPENDS:=iptables
|
PKG_BUILD_DEPENDS:=iptables
|
||||||
PKG_LICENSE:=GPL-2.0
|
PKG_LICENSE:=GPL-2.0
|
||||||
|
@ -57,16 +58,7 @@ $(call Package/iproute2/Default)
|
||||||
DEFAULT_VARIANT:=1
|
DEFAULT_VARIANT:=1
|
||||||
PROVIDES:=tc
|
PROVIDES:=tc
|
||||||
ALTERNATIVES:=200:/sbin/tc:/usr/libexec/tc-tiny
|
ALTERNATIVES:=200:/sbin/tc:/usr/libexec/tc-tiny
|
||||||
DEPENDS:=+kmod-sched-core +(PACKAGE_devlink||PACKAGE_rdma):libmnl
|
DEPENDS:=+kmod-sched-core +libxtables +tc-mod-iptables +(PACKAGE_devlink||PACKAGE_rdma):libmnl
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/tc-bpf
|
|
||||||
$(call Package/iproute2/Default)
|
|
||||||
TITLE:=Traffic control utility (bpf)
|
|
||||||
VARIANT:=tcbpf
|
|
||||||
PROVIDES:=tc
|
|
||||||
ALTERNATIVES:=300:/sbin/tc:/usr/libexec/tc-bpf
|
|
||||||
DEPENDS:=+kmod-sched-core +(PACKAGE_devlink||PACKAGE_rdma):libmnl +libbpf
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/tc-full
|
define Package/tc-full
|
||||||
|
@ -74,14 +66,13 @@ $(call Package/iproute2/Default)
|
||||||
TITLE:=Traffic control utility (full)
|
TITLE:=Traffic control utility (full)
|
||||||
VARIANT:=tcfull
|
VARIANT:=tcfull
|
||||||
PROVIDES:=tc
|
PROVIDES:=tc
|
||||||
ALTERNATIVES:=400:/sbin/tc:/usr/libexec/tc-full
|
ALTERNATIVES:=300:/sbin/tc:/usr/libexec/tc-full
|
||||||
DEPENDS:=+kmod-sched-core +(PACKAGE_devlink||PACKAGE_rdma):libmnl +libbpf +libxtables +tc-mod-iptables
|
DEPENDS:=+kmod-sched-core +libxtables +tc-mod-iptables +libbpf +(PACKAGE_devlink||PACKAGE_rdma):libmnl
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/tc-mod-iptables
|
define Package/tc-mod-iptables
|
||||||
$(call Package/iproute2/Default)
|
$(call Package/iproute2/Default)
|
||||||
TITLE:=Traffic control module - iptables action
|
TITLE:=Traffic control module - iptables action
|
||||||
VARIANT:=tcfull
|
|
||||||
DEPENDS:=+libxtables
|
DEPENDS:=+libxtables
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -133,29 +124,13 @@ endif
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),tctiny)
|
ifeq ($(BUILD_VARIANT),tctiny)
|
||||||
LIBBPF_FORCE:=off
|
LIBBPF_FORCE:=off
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),tcbpf)
|
|
||||||
HAVE_ELF:=y
|
|
||||||
LIBBPF_FORCE:=on
|
|
||||||
SHARED_LIBS:=y
|
SHARED_LIBS:=y
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),tcfull)
|
ifeq ($(BUILD_VARIANT),tcfull)
|
||||||
#enable iptables/xtables requirement only if tciptables variant is selected
|
|
||||||
TC_CONFIG_XT:=y
|
|
||||||
TC_CONFIG_XT_OLD:=y
|
|
||||||
TC_CONFIG_XT_OLD_H:=y
|
|
||||||
TC_CONFIG_IPSET:=y
|
|
||||||
HAVE_ELF:=y
|
HAVE_ELF:=y
|
||||||
LIBBPF_FORCE:=on
|
LIBBPF_FORCE:=on
|
||||||
SHARED_LIBS:=y
|
SHARED_LIBS:=y
|
||||||
else
|
|
||||||
#disable iptables requirement by default
|
|
||||||
TC_CONFIG_XT:=n
|
|
||||||
TC_CONFIG_XT_OLD:=n
|
|
||||||
TC_CONFIG_XT_OLD_H:=n
|
|
||||||
TC_CONFIG_IPSET:=n
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PACKAGE_devlink
|
ifdef CONFIG_PACKAGE_devlink
|
||||||
|
@ -186,10 +161,6 @@ MAKE_FLAGS += \
|
||||||
HAVE_CAP=$(HAVE_CAP) \
|
HAVE_CAP=$(HAVE_CAP) \
|
||||||
IPT_LIB_DIR=/usr/lib/iptables \
|
IPT_LIB_DIR=/usr/lib/iptables \
|
||||||
XT_LIB_DIR=/usr/lib/iptables \
|
XT_LIB_DIR=/usr/lib/iptables \
|
||||||
TC_CONFIG_XT=$(TC_CONFIG_XT) \
|
|
||||||
TC_CONFIG_XT_OLD=$(TC_CONFIG_XT_OLD) \
|
|
||||||
TC_CONFIG_XT_OLD_H=$(TC_CONFIG_XT_OLD_H) \
|
|
||||||
TC_CONFIG_IPSET=$(TC_CONFIG_IPSET) \
|
|
||||||
FPIC="$(FPIC)" \
|
FPIC="$(FPIC)" \
|
||||||
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='')
|
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='')
|
||||||
|
|
||||||
|
@ -220,11 +191,6 @@ define Package/tc-tiny/install
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/libexec/tc-tiny
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/libexec/tc-tiny
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/tc-bpf/install
|
|
||||||
$(INSTALL_DIR) $(1)/usr/libexec
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/libexec/tc-bpf
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/tc-full/install
|
define Package/tc-full/install
|
||||||
$(INSTALL_DIR) $(1)/usr/libexec
|
$(INSTALL_DIR) $(1)/usr/libexec
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/libexec/tc-full
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/libexec/tc-full
|
||||||
|
@ -265,13 +231,12 @@ define Package/rdma/install
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/rdma/rdma $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/rdma/rdma $(1)/usr/sbin/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,ip-tiny))
|
#$(eval $(call BuildPackage,ip-tiny))
|
||||||
$(eval $(call BuildPackage,ip-full))
|
$(eval $(call BuildPackage,ip-full))
|
||||||
# build tc-mod-iptables before its dependents, to avoid
|
# build tc-mod-iptables before its dependents, to avoid
|
||||||
# spurious rebuilds when building multiple variants.
|
# spurious rebuilds when building multiple variants.
|
||||||
$(eval $(call BuildPackage,tc-mod-iptables))
|
$(eval $(call BuildPackage,tc-mod-iptables))
|
||||||
$(eval $(call BuildPackage,tc-tiny))
|
#$(eval $(call BuildPackage,tc-tiny))
|
||||||
$(eval $(call BuildPackage,tc-bpf))
|
|
||||||
$(eval $(call BuildPackage,tc-full))
|
$(eval $(call BuildPackage,tc-full))
|
||||||
$(eval $(call BuildPackage,genl))
|
$(eval $(call BuildPackage,genl))
|
||||||
$(eval $(call BuildPackage,ip-bridge))
|
$(eval $(call BuildPackage,ip-bridge))
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
--- a/ip/Makefile
|
|
||||||
+++ b/ip/Makefile
|
|
||||||
@@ -17,6 +17,13 @@ RTMONOBJ=rtmon.o
|
|
||||||
|
|
||||||
include ../config.mk
|
|
||||||
|
|
||||||
+STATIC_SYM_FILTER:=
|
|
||||||
+ifeq ($(IP_CONFIG_TINY),y)
|
|
||||||
+ STATIC_SYM_FILTER:=iplink_can.c iplink_ipoib.c iplink_vxlan.c
|
|
||||||
+ CFLAGS += -DIPROUTE2_TINY
|
|
||||||
+endif
|
|
||||||
+STATIC_SYM_SOURCES:=$(filter-out $(STATIC_SYM_FILTER),$(wildcard *.c))
|
|
||||||
+
|
|
||||||
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
|
|
||||||
SCRIPTS=ifcfg rtpr routel routef
|
|
||||||
TARGETS=ip rtmon
|
|
||||||
@@ -46,7 +53,7 @@ else
|
|
||||||
|
|
||||||
ip: static-syms.o
|
|
||||||
static-syms.o: static-syms.h
|
|
||||||
-static-syms.h: $(wildcard *.c)
|
|
||||||
+static-syms.h: $(STATIC_SYM_SOURCES)
|
|
||||||
files="$^" ; \
|
|
||||||
for s in `grep -B 3 '\<dlsym' $$files | sed -n '/snprintf/{s:.*"\([^"]*\)".*:\1:;s:%s::;p}'` ; do \
|
|
||||||
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
|
|
||||||
--- a/ip/ip.c
|
|
||||||
+++ b/ip/ip.c
|
|
||||||
@@ -64,11 +64,17 @@ static void usage(void)
|
|
||||||
fprintf(stderr,
|
|
||||||
"Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
|
|
||||||
" ip [ -force ] -batch filename\n"
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
"where OBJECT := { address | addrlabel | fou | help | ila | ioam | l2tp | link |\n"
|
|
||||||
" macsec | maddress | monitor | mptcp | mroute | mrule |\n"
|
|
||||||
" neighbor | neighbour | netconf | netns | nexthop | ntable |\n"
|
|
||||||
" ntbl | route | rule | sr | tap | tcpmetrics |\n"
|
|
||||||
" token | tunnel | tuntap | vrf | xfrm }\n"
|
|
||||||
+#else
|
|
||||||
+ "where OBJECT := { address | ila | link | macsec | maddress | monitor |\n"
|
|
||||||
+ " mroute | mrule | neighbor | neighbour | netns | route |\n"
|
|
||||||
+ " rule | sr | token | tunnel | vrf }\n"
|
|
||||||
+#endif
|
|
||||||
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
|
|
||||||
" -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
|
|
||||||
" -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
|
|
||||||
@@ -91,37 +97,51 @@ static const struct cmd {
|
|
||||||
int (*func)(int argc, char **argv);
|
|
||||||
} cmds[] = {
|
|
||||||
{ "address", do_ipaddr },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "addrlabel", do_ipaddrlabel },
|
|
||||||
+#endif
|
|
||||||
{ "maddress", do_multiaddr },
|
|
||||||
{ "route", do_iproute },
|
|
||||||
{ "rule", do_iprule },
|
|
||||||
{ "neighbor", do_ipneigh },
|
|
||||||
{ "neighbour", do_ipneigh },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "ntable", do_ipntable },
|
|
||||||
{ "ntbl", do_ipntable },
|
|
||||||
+#endif
|
|
||||||
{ "link", do_iplink },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "l2tp", do_ipl2tp },
|
|
||||||
{ "fou", do_ipfou },
|
|
||||||
+#endif
|
|
||||||
{ "ila", do_ipila },
|
|
||||||
{ "macsec", do_ipmacsec },
|
|
||||||
{ "tunnel", do_iptunnel },
|
|
||||||
{ "tunl", do_iptunnel },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "tuntap", do_iptuntap },
|
|
||||||
{ "tap", do_iptuntap },
|
|
||||||
{ "token", do_iptoken },
|
|
||||||
{ "tcpmetrics", do_tcp_metrics },
|
|
||||||
{ "tcp_metrics", do_tcp_metrics },
|
|
||||||
+#endif
|
|
||||||
{ "monitor", do_ipmonitor },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "xfrm", do_xfrm },
|
|
||||||
+#endif
|
|
||||||
{ "mroute", do_multiroute },
|
|
||||||
{ "mrule", do_multirule },
|
|
||||||
{ "netns", do_netns },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "netconf", do_ipnetconf },
|
|
||||||
+#endif
|
|
||||||
{ "vrf", do_ipvrf},
|
|
||||||
{ "sr", do_seg6 },
|
|
||||||
+#ifndef IPROUTE2_TINY
|
|
||||||
{ "nexthop", do_ipnh },
|
|
||||||
{ "mptcp", do_mptcp },
|
|
||||||
{ "ioam", do_ioam6 },
|
|
||||||
+#endif
|
|
||||||
{ "help", do_help },
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
--- a/lib/Makefile
|
|
||||||
+++ b/lib/Makefile
|
|
||||||
@@ -3,6 +3,10 @@ include ../config.mk
|
|
||||||
|
|
||||||
CFLAGS += $(FPIC)
|
|
||||||
|
|
||||||
+ifeq ($(IP_CONFIG_TINY),y)
|
|
||||||
+ CFLAGS += -DIPROUTE2_TINY
|
|
||||||
+endif
|
|
||||||
+
|
|
||||||
UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
|
|
||||||
inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
|
|
||||||
names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o
|
|
|
@ -1,22 +0,0 @@
|
||||||
--- a/ip/Makefile
|
|
||||||
+++ b/ip/Makefile
|
|
||||||
@@ -26,7 +26,7 @@ STATIC_SYM_SOURCES:=$(filter-out $(STATI
|
|
||||||
|
|
||||||
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
|
|
||||||
SCRIPTS=ifcfg rtpr routel routef
|
|
||||||
-TARGETS=ip rtmon
|
|
||||||
+TARGETS=$(findstring ip,$(BUILD_VARIANT)) rtmon
|
|
||||||
|
|
||||||
all: $(TARGETS) $(SCRIPTS)
|
|
||||||
|
|
||||||
--- a/tc/Makefile
|
|
||||||
+++ b/tc/Makefile
|
|
||||||
@@ -141,7 +141,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
|
|
||||||
$(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic $< -o $@
|
|
||||||
|
|
||||||
|
|
||||||
-all: tc $(TCSO)
|
|
||||||
+all: $(findstring tc,$(BUILD_VARIANT)) $(TCSO)
|
|
||||||
|
|
||||||
tc: $(TCOBJ) $(LIBNETLINK) libtc.a
|
|
||||||
$(QUIET_LINK)$(CC) $(filter-out dynsyms.list, $^) $(LDFLAGS) $(LDLIBS) -o $@
|
|
490
lcd4linux/Config.in
Executable file
490
lcd4linux/Config.in
Executable file
|
@ -0,0 +1,490 @@
|
||||||
|
if PACKAGE_lcd4linux-custom
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libdbus
|
||||||
|
bool
|
||||||
|
|
||||||
|
#config LCD4LINUX_CUSTOM_NEEDS_libftdi
|
||||||
|
# bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libiconv
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libjpeg
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libmpdclient
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libncurses
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libnmeap
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libsqlite3
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
bool
|
||||||
|
|
||||||
|
#config LCD4LINUX_CUSTOM_NEEDS_libX11
|
||||||
|
# bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_ppp
|
||||||
|
bool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_NEEDS_python
|
||||||
|
bool
|
||||||
|
|
||||||
|
|
||||||
|
comment "Drivers ---"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_ASTUSB
|
||||||
|
bool
|
||||||
|
prompt "ASTUSB"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_BeckmannEgle
|
||||||
|
bool
|
||||||
|
prompt "BeckmannEgle"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_BWCT
|
||||||
|
bool
|
||||||
|
prompt "BWCT"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_CrystalFontz
|
||||||
|
bool
|
||||||
|
prompt "CrystalFontz"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Curses
|
||||||
|
bool
|
||||||
|
prompt "Curses"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libncurses
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Cwlinux
|
||||||
|
bool
|
||||||
|
prompt "Cwlinux"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_D4D
|
||||||
|
bool
|
||||||
|
prompt "D4D"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_dpf
|
||||||
|
bool
|
||||||
|
prompt "dpf"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_EA232graphic
|
||||||
|
bool
|
||||||
|
prompt "EA232graphic"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_EFN
|
||||||
|
bool
|
||||||
|
prompt "EFN"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_FutabaVFD
|
||||||
|
bool
|
||||||
|
prompt "FutabaVFD"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_FW8888
|
||||||
|
bool
|
||||||
|
prompt "FW8888"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_G15
|
||||||
|
bool
|
||||||
|
prompt "G15"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_GLCD2USB
|
||||||
|
bool
|
||||||
|
prompt "GLCD2USB"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_HD44780
|
||||||
|
bool
|
||||||
|
prompt "HD44780"
|
||||||
|
depends on BROKEN
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_HD44780-I2C
|
||||||
|
bool
|
||||||
|
prompt "HD44780-I2C"
|
||||||
|
depends on BROKEN
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_IRLCD
|
||||||
|
bool
|
||||||
|
prompt "IRLCD"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LCD2USB
|
||||||
|
bool
|
||||||
|
prompt "LCD2USB"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LCDLinux
|
||||||
|
bool
|
||||||
|
prompt "LCDLinux"
|
||||||
|
depends on BROKEN
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LCDTerm
|
||||||
|
bool
|
||||||
|
prompt "LCDTerm"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LEDMatrix
|
||||||
|
bool
|
||||||
|
prompt "LEDMatrix"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LPH7508
|
||||||
|
bool
|
||||||
|
prompt "LPH7508"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LUIse
|
||||||
|
bool
|
||||||
|
prompt "LUIse"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
#select LCD4LINUX_CUSTOM_NEEDS_libluise
|
||||||
|
depends on BROKEN
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_LW_ABP
|
||||||
|
bool
|
||||||
|
prompt "LW_ABP"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_M50530
|
||||||
|
bool
|
||||||
|
prompt "M50530"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbital
|
||||||
|
bool
|
||||||
|
prompt "MatrixOrbital"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbitalGX
|
||||||
|
bool
|
||||||
|
prompt "MatrixOrbitalGX"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_mdm166a
|
||||||
|
bool
|
||||||
|
prompt "mdm166a"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_MilfordInstruments
|
||||||
|
bool
|
||||||
|
prompt "MilfordInstruments"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Newhaven
|
||||||
|
bool
|
||||||
|
prompt "Newhaven"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Noritake
|
||||||
|
bool
|
||||||
|
prompt "Noritake"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_NULL
|
||||||
|
bool
|
||||||
|
prompt "NULL"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Pertelian
|
||||||
|
bool
|
||||||
|
prompt "Pertelian"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_PHAnderson
|
||||||
|
bool
|
||||||
|
prompt "PHAnderson"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_PICGraphic
|
||||||
|
bool
|
||||||
|
prompt "PICGraphic"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_picoLCD
|
||||||
|
bool
|
||||||
|
prompt "picoLCD"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_picoLCDGraphic
|
||||||
|
bool
|
||||||
|
prompt "picoLCDGraphic"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_PNG
|
||||||
|
bool
|
||||||
|
prompt "PNG"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_PPM
|
||||||
|
bool
|
||||||
|
prompt "PPM"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_RouterBoard
|
||||||
|
bool
|
||||||
|
prompt "RouterBoard"
|
||||||
|
depends on TARGET_rb532
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_SamsungSPF
|
||||||
|
bool
|
||||||
|
prompt "SamsungSPF"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libjpeg
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_serdisplib
|
||||||
|
bool
|
||||||
|
prompt "serdisplib"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_serdisplib
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_ShuttleVFD
|
||||||
|
bool
|
||||||
|
prompt "ShuttleVFD"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_SimpleLCD
|
||||||
|
bool
|
||||||
|
prompt "SimpleLCD"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_st2205
|
||||||
|
bool
|
||||||
|
prompt "st2205"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_st2205tool
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_T6963
|
||||||
|
bool
|
||||||
|
prompt "T6963"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_TeakLCM
|
||||||
|
bool
|
||||||
|
prompt "TeakLCM"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_TEW673GRU
|
||||||
|
bool
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
depends on TARGET_ar71xx
|
||||||
|
default TARGET_ar71xx
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_Trefon
|
||||||
|
bool
|
||||||
|
prompt "Trefon"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
#config LCD4LINUX_CUSTOM_DRIVER_ULA200
|
||||||
|
# bool
|
||||||
|
# prompt "ULA200"
|
||||||
|
# select LCD4LINUX_CUSTOM_NEEDS_libftdi
|
||||||
|
# select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_USBHUB
|
||||||
|
bool
|
||||||
|
prompt "USBHUB"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_USBLCD
|
||||||
|
bool
|
||||||
|
prompt "USBLCD"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libusb
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_VNC
|
||||||
|
bool
|
||||||
|
prompt "VNC"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libvncserver
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_DRIVER_WincorNixdorf
|
||||||
|
bool
|
||||||
|
prompt "WincorNixdorf"
|
||||||
|
|
||||||
|
#config LCD4LINUX_CUSTOM_DRIVER_X11
|
||||||
|
# bool
|
||||||
|
# prompt "X11"
|
||||||
|
# select LCD4LINUX_CUSTOM_NEEDS_libgd
|
||||||
|
# select LCD4LINUX_CUSTOM_NEEDS_libX11
|
||||||
|
|
||||||
|
|
||||||
|
comment "Plugins ---"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_apm
|
||||||
|
bool
|
||||||
|
prompt "apm"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_asterisk
|
||||||
|
bool
|
||||||
|
prompt "asterisk"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_button_exec
|
||||||
|
bool
|
||||||
|
prompt "button_exec"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_cpuinfo
|
||||||
|
bool
|
||||||
|
prompt "cpuinfo"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_dbus
|
||||||
|
bool
|
||||||
|
prompt "dbus"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libdbus
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_diskstats
|
||||||
|
bool
|
||||||
|
prompt "diskstats"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_dvb
|
||||||
|
bool
|
||||||
|
prompt "dvb"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_event
|
||||||
|
bool
|
||||||
|
prompt "event"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_exec
|
||||||
|
bool
|
||||||
|
prompt "exec"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_fifo
|
||||||
|
bool
|
||||||
|
prompt "fifo"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_file
|
||||||
|
bool
|
||||||
|
prompt "file"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_gps
|
||||||
|
bool
|
||||||
|
prompt "gps"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libnmeap
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_hddtemp
|
||||||
|
bool
|
||||||
|
prompt "hddtemp"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_huawei
|
||||||
|
bool
|
||||||
|
prompt "huawei"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_i2c_sensors
|
||||||
|
bool
|
||||||
|
prompt "i2c_sensors"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_iconv
|
||||||
|
bool
|
||||||
|
prompt "iconv"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libiconv
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_imon
|
||||||
|
bool
|
||||||
|
prompt "imon"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_isdn
|
||||||
|
bool
|
||||||
|
prompt "isdn"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_kvv
|
||||||
|
bool
|
||||||
|
prompt "kvv"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_loadavg
|
||||||
|
bool
|
||||||
|
prompt "loadavg"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_meminfo
|
||||||
|
bool
|
||||||
|
prompt "meminfo"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_mpd
|
||||||
|
bool
|
||||||
|
prompt "mpd"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libmpdclient
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_mpris_dbus
|
||||||
|
bool
|
||||||
|
prompt "mpris_dbus"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libdbus
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_mysql
|
||||||
|
bool
|
||||||
|
prompt "mysql"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_netdev
|
||||||
|
bool
|
||||||
|
prompt "netdev"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_netinfo
|
||||||
|
bool
|
||||||
|
prompt "netinfo"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_pop3
|
||||||
|
bool
|
||||||
|
prompt "pop3"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_ppp
|
||||||
|
bool
|
||||||
|
prompt "ppp"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_ppp
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_proc_stat
|
||||||
|
bool
|
||||||
|
prompt "proc_stat"
|
||||||
|
default y
|
||||||
|
|
||||||
|
#config LCD4LINUX_CUSTOM_PLUGIN_python
|
||||||
|
# bool
|
||||||
|
# prompt "python"
|
||||||
|
# select LCD4LINUX_CUSTOM_NEEDS_python
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_qnaplog
|
||||||
|
bool
|
||||||
|
prompt "qnaplog"
|
||||||
|
select LCD4LINUX_CUSTOM_NEEDS_libsqlite3
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_seti
|
||||||
|
bool
|
||||||
|
prompt "seti"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_statfs
|
||||||
|
bool
|
||||||
|
prompt "statfs"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_uname
|
||||||
|
bool
|
||||||
|
prompt "uname"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_uptime
|
||||||
|
bool
|
||||||
|
prompt "uptime"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_w1retap
|
||||||
|
bool
|
||||||
|
prompt "w1retap"
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_wireless
|
||||||
|
bool
|
||||||
|
prompt "wireless"
|
||||||
|
depends on BROKEN
|
||||||
|
|
||||||
|
config LCD4LINUX_CUSTOM_PLUGIN_xmms
|
||||||
|
bool
|
||||||
|
prompt "xmms"
|
||||||
|
|
||||||
|
endif
|
306
lcd4linux/Makefile
Executable file
306
lcd4linux/Makefile
Executable file
|
@ -0,0 +1,306 @@
|
||||||
|
#
|
||||||
|
# Copyright (C) 2007-2015 OpenWrt.org
|
||||||
|
# Copyright (C) 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
|
||||||
|
#
|
||||||
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
|
# See /LICENSE for more information.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=lcd4linux
|
||||||
|
PKG_REV:=f13470faf00e52d1458f2a88d498716240edc272
|
||||||
|
PKG_VERSION:=r$(PKG_REV)
|
||||||
|
PKG_RELEASE:=4
|
||||||
|
|
||||||
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||||
|
#PKG_SOURCE_URL:=https://ssl.bulix.org/svn/lcd4linux/trunk/
|
||||||
|
PKG_SOURCE_URL:=https://github.com/redblue-pkt/lcd4linux.git
|
||||||
|
#PKG_SOURCE_SUBDIR:=lcd4linux-$(PKG_VERSION)
|
||||||
|
PKG_SOURCE_VERSION:=$(PKG_REV)
|
||||||
|
PKG_SOURCE_PROTO:=git
|
||||||
|
|
||||||
|
LCD4LINUX_DRIVERS:= \
|
||||||
|
ASTUSB \
|
||||||
|
BeckmannEgle \
|
||||||
|
BWCT \
|
||||||
|
CrystalFontz \
|
||||||
|
Curses \
|
||||||
|
Cwlinux \
|
||||||
|
D4D \
|
||||||
|
DPF \
|
||||||
|
EA232graphic \
|
||||||
|
EFN \
|
||||||
|
FutabaVFD \
|
||||||
|
FW8888 \
|
||||||
|
GLCD2USB \
|
||||||
|
IRLCD \
|
||||||
|
$(if $(CONFIG_BROKEN),HD44780) \
|
||||||
|
$(if $(CONFIG_BROKEN),HD44780-I2C) \
|
||||||
|
LCD2USB \
|
||||||
|
$(if $(CONFIG_BROKEN),LCDLinux) \
|
||||||
|
LCDTerm \
|
||||||
|
LEDMatrix \
|
||||||
|
LPH7508 \
|
||||||
|
$(if $(CONFIG_BROKEN),LUIse) \
|
||||||
|
LW_ABP \
|
||||||
|
M50530 \
|
||||||
|
MatrixOrbital \
|
||||||
|
MatrixOrbitalGX \
|
||||||
|
MilfordInstruments \
|
||||||
|
Newhaven \
|
||||||
|
Noritake \
|
||||||
|
NULL \
|
||||||
|
Pertelian \
|
||||||
|
PHAnderson \
|
||||||
|
PICGraphic \
|
||||||
|
picoLCD \
|
||||||
|
picoLCDGraphic \
|
||||||
|
PNG \
|
||||||
|
PPM \
|
||||||
|
$(if $(CONFIG_TARGET_rb532),RouterBoard) \
|
||||||
|
$(if $(CONFIG_BROKEN),SamsungSPF) \
|
||||||
|
ShuttleVFD \
|
||||||
|
SimpleLCD \
|
||||||
|
st2205 \
|
||||||
|
T6963 \
|
||||||
|
TeakLCM \
|
||||||
|
$(if $(CONFIG_TARGET_ar71xx),TEW673GRU) \
|
||||||
|
Trefon \
|
||||||
|
USBHUB \
|
||||||
|
USBLCD \
|
||||||
|
VNC \
|
||||||
|
WincorNixdorf \
|
||||||
|
serdisplib \
|
||||||
|
# G15 \
|
||||||
|
# ULA200 \
|
||||||
|
# X11 \
|
||||||
|
|
||||||
|
LCD4LINUX_PLUGINS:= \
|
||||||
|
apm \
|
||||||
|
asterisk \
|
||||||
|
button_exec \
|
||||||
|
cpuinfo \
|
||||||
|
dbus \
|
||||||
|
diskstats \
|
||||||
|
dvb \
|
||||||
|
event \
|
||||||
|
exec \
|
||||||
|
fifo \
|
||||||
|
file \
|
||||||
|
gps \
|
||||||
|
hddtemp \
|
||||||
|
huawei \
|
||||||
|
i2c_sensors \
|
||||||
|
iconv \
|
||||||
|
imon \
|
||||||
|
isdn \
|
||||||
|
kvv \
|
||||||
|
loadavg \
|
||||||
|
netdev \
|
||||||
|
netinfo \
|
||||||
|
meminfo \
|
||||||
|
mpris_dbus \
|
||||||
|
netdev \
|
||||||
|
pop3 \
|
||||||
|
ppp \
|
||||||
|
proc_stat \
|
||||||
|
qnaplog \
|
||||||
|
seti \
|
||||||
|
statfs \
|
||||||
|
uname \
|
||||||
|
uptime \
|
||||||
|
w1retap \
|
||||||
|
$(if $(CONFIG_BROKEN),wireless) \
|
||||||
|
xmms \
|
||||||
|
# mpd \
|
||||||
|
# mysql \
|
||||||
|
# python \
|
||||||
|
|
||||||
|
PKG_FIXUP:=autoreconf
|
||||||
|
PKG_INSTALL:=1
|
||||||
|
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
|
PKG_BUILD_DEPENDS:= \
|
||||||
|
# ppp \
|
||||||
|
# libftdi \
|
||||||
|
# libX11 \
|
||||||
|
# python \
|
||||||
|
|
||||||
|
PKG_CONFIG_DEPENDS:= \
|
||||||
|
$(patsubst %,CONFIG_LCD4LINUX_CUSTOM_DRIVER_%,$(LCD4LINUX_DRIVERS)) \
|
||||||
|
$(patsubst %,CONFIG_LCD4LINUX_CUSTOM_PLUGIN_%,$(LCD4LINUX_PLUGINS)) \
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
include $(INCLUDE_DIR)/nls.mk
|
||||||
|
|
||||||
|
define Package/lcd4linux/Default
|
||||||
|
SECTION:=utils
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
|
||||||
|
TITLE:=LCD display utility
|
||||||
|
URL:=http://lcd4linux.bulix.org/
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/lcd4linux/Default/description
|
||||||
|
LCD4Linux is a small program that grabs information from the kernel and
|
||||||
|
some subsystems and displays it on an external liquid crystal display.
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
define Package/lcd4linux-custom
|
||||||
|
$(call Package/lcd4linux/Default)
|
||||||
|
DEPENDS:= \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libdbus:libdbus \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libgd:libgd \
|
||||||
|
$(if $(ICONV_FULL),+LCD4LINUX_CUSTOM_NEEDS_libiconv:libiconv-full) \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libjpeg:libjpeg \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libncurses:libncurses \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libsqlite3:libsqlite3 \
|
||||||
|
+LCD4LINUX_CUSTOM_NEEDS_libusb:libusb-compat \
|
||||||
|
# +LCD4LINUX_CUSTOM_NEEDS_libmpdclient:libmpdclient \
|
||||||
|
# +LCD4LINUX_CUSTOM_NEEDS_libmysqlclient:libmysqlclient \
|
||||||
|
# +LCD4LINUX_CUSTOM_NEEDS_libftdi:libftdi \
|
||||||
|
# +LCD4LINUX_CUSTOM_NEEDS_libX11:libX11 \
|
||||||
|
# +LCD4LINUX_CUSTOM_NEEDS_python:python
|
||||||
|
MENU:=1
|
||||||
|
PROVIDES:=lcd4linux
|
||||||
|
VARIANT=custom
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/lcd4linux-custom/config
|
||||||
|
source "$(SOURCE)/Config.in"
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/lcd4linux-custom/description
|
||||||
|
$(call Package/lcd4linux/Default/description)
|
||||||
|
.
|
||||||
|
This package contains a customized version of LCD4Linux.
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
define Package/lcd4linux-full
|
||||||
|
$(call Package/lcd4linux/Default)
|
||||||
|
DEPENDS:= \
|
||||||
|
+libdbus \
|
||||||
|
+libgd \
|
||||||
|
$(if $(ICONV_FULL),+libiconv-full) \
|
||||||
|
+libncurses \
|
||||||
|
+libsqlite3 \
|
||||||
|
+libusb-compat \
|
||||||
|
+serdisplib
|
||||||
|
# +libmpdclient \
|
||||||
|
# +libmysqlclient \
|
||||||
|
# +libftdi \
|
||||||
|
# +libX11 \
|
||||||
|
# +python
|
||||||
|
PROVIDES:=lcd4linux
|
||||||
|
VARIANT=full
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/lcd4linux-full/description
|
||||||
|
$(call Package/lcd4linux/Default/description)
|
||||||
|
.
|
||||||
|
This package contains a version of LCD4Linux built with all supported
|
||||||
|
drivers and plugins.
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
CONFIGURE_ARGS+= \
|
||||||
|
--disable-rpath \
|
||||||
|
|
||||||
|
EXTRA_LDFLAGS+= -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
|
||||||
|
|
||||||
|
ifeq ($(BUILD_VARIANT),custom)
|
||||||
|
|
||||||
|
LCD4LINUX_CUSTOM_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
|
||||||
|
$(if $(CONFIG_LCD4LINUX_CUSTOM_DRIVER_$(c)),$(c),) \
|
||||||
|
))
|
||||||
|
ifeq ($(LCD4LINUX_CUSTOM_DRIVERS),)
|
||||||
|
LCD4LINUX_CUSTOM_DRIVERS:=Sample
|
||||||
|
endif
|
||||||
|
|
||||||
|
LCD4LINUX_CUSTOM_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
|
||||||
|
$(if $(CONFIG_LCD4LINUX_CUSTOM_PLUGIN_$(c)),$(c)) \
|
||||||
|
))
|
||||||
|
ifeq ($(LCD4LINUX_CUSTOM_PLUGINS),)
|
||||||
|
LCD4LINUX_CUSTOM_PLUGINS:=sample
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIGURE_ARGS+= \
|
||||||
|
--with-drivers="$(LCD4LINUX_CUSTOM_DRIVERS)" \
|
||||||
|
--with-plugins="$(LCD4LINUX_CUSTOM_PLUGINS)" \
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libiconv),)
|
||||||
|
CONFIGURE_ARGS+= --with-libiconv-prefix="$(ICONV_PREFIX)"
|
||||||
|
else
|
||||||
|
CONFIGURE_ARGS+= --without-libiconv-prefix
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libmysqlclient),)
|
||||||
|
EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_python),)
|
||||||
|
# CONFIGURE_ARGS+= --with-python
|
||||||
|
# else
|
||||||
|
CONFIGURE_ARGS+= --without-python
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libX11),)
|
||||||
|
# CONFIGURE_ARGS+= --with-x
|
||||||
|
# else
|
||||||
|
CONFIGURE_ARGS+= --without-x
|
||||||
|
# endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(BUILD_VARIANT),full)
|
||||||
|
|
||||||
|
LCD4LINUX_FULL_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
|
||||||
|
$(c) \
|
||||||
|
))
|
||||||
|
|
||||||
|
LCD4LINUX_FULL_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
|
||||||
|
$(c) \
|
||||||
|
))
|
||||||
|
|
||||||
|
CONFIGURE_ARGS+= \
|
||||||
|
--with-drivers="$(LCD4LINUX_FULL_DRIVERS)" \
|
||||||
|
--with-plugins="$(LCD4LINUX_FULL_PLUGINS)" \
|
||||||
|
--with-libiconv-prefix="$(ICONV_PREFIX)" \
|
||||||
|
--without-python \
|
||||||
|
--without-x \
|
||||||
|
|
||||||
|
EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
define Package/lcd4linux/conffiles
|
||||||
|
/etc/lcd4linux.conf
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/lcd4linux/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/bin
|
||||||
|
$(CP) $(PKG_INSTALL_DIR)/usr/bin/lcd4linux $(1)/usr/bin/
|
||||||
|
$(INSTALL_DIR) $(1)/etc
|
||||||
|
$(INSTALL_CONF) $(PKG_BUILD_DIR)/lcd4linux.conf.sample $(1)/etc/lcd4linux.conf
|
||||||
|
$(INSTALL_DIR) $(1)/etc/init.d
|
||||||
|
$(INSTALL_BIN) ./files/lcd4linux.init $(1)/etc/init.d/lcd4linux
|
||||||
|
$(SED) "s|^\(Display 'GLCD2USB'\)|#\1|g" \
|
||||||
|
-e "s|^\(Layout 'TestLayer'\)|#\1|g" \
|
||||||
|
-e "s|^#\(Display 'Image'\)|\1|g" \
|
||||||
|
-e "s|^#\(Layout 'Default'\)|\1|g" \
|
||||||
|
$(1)/etc/lcd4linux.conf
|
||||||
|
endef
|
||||||
|
|
||||||
|
Package/lcd4linux-custom/conffiles = $(Package/lcd4linux/conffiles)
|
||||||
|
Package/lcd4linux-custom/install = $(Package/lcd4linux/install)
|
||||||
|
|
||||||
|
Package/lcd4linux-full/conffiles = $(Package/lcd4linux/conffiles)
|
||||||
|
Package/lcd4linux-full/install = $(Package/lcd4linux/install)
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,lcd4linux-custom))
|
||||||
|
$(eval $(call BuildPackage,lcd4linux-full))
|
15
lcd4linux/files/lcd4linux.init
Executable file
15
lcd4linux/files/lcd4linux.init
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
# Copyright (C) 2007-2015 OpenWrt.org
|
||||||
|
|
||||||
|
START=98
|
||||||
|
|
||||||
|
SERVICE_USE_PID=1
|
||||||
|
|
||||||
|
start() {
|
||||||
|
service_start /usr/bin/lcd4linux -o /tmp/lcd4linux.png -q
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
service_stop /usr/bin/lcd4linux
|
||||||
|
}
|
||||||
|
|
11
lcd4linux/patches/120-remove-as-needed-linker-option.patch
Executable file
11
lcd4linux/patches/120-remove-as-needed-linker-option.patch
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
--- a/Makefile.am
|
||||||
|
+++ b/Makefile.am
|
||||||
|
@@ -18,7 +18,7 @@ ACLOCAL_AMFLAGS=-I m4
|
||||||
|
# use this for lots of warnings
|
||||||
|
#AM_CFLAGS = -D_GNU_SOURCE -std=c99 -m64 -Wall -W -pedantic -Wno-variadic-macros -fno-strict-aliasing
|
||||||
|
|
||||||
|
-lcd4linux_LDFLAGS ="-Wl,--as-needed"
|
||||||
|
+lcd4linux_LDFLAGS =
|
||||||
|
lcd4linux_LDADD = @DRIVERS@ @PLUGINS@ @DRVLIBS@ @PLUGINLIBS@
|
||||||
|
lcd4linux_DEPENDENCIES = @DRIVERS@ @PLUGINS@
|
||||||
|
|
22
lcd4linux/patches/140-no_repnop_T6963.patch
Executable file
22
lcd4linux/patches/140-no_repnop_T6963.patch
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
--- a/drv_T6963.c
|
||||||
|
+++ b/drv_T6963.c
|
||||||
|
@@ -114,7 +114,9 @@ static void drv_T6_status1(void)
|
||||||
|
/* wait for STA0=1 and STA1=1 */
|
||||||
|
n = 0;
|
||||||
|
do {
|
||||||
|
+#if 0
|
||||||
|
rep_nop();
|
||||||
|
+#endif
|
||||||
|
if (++n > 1000) {
|
||||||
|
debug("hang in status1");
|
||||||
|
bug = 1;
|
||||||
|
@@ -150,7 +152,9 @@ static void drv_T6_status2(void)
|
||||||
|
/* wait for STA3=1 */
|
||||||
|
n = 0;
|
||||||
|
do {
|
||||||
|
+#if 0
|
||||||
|
rep_nop();
|
||||||
|
+#endif
|
||||||
|
if (++n > 1000) {
|
||||||
|
debug("hang in status2");
|
||||||
|
bug = 1;
|
2624
lcd4linux/patches/150-addlibmpdclient.patch
Executable file
2624
lcd4linux/patches/150-addlibmpdclient.patch
Executable file
File diff suppressed because it is too large
Load diff
24
lcd4linux/patches/160-uinput_defs.patch
Executable file
24
lcd4linux/patches/160-uinput_defs.patch
Executable file
|
@ -0,0 +1,24 @@
|
||||||
|
--- a/drv_G15.c
|
||||||
|
+++ b/drv_G15.c
|
||||||
|
@@ -42,6 +42,7 @@
|
||||||
|
|
||||||
|
#include <usb.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
+#include <linux/version.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <linux/uinput.h>
|
||||||
|
|
||||||
|
@@ -269,8 +270,13 @@ void drv_G15_initKeyHandling(char *devic
|
||||||
|
}
|
||||||
|
memset(&device, 0, sizeof(device));
|
||||||
|
strncpy(device.name, "G15 Keys", UINPUT_MAX_NAME_SIZE);
|
||||||
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||||
|
device.id.bustype = BUS_USB;
|
||||||
|
device.id.version = 4;
|
||||||
|
+#else
|
||||||
|
+ device.idbus = BUS_USB;
|
||||||
|
+ device.idversion = 4;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
|
||||||
|
|
195
lcd4linux/patches/170-add-generic-spidev-driver.patch
Executable file
195
lcd4linux/patches/170-add-generic-spidev-driver.patch
Executable file
|
@ -0,0 +1,195 @@
|
||||||
|
--- a/Makefile.am
|
||||||
|
+++ b/Makefile.am
|
||||||
|
@@ -71,6 +71,8 @@ drv_generic_i2c.c \
|
||||||
|
drv_generic_i2c.h \
|
||||||
|
drv_generic_keypad.c \
|
||||||
|
drv_generic_keypad.h \
|
||||||
|
+drv_generic_spidev.c \
|
||||||
|
+drv_generic_spidev.h \
|
||||||
|
drv_ASTUSB.c \
|
||||||
|
drv_BeckmannEgle.c \
|
||||||
|
drv_BWCT.c \
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drv_generic_spidev.c
|
||||||
|
@@ -0,0 +1,89 @@
|
||||||
|
+/* $Id$
|
||||||
|
+ * $URL$
|
||||||
|
+ *
|
||||||
|
+ * generic driver helper for displays connected via SPI bus
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
+ *
|
||||||
|
+ * This file is part of LCD4Linux.
|
||||||
|
+ *
|
||||||
|
+ * LCD4Linux 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, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * LCD4Linux 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 this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "config.h"
|
||||||
|
+
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <fcntl.h>
|
||||||
|
+#include <sys/types.h>
|
||||||
|
+#include <sys/ioctl.h>
|
||||||
|
+
|
||||||
|
+#include "debug.h"
|
||||||
|
+#include "qprintf.h"
|
||||||
|
+#include "cfg.h"
|
||||||
|
+#include "drv_generic_spidev.h"
|
||||||
|
+
|
||||||
|
+static char *generic_spidev_section = "";
|
||||||
|
+static char *generic_spidev_driver = "";
|
||||||
|
+static int generic_spidev_fd;
|
||||||
|
+
|
||||||
|
+int drv_generic_spidev_open(const char *section, const char *driver)
|
||||||
|
+{
|
||||||
|
+ char *spidev;
|
||||||
|
+
|
||||||
|
+ udelay_init();
|
||||||
|
+
|
||||||
|
+ generic_spidev_section = (char *) section;
|
||||||
|
+ generic_spidev_driver = (char *) driver;
|
||||||
|
+
|
||||||
|
+ spidev = cfg_get(generic_spidev_section, "Port", NULL);
|
||||||
|
+
|
||||||
|
+ info("%s: initializing SPI device %s", generic_spidev_driver, spidev);
|
||||||
|
+ generic_spidev_fd = open(spidev, O_WRONLY);
|
||||||
|
+ if (generic_spidev_fd < 0) {
|
||||||
|
+ error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev);
|
||||||
|
+ goto exit_error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ exit_error:
|
||||||
|
+ free(spidev);
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int drv_generic_spidev_close(void)
|
||||||
|
+{
|
||||||
|
+ close(generic_spidev_fd);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr);
|
||||||
|
+ if (ret < count) {
|
||||||
|
+ error("%s: can't send SPI message! (%s)\n",
|
||||||
|
+ generic_spidev_driver, strerror(errno));
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drv_generic_spidev.h
|
||||||
|
@@ -0,0 +1,54 @@
|
||||||
|
+/* $Id$
|
||||||
|
+ * $URL$
|
||||||
|
+ *
|
||||||
|
+ * generic driver helper for displays connected via SPI bus
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
+ * Copyright (C) 2012 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
|
||||||
|
+ *
|
||||||
|
+ * This file is part of LCD4Linux.
|
||||||
|
+ *
|
||||||
|
+ * LCD4Linux 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, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * LCD4Linux 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 this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ *
|
||||||
|
+ * exported fuctions:
|
||||||
|
+ *
|
||||||
|
+ * int drv_generic_spidev_open (const char *section, const char *driver)
|
||||||
|
+ * reads 'Port' entry from config and opens
|
||||||
|
+ * the SPI device
|
||||||
|
+ * returns 0 if ok, -1 on failure
|
||||||
|
+ *
|
||||||
|
+ * int drv_generic_spidev_close (void)
|
||||||
|
+ * closes SPI device
|
||||||
|
+ * returns 0 if ok, -1 on failure
|
||||||
|
+ *
|
||||||
|
+ * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr)
|
||||||
|
+ * transfer data to/from the SPI device
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _DRV_GENERIC_SPIDEV_H_
|
||||||
|
+#define _DRV_GENERIC_SPIDEV_H_
|
||||||
|
+
|
||||||
|
+#include <linux/spi/spidev.h>
|
||||||
|
+
|
||||||
|
+int drv_generic_spidev_open(const char *section, const char *driver);
|
||||||
|
+int drv_generic_spidev_close(void);
|
||||||
|
+int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr);
|
||||||
|
+
|
||||||
|
+#endif /* _DRV_GENERIC_SPIDEV_H_ */
|
||||||
|
--- a/drivers.m4
|
||||||
|
+++ b/drivers.m4
|
||||||
|
@@ -301,6 +301,7 @@ PARPORT="no"
|
||||||
|
SERIAL="no"
|
||||||
|
I2C="no"
|
||||||
|
KEYPAD="no"
|
||||||
|
+SPIDEV="no"
|
||||||
|
|
||||||
|
# generic libraries
|
||||||
|
LIBUSB="no"
|
||||||
|
@@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then
|
||||||
|
DRVLIBS="$DRVLIBS -ljpeg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
+# generic spidev driver
|
||||||
|
+if test "$SPIDEV" = "yes"; then
|
||||||
|
+ DRIVERS="$DRIVERS drv_generic_spidev.o"
|
||||||
|
+ AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver])
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
# libusb
|
||||||
|
if test "$LIBUSB" = "yes"; then
|
||||||
|
DRVLIBS="$DRVLIBS -lusb"
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -115,6 +115,9 @@ AC_ARG_WITH(outb,
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"])
|
||||||
|
|
||||||
|
+# check for spidev
|
||||||
|
+AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"])
|
||||||
|
+
|
||||||
|
# drivers
|
||||||
|
sinclude(drivers.m4)
|
||||||
|
|
20
lcd4linux/patches/173-glcd2usb-bigendian-fix.patch
Executable file
20
lcd4linux/patches/173-glcd2usb-bigendian-fix.patch
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
--- a/drv_GLCD2USB.c
|
||||||
|
+++ b/drv_GLCD2USB.c
|
||||||
|
@@ -48,6 +48,7 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <usb.h>
|
||||||
|
+#include <endian.h>
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
#include "cfg.h"
|
||||||
|
@@ -487,6 +488,9 @@ static int drv_GLCD2USB_start(const char
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ buffer.display_info.width = le16toh(buffer.display_info.width);
|
||||||
|
+ buffer.display_info.height = le16toh(buffer.display_info.height);
|
||||||
|
+
|
||||||
|
info("%s: display name = %s", Name, buffer.display_info.name);
|
||||||
|
info("%s: display resolution = %d * %d", Name, buffer.display_info.width, buffer.display_info.height);
|
||||||
|
info("%s: display flags: %x", Name, buffer.display_info.flags);
|
|
@ -181,9 +181,9 @@ start_service() {
|
||||||
rmmod fast_classifier 2>&1 >/dev/null
|
rmmod fast_classifier 2>&1 >/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$(uci -q get rpcd.@rpcd[0].socket)" != "/var/run/ubus.sock" ]; then
|
if [ "$(uci -q get rpcd.@rpcd[0].socket)" != "/var/run/ubus/ubus.sock" ]; then
|
||||||
uci -q batch <<-EOF >/dev/null
|
uci -q batch <<-EOF >/dev/null
|
||||||
set rpcd.@rpcd[0].socket='/var/run/ubus.sock'
|
set rpcd.@rpcd[0].socket='/var/run/ubus/ubus.sock'
|
||||||
commit rpcd
|
commit rpcd
|
||||||
EOF
|
EOF
|
||||||
/etc/init.d/rpcd restart 2>&1 >/dev/null
|
/etc/init.d/rpcd restart 2>&1 >/dev/null
|
||||||
|
|
|
@ -9,14 +9,14 @@ include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=modemmanager
|
PKG_NAME:=modemmanager
|
||||||
PKG_VERSION:=1.18.6
|
PKG_VERSION:=1.18.6
|
||||||
PKG_RELEASE:=$(AUTORELEASE)
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_SOURCE:=ModemManager-$(PKG_VERSION).tar.xz
|
PKG_SOURCE:=ModemManager-$(PKG_VERSION).tar.xz
|
||||||
PKG_SOURCE_URL:=https://www.freedesktop.org/software/ModemManager
|
PKG_SOURCE_URL:=https://www.freedesktop.org/software/ModemManager
|
||||||
PKG_HASH:=d4f804b31cf504239c5f1d4973c62095c00cba1ee9abb503718dac6d146a470a
|
PKG_HASH:=d4f804b31cf504239c5f1d4973c62095c00cba1ee9abb503718dac6d146a470a
|
||||||
PKG_BUILD_DIR:=$(BUILD_DIR)/ModemManager-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(BUILD_DIR)/ModemManager-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_MAINTAINER:=Nicholas Smith <nicholas@nbembedded.com>
|
PKG_MAINTAINER:=Nicholas Smith <nicholas.smith@telcoantennas.com.au>
|
||||||
PKG_LICENSE:=GPL-2.0-or-later
|
PKG_LICENSE:=GPL-2.0-or-later
|
||||||
PKG_LICENSE_FILES:=COPYING
|
PKG_LICENSE_FILES:=COPYING
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,7 @@ MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache"
|
||||||
# Common logging
|
# Common logging
|
||||||
|
|
||||||
mm_log() {
|
mm_log() {
|
||||||
local level="$1"; shift
|
[ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && logger -t "ModemManager" "hotplug: $*"
|
||||||
logger -p "daemon.${level}" -t "ModemManager[$$]" "hotplug: $*"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -40,14 +39,14 @@ mm_find_physdev_sysfs_path() {
|
||||||
# avoid infinite loops iterating
|
# avoid infinite loops iterating
|
||||||
[ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return
|
[ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return
|
||||||
|
|
||||||
# For USB devices, the physical device will be that with a idVendor
|
# for USB devices, the physical device will be that with a idVendor
|
||||||
# and idProduct pair of files
|
# and idProduct pair of files
|
||||||
[ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && {
|
[ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && {
|
||||||
tmp_path=$(readlink -f "$tmp_path")
|
tmp_path=$(readlink -f "$tmp_path")
|
||||||
echo "${tmp_path}"
|
echo "${tmp_path}"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
# For PCI devices, the physical device will be that with a vendor
|
# For PCI devices, the physical device will be that with a vendor
|
||||||
# and device pair of files
|
# and device pair of files
|
||||||
[ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && {
|
[ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && {
|
||||||
|
@ -170,7 +169,7 @@ mm_wait_for_modem() {
|
||||||
|
|
||||||
while [ $n -ge 0 ]; do
|
while [ $n -ge 0 ]; do
|
||||||
[ -d "${sysfspath}" ] || {
|
[ -d "${sysfspath}" ] || {
|
||||||
mm_log "error" "ignoring modem detection request: no device at ${sysfspath}"
|
mm_log "error: ignoring modem detection request: no device at ${sysfspath}"
|
||||||
proto_set_available "${cfg}" 0
|
proto_set_available "${cfg}" 0
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -178,10 +177,10 @@ mm_wait_for_modem() {
|
||||||
# Check if the modem exists at the given sysfs path
|
# Check if the modem exists at the given sysfs path
|
||||||
if ! mmcli -m "${sysfspath}" > /dev/null 2>&1
|
if ! mmcli -m "${sysfspath}" > /dev/null 2>&1
|
||||||
then
|
then
|
||||||
mm_log "error" "modem not detected at sysfs path"
|
mm_log "error: modem not detected at sysfs path"
|
||||||
else
|
else
|
||||||
mm_log "info" "modem exported successfully at ${sysfspath}"
|
mm_log "modem exported successfully at ${sysfspath}"
|
||||||
mm_log "info" "setting interface '${cfg}' as available"
|
mm_log "setting interface '${cfg}' as available"
|
||||||
proto_set_available "${cfg}" 1
|
proto_set_available "${cfg}" 1
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
@ -190,7 +189,7 @@ mm_wait_for_modem() {
|
||||||
n=$((n-step))
|
n=$((n-step))
|
||||||
done
|
done
|
||||||
|
|
||||||
mm_log "error" "timed out waiting for the modem to get exported at ${sysfspath}"
|
mm_log "error: timed out waiting for the modem to get exported at ${sysfspath}"
|
||||||
proto_set_available "${cfg}" 0
|
proto_set_available "${cfg}" 0
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
|
@ -202,7 +201,7 @@ mm_report_modem_wait() {
|
||||||
|
|
||||||
parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath")
|
parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath")
|
||||||
[ -n "${parent_sysfspath}" ] || {
|
[ -n "${parent_sysfspath}" ] || {
|
||||||
mm_log "error" "parent device sysfspath not found"
|
mm_log "error: parent device sysfspath not found"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,23 +212,23 @@ mm_report_modem_wait() {
|
||||||
|
|
||||||
cfg=$(mm_get_modem_config "${parent_sysfspath}")
|
cfg=$(mm_get_modem_config "${parent_sysfspath}")
|
||||||
if [ -n "${cfg}" ]; then
|
if [ -n "${cfg}" ]; then
|
||||||
mm_log "info" "interface '${cfg}' is set to configure device '${parent_sysfspath}'"
|
mm_log "interface '${cfg}' is set to configure device '${parent_sysfspath}'"
|
||||||
mm_log "info" "now waiting for modem at sysfs path ${parent_sysfspath}"
|
mm_log "now waiting for modem at sysfs path ${parent_sysfspath}"
|
||||||
mm_set_modem_wait_status "${parent_sysfspath}" "processed"
|
mm_set_modem_wait_status "${parent_sysfspath}" "processed"
|
||||||
# Launch subshell for the explicit wait
|
# Launch subshell for the explicit wait
|
||||||
( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 &
|
( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 &
|
||||||
else
|
else
|
||||||
mm_log "info" "no need to wait for modem at sysfs path ${parent_sysfspath}"
|
mm_log "no need to wait for modem at sysfs path ${parent_sysfspath}"
|
||||||
mm_set_modem_wait_status "${parent_sysfspath}" "ignored"
|
mm_set_modem_wait_status "${parent_sysfspath}" "ignored"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"processed")
|
"processed")
|
||||||
mm_log "info" "already waiting for modem at sysfs path ${parent_sysfspath}"
|
mm_log "already waiting for modem at sysfs path ${parent_sysfspath}"
|
||||||
;;
|
;;
|
||||||
"ignored")
|
"ignored")
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
mm_log "error" "unknown status read for device at sysfs path ${parent_sysfspath}"
|
mm_log "error: unknown status read for device at sysfs path ${parent_sysfspath}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
@ -259,7 +258,7 @@ mm_cleanup_interface_by_sysfspath() {
|
||||||
cfg=$(mm_get_modem_config "$dev")
|
cfg=$(mm_get_modem_config "$dev")
|
||||||
[ -n "${cfg}" ] || return
|
[ -n "${cfg}" ] || return
|
||||||
|
|
||||||
mm_log "info" "setting interface '$cfg' as unavailable"
|
mm_log "setting interface '$cfg' as unavailable"
|
||||||
proto_set_available "${cfg}" 0
|
proto_set_available "${cfg}" 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +286,7 @@ mm_report_event() {
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Report the event
|
# Report the event
|
||||||
mm_log "debug" "event reported: action=${action}, name=${name}, subsystem=${subsystem}"
|
mm_log "event reported: action=${action}, name=${name}, subsystem=${subsystem}"
|
||||||
mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 &
|
mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 &
|
||||||
|
|
||||||
# Wait for added modem if a sysfspath is given
|
# Wait for added modem if a sysfspath is given
|
||||||
|
@ -303,7 +302,7 @@ mm_report_event_from_cache_line() {
|
||||||
subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }')
|
subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }')
|
||||||
sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }')
|
sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }')
|
||||||
|
|
||||||
mm_log "debug" "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}"
|
mm_log "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}"
|
||||||
mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}"
|
mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,11 +317,11 @@ mm_report_events_from_cache() {
|
||||||
# Wait for ModemManager to be available in the bus
|
# Wait for ModemManager to be available in the bus
|
||||||
while [ $n -ge 0 ]; do
|
while [ $n -ge 0 ]; do
|
||||||
sleep $step
|
sleep $step
|
||||||
mm_log "info" "checking if ModemManager is available..."
|
mm_log "checking if ModemManager is available..."
|
||||||
|
|
||||||
if ! mmcli -L >/dev/null 2>&1
|
if ! mmcli -L >/dev/null 2>&1
|
||||||
then
|
then
|
||||||
mm_log "info" "ModemManager not yet available"
|
mm_log "ModemManager not yet available"
|
||||||
else
|
else
|
||||||
mmrunning=1
|
mmrunning=1
|
||||||
break
|
break
|
||||||
|
@ -331,7 +330,7 @@ mm_report_events_from_cache() {
|
||||||
done
|
done
|
||||||
|
|
||||||
[ ${mmrunning} -eq 1 ] || {
|
[ ${mmrunning} -eq 1 ] || {
|
||||||
mm_log "error" "couldn't report initial kernel events: ModemManager not running"
|
mm_log "error: couldn't report initial kernel events: ModemManager not running"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
modemmanager/files/modemmanager.init
Executable file → Normal file
4
modemmanager/files/modemmanager.init
Executable file → Normal file
|
@ -4,8 +4,6 @@
|
||||||
USE_PROCD=1
|
USE_PROCD=1
|
||||||
START=70
|
START=70
|
||||||
|
|
||||||
LOG_LEVEL="INFO"
|
|
||||||
|
|
||||||
stop_service() {
|
stop_service() {
|
||||||
# Load common utils
|
# Load common utils
|
||||||
. /usr/share/ModemManager/modemmanager.common
|
. /usr/share/ModemManager/modemmanager.common
|
||||||
|
@ -30,8 +28,6 @@ start_service() {
|
||||||
. /usr/share/ModemManager/modemmanager.common
|
. /usr/share/ModemManager/modemmanager.common
|
||||||
procd_open_instance
|
procd_open_instance
|
||||||
procd_set_param command /usr/sbin/ModemManager-wrapper
|
procd_set_param command /usr/sbin/ModemManager-wrapper
|
||||||
procd_append_param command --log-level="$LOG_LEVEL"
|
|
||||||
[ "$LOG_LEVEL" = "DEBUG" ] && procd_append_param command --debug
|
|
||||||
procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}"
|
procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}"
|
||||||
procd_set_param pidfile "${MODEMMANAGER_PID_FILE}"
|
procd_set_param pidfile "${MODEMMANAGER_PID_FILE}"
|
||||||
procd_close_instance
|
procd_close_instance
|
||||||
|
|
|
@ -197,6 +197,7 @@ modemmanager_connected_method_dhcp_ipv4() {
|
||||||
local interface="$1"
|
local interface="$1"
|
||||||
local wwan="$2"
|
local wwan="$2"
|
||||||
local metric="$3"
|
local metric="$3"
|
||||||
|
local defaultroute="$4"
|
||||||
|
|
||||||
proto_init_update "${wwan}" 1
|
proto_init_update "${wwan}" 1
|
||||||
proto_set_keep 1
|
proto_set_keep 1
|
||||||
|
@ -222,6 +223,7 @@ modemmanager_connected_method_static_ipv4() {
|
||||||
local dns1="$7"
|
local dns1="$7"
|
||||||
local dns2="$8"
|
local dns2="$8"
|
||||||
local metric="$9"
|
local metric="$9"
|
||||||
|
local defaultroute="$10"
|
||||||
|
|
||||||
local mask=""
|
local mask=""
|
||||||
|
|
||||||
|
@ -242,8 +244,9 @@ modemmanager_connected_method_static_ipv4() {
|
||||||
proto_set_keep 1
|
proto_set_keep 1
|
||||||
echo "adding IPv4 address ${address}, netmask ${mask}"
|
echo "adding IPv4 address ${address}, netmask ${mask}"
|
||||||
proto_add_ipv4_address "${address}" "${mask}"
|
proto_add_ipv4_address "${address}" "${mask}"
|
||||||
[ -n "${gateway}" ] && {
|
[ -n "${gateway}" ] && [ "${defaultroute}" != 0 ] && {
|
||||||
echo "adding default IPv4 route via ${gateway}"
|
echo "adding default IPv4 route via ${gateway}"
|
||||||
|
logger -t "modemmanager.proto" "adding default IPv4 route via ${gateway} ${address}"
|
||||||
proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}"
|
proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}"
|
||||||
}
|
}
|
||||||
[ -n "${dns1}" ] && {
|
[ -n "${dns1}" ] && {
|
||||||
|
@ -262,6 +265,7 @@ modemmanager_connected_method_dhcp_ipv6() {
|
||||||
local interface="$1"
|
local interface="$1"
|
||||||
local wwan="$2"
|
local wwan="$2"
|
||||||
local metric="$3"
|
local metric="$3"
|
||||||
|
local defaultroute="$4"
|
||||||
|
|
||||||
proto_init_update "${wwan}" 1
|
proto_init_update "${wwan}" 1
|
||||||
proto_set_keep 1
|
proto_set_keep 1
|
||||||
|
@ -288,6 +292,7 @@ modemmanager_connected_method_static_ipv6() {
|
||||||
local dns1="$7"
|
local dns1="$7"
|
||||||
local dns2="$8"
|
local dns2="$8"
|
||||||
local metric="$9"
|
local metric="$9"
|
||||||
|
local defaultroute="$10"
|
||||||
|
|
||||||
[ -n "${address}" ] || {
|
[ -n "${address}" ] || {
|
||||||
proto_notify_error "${interface}" ADDRESS_MISSING
|
proto_notify_error "${interface}" ADDRESS_MISSING
|
||||||
|
@ -306,7 +311,7 @@ modemmanager_connected_method_static_ipv6() {
|
||||||
echo "adding IPv6 address ${address}, prefix ${prefix}"
|
echo "adding IPv6 address ${address}, prefix ${prefix}"
|
||||||
proto_add_ipv6_address "${address}" "128"
|
proto_add_ipv6_address "${address}" "128"
|
||||||
proto_add_ipv6_prefix "${address}/${prefix}"
|
proto_add_ipv6_prefix "${address}/${prefix}"
|
||||||
[ -n "${gateway}" ] && {
|
[ -n "${gateway}" ] && [ "$defaultroute" != 0 ] && {
|
||||||
echo "adding default IPv6 route via ${gateway}"
|
echo "adding default IPv6 route via ${gateway}"
|
||||||
proto_add_ipv6_route "${gateway}" "128"
|
proto_add_ipv6_route "${gateway}" "128"
|
||||||
proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}"
|
proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}"
|
||||||
|
@ -357,9 +362,9 @@ proto_modemmanager_setup() {
|
||||||
|
|
||||||
local device apn allowedauth username password pincode iptype metric signalrate
|
local device apn allowedauth username password pincode iptype metric signalrate
|
||||||
|
|
||||||
local address prefix gateway mtu dns1 dns2
|
local address prefix gateway mtu dns1 dns2 defaultroute
|
||||||
|
|
||||||
json_get_vars device apn allowedauth username password pincode iptype metric signalrate
|
json_get_vars device apn allowedauth username password pincode iptype metric signalrate defaultroute
|
||||||
|
|
||||||
# validate sysfs path given in config
|
# validate sysfs path given in config
|
||||||
[ -n "${device}" ] || {
|
[ -n "${device}" ] || {
|
||||||
|
@ -447,7 +452,7 @@ proto_modemmanager_setup() {
|
||||||
echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}"
|
echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}"
|
||||||
case "${bearermethod_ipv4}" in
|
case "${bearermethod_ipv4}" in
|
||||||
"dhcp")
|
"dhcp")
|
||||||
modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}"
|
modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}" "${defaultroute}"
|
||||||
;;
|
;;
|
||||||
"static")
|
"static")
|
||||||
address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address")
|
address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address")
|
||||||
|
@ -456,7 +461,7 @@ proto_modemmanager_setup() {
|
||||||
mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu")
|
mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu")
|
||||||
dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]")
|
dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]")
|
||||||
dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]")
|
dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]")
|
||||||
modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}"
|
modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" "${defaultroute}"
|
||||||
;;
|
;;
|
||||||
"ppp")
|
"ppp")
|
||||||
modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}"
|
modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}"
|
||||||
|
@ -474,7 +479,7 @@ proto_modemmanager_setup() {
|
||||||
echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}"
|
echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}"
|
||||||
case "${bearermethod_ipv6}" in
|
case "${bearermethod_ipv6}" in
|
||||||
"dhcp")
|
"dhcp")
|
||||||
modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}"
|
modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}" "${defaultroute}"
|
||||||
;;
|
;;
|
||||||
"static")
|
"static")
|
||||||
address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address")
|
address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address")
|
||||||
|
@ -483,7 +488,7 @@ proto_modemmanager_setup() {
|
||||||
mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu")
|
mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu")
|
||||||
dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]")
|
dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]")
|
||||||
dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]")
|
dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]")
|
||||||
modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}"
|
modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" "${defaultroute}"
|
||||||
;;
|
;;
|
||||||
"ppp")
|
"ppp")
|
||||||
proto_notify_error "${interface}" "unsupported method"
|
proto_notify_error "${interface}" "unsupported method"
|
||||||
|
|
0
modemmanager/files/usr/sbin/ModemManager-wrapper
Normal file → Executable file
0
modemmanager/files/usr/sbin/ModemManager-wrapper
Normal file → Executable file
|
@ -5,9 +5,9 @@ PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
|
PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
|
||||||
PKG_SOURCE_DATE:=2021-01-09
|
PKG_SOURCE_DATE:=2021-07-26
|
||||||
PKG_SOURCE_VERSION:=753c351bc729967a691d99e27693be5aec334028
|
PKG_SOURCE_VERSION:=440eb0647708274cc8d7d9e7c2bb0cfdfba90023
|
||||||
PKG_MIRROR_HASH:=e7d95bde520fc660d0a49e28c5bb50fff3071d7f48fe7fc3fc610f38edfc7df1
|
PKG_MIRROR_HASH:=eed957036ab608fdc49bdf801fc5b4405fcd2a3a5e5d3343ec39898e156c10e9
|
||||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
PKG_LICENSE:=GPL-2.0
|
PKG_LICENSE:=GPL-2.0
|
||||||
|
|
|
@ -25,6 +25,7 @@ MY_DEPENDS := \
|
||||||
uhttpd \
|
uhttpd \
|
||||||
uhttpd-mod-ubus \
|
uhttpd-mod-ubus \
|
||||||
curl \
|
curl \
|
||||||
|
iperf3-ssl luci-app-iperf \
|
||||||
arptables \
|
arptables \
|
||||||
bind-dig \
|
bind-dig \
|
||||||
libnetfilter-conntrack ebtables ebtables-utils ip-full nstat \
|
libnetfilter-conntrack ebtables ebtables-utils ip-full nstat \
|
||||||
|
@ -44,6 +45,8 @@ MY_DEPENDS := \
|
||||||
luci-mod-rpc rpcd-mod-rpcsys rpcd-mod-file rpcd-mod-iwinfo \
|
luci-mod-rpc rpcd-mod-rpcsys rpcd-mod-file rpcd-mod-iwinfo \
|
||||||
luci-app-openvpn \
|
luci-app-openvpn \
|
||||||
shadowsocks-libev-ss-server shadowsocks-libev-ss-tunnel \
|
shadowsocks-libev-ss-server shadowsocks-libev-ss-tunnel \
|
||||||
|
omr-6in4 ip6tables-mod-nat luci-proto-ipv6 6to4 6in4 6rd ip6tables \
|
||||||
|
speedtestcpp \
|
||||||
iftop \
|
iftop \
|
||||||
htop \
|
htop \
|
||||||
nano \
|
nano \
|
||||||
|
@ -75,7 +78,7 @@ MY_DEPENDS := \
|
||||||
!TARGET_mvebu:kmod-usb-net-huawei-cdc-ncm !TARGET_mvebu:kmod-usb-net-rndis !TARGET_mvebu:kmod-usb-net-cdc-ether !TARGET_mvebu:kmod-usb-net-ipheth !TARGET_mvebu:usbmuxd \
|
!TARGET_mvebu:kmod-usb-net-huawei-cdc-ncm !TARGET_mvebu:kmod-usb-net-rndis !TARGET_mvebu:kmod-usb-net-cdc-ether !TARGET_mvebu:kmod-usb-net-ipheth !TARGET_mvebu:usbmuxd \
|
||||||
kmod-rt2800-usb kmod-rtl8xxxu kmod-rtl8192cu kmod-net-rtl8192su kmod-rtl8812au-ct \
|
kmod-rt2800-usb kmod-rtl8xxxu kmod-rtl8192cu kmod-net-rtl8192su kmod-rtl8812au-ct \
|
||||||
!TARGET_mvebu:luci-proto-qmi wpad-basic kmod-mt7601u kmod-rtl8187 TARGET_r4s:kmod-r8168 (TARGET_x86||TARGET_x86_64):kmod-usb-net-rtl8152 \
|
!TARGET_mvebu:luci-proto-qmi wpad-basic kmod-mt7601u kmod-rtl8187 TARGET_r4s:kmod-r8168 (TARGET_x86||TARGET_x86_64):kmod-usb-net-rtl8152 \
|
||||||
luci-app-mlvpn mlvpn 464xlat !TARGET_mvebu:kmod-usb-net-smsc75xx kmod-zram kmod-swconfig swconfig kmod-ipt-nat kmod-tcp-nanqinlang (TARGET_x86_64||aarch64):kmod-tcp-bbr2 iptables-mod-ipopt igmpproxy ss iptraf-ng \
|
luci-app-mlvpn mlvpn 464xlat !TARGET_mvebu:kmod-usb-net-smsc75xx kmod-zram kmod-swconfig swconfig kmod-ipt-nat kmod-ipt-nat6 luci-app-https-dns-proxy kmod-tcp-nanqinlang (TARGET_x86_64||aarch64):kmod-tcp-bbr2 iptables-mod-ipopt igmpproxy ss iptraf-ng \
|
||||||
luci-app-acl block-mount blockd fstools luci-app-shutdown libwebp luci-proto-gre tcptraceroute luci-proto-mbim kmod-rtl8xxxu kmod-ath9k-htc luci-app-ttyd luci-mod-dashboard (TARGET_x86||TARGET_x86_64):rtl8192eu-firmware kmod-usb2 libustream-openssl (TARGET_x86||TARGET_x86_64):kmod-ixgbevf (TARGET_x86||TARGET_x86_64):kmod-igbvf \
|
luci-app-acl block-mount blockd fstools luci-app-shutdown libwebp luci-proto-gre tcptraceroute luci-proto-mbim kmod-rtl8xxxu kmod-ath9k-htc luci-app-ttyd luci-mod-dashboard (TARGET_x86||TARGET_x86_64):rtl8192eu-firmware kmod-usb2 libustream-openssl (TARGET_x86||TARGET_x86_64):kmod-ixgbevf (TARGET_x86||TARGET_x86_64):kmod-igbvf \
|
||||||
hwinfo (TARGET_x86||TARGET_x86_64):dmidecode luci-app-packet-capture kmod-bonding luci-proto-bonding luci-app-sysupgrade \
|
hwinfo (TARGET_x86||TARGET_x86_64):dmidecode luci-app-packet-capture kmod-bonding luci-proto-bonding luci-app-sysupgrade \
|
||||||
luci-theme-openwrt-2020 luci-proto-wireguard luci-app-wireguard (TARGET_x86||TARGET_x86_64):kmod-r8125 TARGET_x86_64:kmod-atlantic \
|
luci-theme-openwrt-2020 luci-proto-wireguard luci-app-wireguard (TARGET_x86||TARGET_x86_64):kmod-r8125 TARGET_x86_64:kmod-atlantic \
|
||||||
|
|
|
@ -17,9 +17,9 @@ uci -q batch <<-EOF >/dev/null
|
||||||
commit luci
|
commit luci
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [ "$(uci -q get rpcd.@rpcd[0].socket)" != "/var/run/ubus.sock" ]; then
|
if [ "$(uci -q get rpcd.@rpcd[0].socket)" != "/var/run/ubus/ubus.sock" ]; then
|
||||||
uci -q batch <<-EOF >/dev/null
|
uci -q batch <<-EOF >/dev/null
|
||||||
set rpcd.@rpcd[0].socket='/var/run/ubus.sock'
|
set rpcd.@rpcd[0].socket='/var/run/ubus/ubus.sock'
|
||||||
commit rpcd
|
commit rpcd
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -25,7 +25,7 @@ GO_PKG:=github.com/shadowsocks/v2ray-plugin
|
||||||
PKG_USE_MIPS16:=0
|
PKG_USE_MIPS16:=0
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
|
include ../golang/golang-package.mk
|
||||||
|
|
||||||
define Package/v2ray-plugin
|
define Package/v2ray-plugin
|
||||||
SECTION:=net
|
SECTION:=net
|
||||||
|
|
77
shortcut-fe/Makefile
Executable file
77
shortcut-fe/Makefile
Executable file
|
@ -0,0 +1,77 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 The Linux Foundation. All rights reserved.
|
||||||
|
# Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
# any purpose with or without fee is hereby granted, provided that the
|
||||||
|
# above copyright notice and this permission notice appear in all copies.
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
#
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
|
PKG_NAME:=shortcut-fe
|
||||||
|
PKG_RELEASE:=2
|
||||||
|
PKG_CONFIG_DEPENDS := CONFIG_IPV6
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define KernelPackage/shortcut-fe
|
||||||
|
SECTION:=kernel
|
||||||
|
CATEGORY:=Kernel modules
|
||||||
|
SUBMENU:=Network Support
|
||||||
|
DEPENDS:=
|
||||||
|
TITLE:=Kernel driver for SFE
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/shortcut-fe.ko $(if $(CONFIG_IPV6),$(PKG_BUILD_DIR)/shortcut-fe-ipv6.ko,)
|
||||||
|
KCONFIG:=CONFIG_NF_CONNTRACK_EVENTS=y \
|
||||||
|
CONFIG_NF_CONNTRACK_TIMEOUT=y \
|
||||||
|
CONFIG_SHORTCUT_FE=y \
|
||||||
|
CONFIG_XFRM=y
|
||||||
|
AUTOLOAD:=$(call AutoLoad,09,shortcut-fe shortcut-fe-ipv6)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/shortcut-fe/Description
|
||||||
|
Shortcut is an in-Linux-kernel IP packet forwarding engine.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/shortcut-fe/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/bin
|
||||||
|
$(INSTALL_BIN) ./files/usr/bin/sfe_dump $(1)/usr/bin
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/shortcut-fe-cm
|
||||||
|
SECTION:=kernel
|
||||||
|
CATEGORY:=Kernel modules
|
||||||
|
SUBMENU:=Network Support
|
||||||
|
DEPENDS:=+kmod-ipt-conntrack +kmod-shortcut-fe
|
||||||
|
TITLE:=Kernel driver for SFE
|
||||||
|
FILES:=$(PKG_BUILD_DIR)/shortcut-fe-cm.ko
|
||||||
|
KCONFIG:=CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y
|
||||||
|
endef
|
||||||
|
|
||||||
|
define KernelPackage/shortcut-fe-cm/Description
|
||||||
|
Simple connection manager for the Shortcut forwarding engine.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
+$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
|
||||||
|
$(KERNEL_MAKE_FLAGS) \
|
||||||
|
$(PKG_MAKE_FLAGS) \
|
||||||
|
M="$(PKG_BUILD_DIR)" \
|
||||||
|
modules \
|
||||||
|
$(if $(CONFIG_IPV6),EXTRA_CFLAGS="-DSFE_SUPPORT_IPV6" SFE_SUPPORT_IPV6=y,)
|
||||||
|
endef
|
||||||
|
|
||||||
|
#ifneq ($(CONFIG_PACKAGE_kmod-shortcut-fe)$(CONFIG_PACKAGE_kmod-shortcut-fe-cm),)
|
||||||
|
define Build/InstallDev
|
||||||
|
$(INSTALL_DIR) $(1)/usr/include/shortcut-fe
|
||||||
|
$(CP) -rf $(PKG_BUILD_DIR)/sfe.h $(1)/usr/include/shortcut-fe
|
||||||
|
endef
|
||||||
|
#endif
|
||||||
|
|
||||||
|
$(eval $(call KernelPackage,shortcut-fe))
|
||||||
|
$(eval $(call KernelPackage,shortcut-fe-cm))
|
35
shortcut-fe/files/usr/bin/sfe_dump
Executable file
35
shortcut-fe/files/usr/bin/sfe_dump
Executable file
|
@ -0,0 +1,35 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
||||||
|
# Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
# any purpose with or without fee is hereby granted, provided that the
|
||||||
|
# above copyright notice and this permission notice appear in all copies.
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
#
|
||||||
|
|
||||||
|
#@sfe_dump
|
||||||
|
#@example : sfe_dump (ipv4|ipv6)
|
||||||
|
sfe_dump(){
|
||||||
|
[ -e "/dev/sfe_ipv4" ] || {
|
||||||
|
dev_num=$(cat /sys/sfe_ipv4/debug_dev)
|
||||||
|
mknod /dev/sfe_ipv4 c $dev_num 0
|
||||||
|
}
|
||||||
|
[ -e "/dev/sfe_ipv6" ] || {
|
||||||
|
dev_num=$(cat /sys/sfe_ipv6/debug_dev)
|
||||||
|
mknod /dev/sfe_ipv6 c $dev_num 0
|
||||||
|
}
|
||||||
|
cat /dev/sfe_$1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
sfe_dump ipv4
|
||||||
|
sfe_dump ipv6
|
||||||
|
else
|
||||||
|
sfe_dump $1
|
||||||
|
fi
|
15
shortcut-fe/src/Kconfig
Executable file
15
shortcut-fe/src/Kconfig
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
#
|
||||||
|
# Shortcut forwarding engine
|
||||||
|
#
|
||||||
|
|
||||||
|
config SHORTCUT_FE
|
||||||
|
tristate "Shortcut Forwarding Engine"
|
||||||
|
depends on NF_CONNTRACK
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Shortcut is a fast in-kernel packet forwarding engine.
|
||||||
|
|
||||||
|
To compile this code as a module, choose M here: the module will be
|
||||||
|
called shortcut-fe.
|
||||||
|
|
||||||
|
If unsure, say N.
|
23
shortcut-fe/src/Makefile
Executable file
23
shortcut-fe/src/Makefile
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#
|
||||||
|
# Makefile for Shortcut FE.
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-m += shortcut-fe.o
|
||||||
|
|
||||||
|
ifdef SFE_SUPPORT_IPV6
|
||||||
|
obj-m += shortcut-fe-ipv6.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
obj-m += shortcut-fe-cm.o
|
||||||
|
|
||||||
|
shortcut-fe-objs := \
|
||||||
|
sfe_ipv4.o
|
||||||
|
|
||||||
|
ifdef SFE_SUPPORT_IPV6
|
||||||
|
shortcut-fe-ipv6-objs := \
|
||||||
|
sfe_ipv6.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
shortcut-fe-cm-objs := \
|
||||||
|
sfe_cm.o
|
||||||
|
|
114
shortcut-fe/src/sfe.h
Executable file
114
shortcut-fe/src/sfe.h
Executable file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* sfe.h
|
||||||
|
* Shortcut forwarding engine.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following are debug macros used throughout the SFE.
|
||||||
|
*
|
||||||
|
* The DEBUG_LEVEL enables the followings based on its value,
|
||||||
|
* when dynamic debug option is disabled.
|
||||||
|
*
|
||||||
|
* 0 = OFF
|
||||||
|
* 1 = ASSERTS / ERRORS
|
||||||
|
* 2 = 1 + WARN
|
||||||
|
* 3 = 2 + INFO
|
||||||
|
* 4 = 3 + TRACE
|
||||||
|
*/
|
||||||
|
#define DEBUG_LEVEL 2
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 1)
|
||||||
|
#define DEBUG_ASSERT(s, ...)
|
||||||
|
#define DEBUG_ERROR(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_ASSERT(c, s, ...) if (!(c)) { pr_emerg("ASSERT: %s:%d:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__); BUG(); }
|
||||||
|
#define DEBUG_ERROR(s, ...) pr_err("%s:%d:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||||
|
/*
|
||||||
|
* Compile messages for dynamic enable/disable
|
||||||
|
*/
|
||||||
|
#define DEBUG_WARN(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#define DEBUG_INFO(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#define DEBUG_TRACE(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Statically compile messages at different levels
|
||||||
|
*/
|
||||||
|
#if (DEBUG_LEVEL < 2)
|
||||||
|
#define DEBUG_WARN(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_WARN(s, ...) pr_warn("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 3)
|
||||||
|
#define DEBUG_INFO(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_INFO(s, ...) pr_notice("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEBUG_LEVEL < 4)
|
||||||
|
#define DEBUG_TRACE(s, ...)
|
||||||
|
#else
|
||||||
|
#define DEBUG_TRACE(s, ...) pr_info("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NF_FLOW_COOKIE
|
||||||
|
typedef int (*flow_cookie_set_func_t)(u32 protocol, __be32 src_ip, __be16 src_port,
|
||||||
|
__be32 dst_ip, __be16 dst_port, u16 flow_cookie);
|
||||||
|
/*
|
||||||
|
* sfe_register_flow_cookie_cb
|
||||||
|
* register a function in SFE to let SFE use this function to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* Hardware driver which support flow cookie should register a callback function in SFE. Then SFE
|
||||||
|
* can use this function to configure flow cookie for a flow.
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_register_flow_cookie_cb(flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_unregister_flow_cookie_cb
|
||||||
|
* unregister function which is used to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_unregister_flow_cookie_cb(flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
typedef int (*sfe_ipv6_flow_cookie_set_func_t)(u32 protocol, __be32 src_ip[4], __be16 src_port,
|
||||||
|
__be32 dst_ip[4], __be16 dst_port, u16 flow_cookie);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_register_flow_cookie_cb
|
||||||
|
* register a function in SFE to let SFE use this function to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* Hardware driver which support flow cookie should register a callback function in SFE. Then SFE
|
||||||
|
* can use this function to configure flow cookie for a flow.
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_register_flow_cookie_cb(sfe_ipv6_flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_unregister_flow_cookie_cb
|
||||||
|
* unregister function which is used to configure flow cookie for a flow
|
||||||
|
*
|
||||||
|
* return: 0, success; !=0, fail
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_unregister_flow_cookie_cb(sfe_ipv6_flow_cookie_set_func_t cb);
|
||||||
|
|
||||||
|
#endif /*CONFIG_NF_FLOW_COOKIE*/
|
195
shortcut-fe/src/sfe_backport.h
Executable file
195
shortcut-fe/src/sfe_backport.h
Executable file
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
* sfe_backport.h
|
||||||
|
* Shortcut forwarding engine compatible header file.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
|
||||||
|
#include <net/netfilter/nf_conntrack_timeout.h>
|
||||||
|
#else
|
||||||
|
enum udp_conntrack {
|
||||||
|
UDP_CT_UNREPLIED,
|
||||||
|
UDP_CT_REPLIED,
|
||||||
|
UDP_CT_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline unsigned int *
|
||||||
|
nf_ct_timeout_lookup(struct net *net, struct nf_conn *ct,
|
||||||
|
struct nf_conntrack_l4proto *l4proto)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||||
|
struct nf_conn_timeout *timeout_ext;
|
||||||
|
unsigned int *timeouts;
|
||||||
|
|
||||||
|
timeout_ext = nf_ct_timeout_find(ct);
|
||||||
|
if (timeout_ext)
|
||||||
|
timeouts = NF_CT_TIMEOUT_EXT_DATA(timeout_ext);
|
||||||
|
else
|
||||||
|
timeouts = l4proto->get_timeouts(net);
|
||||||
|
|
||||||
|
return timeouts;
|
||||||
|
#else
|
||||||
|
return l4proto->get_timeouts(net);
|
||||||
|
#endif /*CONFIG_NF_CONNTRACK_TIMEOUT*/
|
||||||
|
}
|
||||||
|
#endif /*KERNEL_VERSION(3, 7, 0)*/
|
||||||
|
#endif /*KERNEL_VERSION(3, 4, 0)*/
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(void *priv, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct nf_hook_state *state)
|
||||||
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(const struct nf_hook_ops *OPS, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct net_device *UNUSED, \
|
||||||
|
const struct net_device *OUT, \
|
||||||
|
int (*OKFN)(struct sk_buff *))
|
||||||
|
#else
|
||||||
|
#define sfe_define_post_routing_hook(FN_NAME, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
static unsigned int FN_NAME(unsigned int HOOKNUM, \
|
||||||
|
struct sk_buff *SKB, \
|
||||||
|
const struct net_device *UNUSED, \
|
||||||
|
const struct net_device *OUT, \
|
||||||
|
int (*OKFN)(struct sk_buff *))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define sfe_cm_ipv4_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__sfe_cm_ipv4_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define sfe_cm_ipv6_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__sfe_cm_ipv6_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define fast_classifier_ipv4_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__fast_classifier_ipv4_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
#define fast_classifier_ipv6_post_routing_hook(HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN) \
|
||||||
|
sfe_define_post_routing_hook(__fast_classifier_ipv6_post_routing_hook, HOOKNUM, OPS, SKB, UNUSED, OUT, OKFN)
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define SFE_IPV4_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.pf = NFPROTO_IPV4, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define SFE_IPV4_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.owner = THIS_MODULE, \
|
||||||
|
.pf = NFPROTO_IPV4, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
|
||||||
|
#define SFE_IPV6_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.pf = NFPROTO_IPV6, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define SFE_IPV6_NF_POST_ROUTING_HOOK(fn) \
|
||||||
|
{ \
|
||||||
|
.hook = fn, \
|
||||||
|
.owner = THIS_MODULE, \
|
||||||
|
.pf = NFPROTO_IPV6, \
|
||||||
|
.hooknum = NF_INET_POST_ROUTING, \
|
||||||
|
.priority = NF_IP6_PRI_NAT_SRC + 1, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0))
|
||||||
|
#define SFE_NF_CT_DEFAULT_ZONE (&nf_ct_zone_dflt)
|
||||||
|
#else
|
||||||
|
#define SFE_NF_CT_DEFAULT_ZONE NF_CT_DEFAULT_ZONE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_dev_get_master
|
||||||
|
* get master of bridge port, and hold it
|
||||||
|
*/
|
||||||
|
static inline struct net_device *sfe_dev_get_master(struct net_device *dev)
|
||||||
|
{
|
||||||
|
struct net_device *master;
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
rcu_read_lock();
|
||||||
|
master = netdev_master_upper_dev_get_rcu(dev);
|
||||||
|
if (master)
|
||||||
|
dev_hold(master);
|
||||||
|
|
||||||
|
rcu_read_unlock();
|
||||||
|
#else
|
||||||
|
master = dev->master;
|
||||||
|
if (master)
|
||||||
|
dev_hold(master);
|
||||||
|
#endif
|
||||||
|
return master;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
|
||||||
|
#define SFE_DEV_EVENT_PTR(PTR) netdev_notifier_info_to_dev(PTR)
|
||||||
|
#else
|
||||||
|
#define SFE_DEV_EVENT_PTR(PTR) (struct net_device *)(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define SFE_NF_CONN_ACCT(NM) struct nf_conn_acct *NM
|
||||||
|
#else
|
||||||
|
#define SFE_NF_CONN_ACCT(NM) struct nf_conn_counter *NM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
|
||||||
|
#define SFE_ACCT_COUNTER(NM) ((NM)->counter)
|
||||||
|
#else
|
||||||
|
#define SFE_ACCT_COUNTER(NM) (NM)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
#define sfe_hash_for_each_possible(name, obj, node, member, key) \
|
||||||
|
hash_for_each_possible(name, obj, member, key)
|
||||||
|
#else
|
||||||
|
#define sfe_hash_for_each_possible(name, obj, node, member, key) \
|
||||||
|
hash_for_each_possible(name, obj, node, member, key)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
|
||||||
|
#define sfe_hash_for_each(name, bkt, node, obj, member) \
|
||||||
|
hash_for_each(name, bkt, obj, member)
|
||||||
|
#else
|
||||||
|
#define sfe_hash_for_each(name, bkt, node, obj, member) \
|
||||||
|
hash_for_each(name, bkt, node, obj, member)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
|
||||||
|
#define sfe_dst_get_neighbour(dst, daddr) dst_neigh_lookup(dst, daddr)
|
||||||
|
#else
|
||||||
|
static inline struct neighbour *
|
||||||
|
sfe_dst_get_neighbour(struct dst_entry *dst, void *daddr)
|
||||||
|
{
|
||||||
|
struct neighbour *neigh = dst_get_neighbour_noref(dst);
|
||||||
|
|
||||||
|
if (neigh)
|
||||||
|
neigh_hold(neigh);
|
||||||
|
|
||||||
|
return neigh;
|
||||||
|
}
|
||||||
|
#endif
|
1146
shortcut-fe/src/sfe_cm.c
Executable file
1146
shortcut-fe/src/sfe_cm.c
Executable file
File diff suppressed because it is too large
Load diff
259
shortcut-fe/src/sfe_cm.h
Executable file
259
shortcut-fe/src/sfe_cm.h
Executable file
|
@ -0,0 +1,259 @@
|
||||||
|
/*
|
||||||
|
* sfe_cm.h
|
||||||
|
* Shortcut forwarding engine.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all copies.
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection flags.
|
||||||
|
*/
|
||||||
|
#define SFE_CREATE_FLAG_NO_SEQ_CHECK BIT(0)
|
||||||
|
/* Indicates that we should not check sequence numbers */
|
||||||
|
#define SFE_CREATE_FLAG_REMARK_PRIORITY BIT(1)
|
||||||
|
/* Indicates that we should remark priority of skb */
|
||||||
|
#define SFE_CREATE_FLAG_REMARK_DSCP BIT(2)
|
||||||
|
/* Indicates that we should remark DSCP of packet */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IPv6 address structure
|
||||||
|
*/
|
||||||
|
struct sfe_ipv6_addr {
|
||||||
|
__be32 addr[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
__be32 ip;
|
||||||
|
struct sfe_ipv6_addr ip6[1];
|
||||||
|
} sfe_ip_addr_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection creation structure.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_create {
|
||||||
|
int protocol;
|
||||||
|
struct net_device *src_dev;
|
||||||
|
struct net_device *dest_dev;
|
||||||
|
u32 flags;
|
||||||
|
u32 src_mtu;
|
||||||
|
u32 dest_mtu;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t src_ip_xlate;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
sfe_ip_addr_t dest_ip_xlate;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 src_port_xlate;
|
||||||
|
__be16 dest_port;
|
||||||
|
__be16 dest_port_xlate;
|
||||||
|
u8 src_mac[ETH_ALEN];
|
||||||
|
u8 src_mac_xlate[ETH_ALEN];
|
||||||
|
u8 dest_mac[ETH_ALEN];
|
||||||
|
u8 dest_mac_xlate[ETH_ALEN];
|
||||||
|
u8 src_td_window_scale;
|
||||||
|
u32 src_td_max_window;
|
||||||
|
u32 src_td_end;
|
||||||
|
u32 src_td_max_end;
|
||||||
|
u8 dest_td_window_scale;
|
||||||
|
u32 dest_td_max_window;
|
||||||
|
u32 dest_td_end;
|
||||||
|
u32 dest_td_max_end;
|
||||||
|
u32 mark;
|
||||||
|
#ifdef CONFIG_XFRM
|
||||||
|
u32 original_accel;
|
||||||
|
u32 reply_accel;
|
||||||
|
#endif
|
||||||
|
u32 src_priority;
|
||||||
|
u32 dest_priority;
|
||||||
|
u32 src_dscp;
|
||||||
|
u32 dest_dscp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection destruction structure.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_destroy {
|
||||||
|
int protocol;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 dest_port;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum sfe_sync_reason {
|
||||||
|
SFE_SYNC_REASON_STATS, /* Sync is to synchronize stats */
|
||||||
|
SFE_SYNC_REASON_FLUSH, /* Sync is to flush a entry */
|
||||||
|
SFE_SYNC_REASON_DESTROY /* Sync is to destroy a entry(requested by connection manager) */
|
||||||
|
} sfe_sync_reason_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used to sync connection stats/state back within the system.
|
||||||
|
*
|
||||||
|
* NOTE: The addresses here are NON-NAT addresses, i.e. the true endpoint addressing.
|
||||||
|
* 'src' is the creator of the connection.
|
||||||
|
*/
|
||||||
|
struct sfe_connection_sync {
|
||||||
|
struct net_device *src_dev;
|
||||||
|
struct net_device *dest_dev;
|
||||||
|
int is_v6; /* Is it for ipv6? */
|
||||||
|
int protocol; /* IP protocol number (IPPROTO_...) */
|
||||||
|
sfe_ip_addr_t src_ip; /* Non-NAT source address, i.e. the creator of the connection */
|
||||||
|
sfe_ip_addr_t src_ip_xlate; /* NATed source address */
|
||||||
|
__be16 src_port; /* Non-NAT source port */
|
||||||
|
__be16 src_port_xlate; /* NATed source port */
|
||||||
|
sfe_ip_addr_t dest_ip; /* Non-NAT destination address, i.e. to whom the connection was created */
|
||||||
|
sfe_ip_addr_t dest_ip_xlate; /* NATed destination address */
|
||||||
|
__be16 dest_port; /* Non-NAT destination port */
|
||||||
|
__be16 dest_port_xlate; /* NATed destination port */
|
||||||
|
u32 src_td_max_window;
|
||||||
|
u32 src_td_end;
|
||||||
|
u32 src_td_max_end;
|
||||||
|
u64 src_packet_count;
|
||||||
|
u64 src_byte_count;
|
||||||
|
u32 src_new_packet_count;
|
||||||
|
u32 src_new_byte_count;
|
||||||
|
u32 dest_td_max_window;
|
||||||
|
u32 dest_td_end;
|
||||||
|
u32 dest_td_max_end;
|
||||||
|
u64 dest_packet_count;
|
||||||
|
u64 dest_byte_count;
|
||||||
|
u32 dest_new_packet_count;
|
||||||
|
u32 dest_new_byte_count;
|
||||||
|
u32 reason; /* reason for stats sync message, i.e. destroy, flush, period sync */
|
||||||
|
u64 delta_jiffies; /* Time to be added to the current timeout to keep the connection alive */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* connection mark structure
|
||||||
|
*/
|
||||||
|
struct sfe_connection_mark {
|
||||||
|
int protocol;
|
||||||
|
sfe_ip_addr_t src_ip;
|
||||||
|
sfe_ip_addr_t dest_ip;
|
||||||
|
__be16 src_port;
|
||||||
|
__be16 dest_port;
|
||||||
|
u32 mark;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expose the hook for the receive processing.
|
||||||
|
*/
|
||||||
|
extern int (*athrs_fast_nat_recv)(struct sk_buff *skb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expose what should be a static flag in the TCP connection tracker.
|
||||||
|
*/
|
||||||
|
extern int nf_ct_tcp_no_window_check;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This callback will be called in a timer
|
||||||
|
* at 100 times per second to sync stats back to
|
||||||
|
* Linux connection track.
|
||||||
|
*
|
||||||
|
* A RCU lock is taken to prevent this callback
|
||||||
|
* from unregistering.
|
||||||
|
*/
|
||||||
|
typedef void (*sfe_sync_rule_callback_t)(struct sfe_connection_sync *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IPv4 APIs used by connection manager
|
||||||
|
*/
|
||||||
|
int sfe_ipv4_recv(struct net_device *dev, struct sk_buff *skb);
|
||||||
|
int sfe_ipv4_create_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv4_destroy_rule(struct sfe_connection_destroy *sid);
|
||||||
|
void sfe_ipv4_destroy_all_rules_for_dev(struct net_device *dev);
|
||||||
|
void sfe_ipv4_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
|
||||||
|
void sfe_ipv4_update_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv4_mark_rule(struct sfe_connection_mark *mark);
|
||||||
|
|
||||||
|
#ifdef SFE_SUPPORT_IPV6
|
||||||
|
/*
|
||||||
|
* IPv6 APIs used by connection manager
|
||||||
|
*/
|
||||||
|
int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb);
|
||||||
|
int sfe_ipv6_create_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid);
|
||||||
|
void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev);
|
||||||
|
void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
|
||||||
|
void sfe_ipv6_update_rule(struct sfe_connection_create *sic);
|
||||||
|
void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark);
|
||||||
|
#else
|
||||||
|
static inline int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int sfe_ipv6_create_rule(struct sfe_connection_create *sic)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_update_rule(struct sfe_connection_create *sic)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv6_addr_equal()
|
||||||
|
* compare ipv6 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
static inline int sfe_ipv6_addr_equal(struct sfe_ipv6_addr *a,
|
||||||
|
struct sfe_ipv6_addr *b)
|
||||||
|
{
|
||||||
|
return a->addr[0] == b->addr[0] &&
|
||||||
|
a->addr[1] == b->addr[1] &&
|
||||||
|
a->addr[2] == b->addr[2] &&
|
||||||
|
a->addr[3] == b->addr[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_ipv4_addr_equal()
|
||||||
|
* compare ipv4 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
#define sfe_ipv4_addr_equal(a, b) ((u32)(a) == (u32)(b))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfe_addr_equal()
|
||||||
|
* compare ipv4 or ipv6 address
|
||||||
|
*
|
||||||
|
* return: 1, equal; 0, no equal
|
||||||
|
*/
|
||||||
|
static inline int sfe_addr_equal(sfe_ip_addr_t *a,
|
||||||
|
sfe_ip_addr_t *b, int is_v4)
|
||||||
|
{
|
||||||
|
return is_v4 ? sfe_ipv4_addr_equal(a->ip, b->ip) : sfe_ipv6_addr_equal(a->ip6, b->ip6);
|
||||||
|
}
|
3621
shortcut-fe/src/sfe_ipv4.c
Executable file
3621
shortcut-fe/src/sfe_ipv4.c
Executable file
File diff suppressed because it is too large
Load diff
3628
shortcut-fe/src/sfe_ipv6.c
Executable file
3628
shortcut-fe/src/sfe_ipv6.c
Executable file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue