From 3ea06dac40ab9a96d3482746ef77a9e93fc0b35f Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 9 Jun 2022 07:27:39 +0200 Subject: [PATCH 01/10] dhcpsnoop: update code * Update to latest version of dhcpsnoop * always snoop all upstream interfaces * add snooped leases to state Fixes: WIFI-7838 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 +- feeds/ucentral/udhcpsnoop/Makefile | 17 +- .../ucentral/udhcpsnoop/files/dhcpsnoop.conf | 6 + .../udhcpsnoop/files/dhcpsnoop.hotplug | 2 + .../ucentral/udhcpsnoop/files/dhcpsnoop.init | 60 +++ .../udhcpsnoop/files/etc/config/dhcpsnoop | 4 - .../udhcpsnoop/files/etc/init.d/dhcpsnoop | 22 - feeds/ucentral/udhcpsnoop/src/CMakeLists.txt | 16 + feeds/ucentral/udhcpsnoop/src/cache.c | 77 ++++ feeds/ucentral/udhcpsnoop/src/dev.c | 425 ++++++++++++++++++ feeds/ucentral/udhcpsnoop/src/dhcp.c | 90 ++++ feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h | 32 ++ feeds/ucentral/udhcpsnoop/src/main.c | 84 ++++ feeds/ucentral/udhcpsnoop/src/msg.h | 88 ++++ feeds/ucentral/udhcpsnoop/src/ubus.c | 117 +++++ ...gnore-dhcp-on-the-ifb-dhcp-interface.patch | 25 ++ 16 files changed, 1033 insertions(+), 36 deletions(-) create mode 100644 feeds/ucentral/udhcpsnoop/files/dhcpsnoop.conf create mode 100644 feeds/ucentral/udhcpsnoop/files/dhcpsnoop.hotplug create mode 100644 feeds/ucentral/udhcpsnoop/files/dhcpsnoop.init delete mode 100644 feeds/ucentral/udhcpsnoop/files/etc/config/dhcpsnoop delete mode 100755 feeds/ucentral/udhcpsnoop/files/etc/init.d/dhcpsnoop create mode 100644 feeds/ucentral/udhcpsnoop/src/CMakeLists.txt create mode 100644 feeds/ucentral/udhcpsnoop/src/cache.c create mode 100644 feeds/ucentral/udhcpsnoop/src/dev.c create mode 100644 feeds/ucentral/udhcpsnoop/src/dhcp.c create mode 100644 feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h create mode 100644 feeds/ucentral/udhcpsnoop/src/main.c create mode 100644 feeds/ucentral/udhcpsnoop/src/msg.h create mode 100644 feeds/ucentral/udhcpsnoop/src/ubus.c create mode 100644 patches/base/0023-dnsmasq-ignore-dhcp-on-the-ifb-dhcp-interface.patch diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index 030d78d25..e76beec2c 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=3ba2d66f8e52c784f136bf340ab2fb81568a1d8df8dbebfa487fc57652bea04f +PKG_MIRROR_HASH:=5e67f448e77e918a0225d5174c7eafc2ded09c5e0803f5bcf21f91749649f501 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=96324e2f7443cb3ae70f8fca10f37548f673e3f8 +PKG_SOURCE_VERSION:=a292ac3e41ec97fd2e22e6f614c0edeeb7eb7966 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause diff --git a/feeds/ucentral/udhcpsnoop/Makefile b/feeds/ucentral/udhcpsnoop/Makefile index a813b7fe2..e5f1105c1 100644 --- a/feeds/ucentral/udhcpsnoop/Makefile +++ b/feeds/ucentral/udhcpsnoop/Makefile @@ -6,12 +6,6 @@ PKG_RELEASE:=1 PKG_LICENSE:=GPL-2.0 PKG_MAINTAINER:=John Crispin -PKG_SOURCE_URL=https://github.com/blogic/udhcpsnoop.git -PKG_MIRROR_HASH:=721f005e51c46b9381f3e5a6576b8a31afd3903ddb0e7b569d7337a57ca33dd2 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2021-04-12 -PKG_SOURCE_VERSION:=b86639904147a40be32ac43cd89c21109ffc3543 - include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -19,13 +13,20 @@ define Package/udhcpsnoop SECTION:=net CATEGORY:=Network TITLE:=DHCP Snooping Daemon - DEPENDS:=+libubox +libubus +libuci + DEPENDS:=+libubox +libubus +kmod-ifb +tc endef define Package/udhcpsnoop/install + $(INSTALL_DIR) \ + $(1)/usr/sbin \ + $(1)/etc/init.d \ + $(1)/etc/config \ + $(1)/etc/hotplug.d/net $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/udhcpsnoop $(1)/usr/sbin/ - $(CP) ./files/* $(1) + $(INSTALL_BIN) ./files/dhcpsnoop.init $(1)/etc/init.d/dhcpsnoop + $(INSTALL_DATA) ./files/dhcpsnoop.conf $(1)/etc/config/dhcpsnoop + $(INSTALL_DATA) ./files/dhcpsnoop.hotplug $(1)/etc/hotplug.d/net/10-dhcpsnoop endef $(eval $(call BuildPackage,udhcpsnoop)) diff --git a/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.conf b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.conf new file mode 100644 index 000000000..0b480eda4 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.conf @@ -0,0 +1,6 @@ +#config device +# option disabled 1 +# option name eth0 +# option ingress 1 +# option egress 1 + diff --git a/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.hotplug b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.hotplug new file mode 100644 index 000000000..f45e0d14e --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.hotplug @@ -0,0 +1,2 @@ +#!/bin/sh +ubus call dhcpsnoop check_devices diff --git a/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.init b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.init new file mode 100644 index 000000000..27ec852c7 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/files/dhcpsnoop.init @@ -0,0 +1,60 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2021 OpenWrt.org + +START=40 + +USE_PROCD=1 +PROG=/usr/sbin/udhcpsnoop + +add_option() { + local type="$1" + local name="$2" + local default="$3" + + config_get val "$cfg" "$name" + + [ -n "$val" ] && json_add_$type "$name" "${val:-$default}" +} + +add_device() { + local cfg="$1" + + config_get_bool disabled "$cfg" disabled 0 + [ "$disabled" -gt 0 ] && return + + config_get name "$cfg" name + json_add_object "$name" + + add_option boolean ingress 1 + add_option boolean egress 1 + + json_close_object +} + +reload_service() { + json_init + + config_load dhcpsnoop + + json_add_object devices + config_foreach add_device device + json_close_object + + ubus call dhcpsnoop config "$(json_dump)" +} + +service_triggers() { + procd_add_reload_trigger dhcpsnoop +} + +start_service() { + procd_open_instance + procd_set_param command "$PROG" + procd_set_param respawn + procd_close_instance +} + +service_started() { + ubus -t 10 wait_for dhcpsnoop + [ $? = 0 ] && reload_service +} diff --git a/feeds/ucentral/udhcpsnoop/files/etc/config/dhcpsnoop b/feeds/ucentral/udhcpsnoop/files/etc/config/dhcpsnoop deleted file mode 100644 index 21b1c41be..000000000 --- a/feeds/ucentral/udhcpsnoop/files/etc/config/dhcpsnoop +++ /dev/null @@ -1,4 +0,0 @@ -config snooping - option enable 0 - #list network lan - #list network wan diff --git a/feeds/ucentral/udhcpsnoop/files/etc/init.d/dhcpsnoop b/feeds/ucentral/udhcpsnoop/files/etc/init.d/dhcpsnoop deleted file mode 100755 index 30fe27247..000000000 --- a/feeds/ucentral/udhcpsnoop/files/etc/init.d/dhcpsnoop +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=80 - -USE_PROCD=1 -PROG=/usr/sbin/udhcpsnoop - -service_triggers() { - procd_add_reload_trigger dhcpsnoop -} - -start_service() { - [ "$(uci get dhcpsnoop.@snooping[-1].enable)" -eq 1 ] || return - procd_open_instance - procd_set_param command "$PROG" - procd_set_param respawn - procd_close_instance -} - -reload_service() { - restart -} diff --git a/feeds/ucentral/udhcpsnoop/src/CMakeLists.txt b/feeds/ucentral/udhcpsnoop/src/CMakeLists.txt new file mode 100644 index 000000000..1b677dd15 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.10) + +PROJECT(udhcpsnoop C) +INCLUDE(GNUInstallDirs) +ADD_DEFINITIONS(-Os -ggdb -Wall -Werror --std=gnu99 -Wmissing-declarations) + +SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") + +SET(SOURCES main.c ubus.c dev.c dhcp.c cache.c) +SET(LIBS ubox ubus) + +ADD_EXECUTABLE(udhcpsnoop ${SOURCES}) +TARGET_LINK_LIBRARIES(udhcpsnoop ${LIBS}) +INSTALL(TARGETS udhcpsnoop + RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR} +) diff --git a/feeds/ucentral/udhcpsnoop/src/cache.c b/feeds/ucentral/udhcpsnoop/src/cache.c new file mode 100644 index 000000000..df606a1d5 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/cache.c @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ + +#include + +#include "dhcpsnoop.h" +#include "msg.h" + +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_VAR(x) x[0], x[1], x[2], x[3], x[4], x[5] + +#define IP_FMT "%d.%d.%d.%d" +#define IP_VAR(x) x[0], x[1], x[2], x[3] + +struct mac { + struct avl_node avl; + uint8_t mac[6]; + uint8_t ip[4]; + struct uloop_timeout rebind; +}; + +static int +avl_mac_cmp(const void *k1, const void *k2, void *ptr) +{ + return memcmp(k1, k2, 6); +} + +static struct avl_tree mac_tree = AVL_TREE_INIT(mac_tree, avl_mac_cmp, false, NULL); + +static void +cache_expire(struct uloop_timeout *t) +{ + struct mac *mac = container_of(t, struct mac, rebind); + + avl_delete(&mac_tree, &mac->avl); + free(mac); +} + +void +cache_entry(void *_msg, uint32_t rebind) +{ + struct dhcpv4_message *msg = (struct dhcpv4_message *) _msg; + struct mac *mac; + + mac = avl_find_element(&mac_tree, msg->chaddr, mac, avl); + + if (!mac) { + mac = malloc(sizeof(*mac)); + if (!mac) + return; + memset(mac, 0, sizeof(*mac)); + memcpy(mac->mac, msg->chaddr, 6); + mac->avl.key = mac->mac; + mac->rebind.cb = cache_expire; + avl_insert(&mac_tree, &mac->avl); + } + memcpy(mac->ip, &msg->yiaddr.s_addr, 4); + uloop_timeout_set(&mac->rebind, rebind * 1000); +} + +void +cache_dump(struct blob_buf *b) +{ + struct mac *mac; + + avl_for_each_element(&mac_tree, mac, avl) { + char addr[18]; + char ip[16]; + + snprintf(addr, sizeof(addr), MAC_FMT, MAC_VAR(mac->mac)); + snprintf(ip, sizeof(ip), IP_FMT, IP_VAR(mac->ip)); + + blobmsg_add_string(b, addr, ip); + } +} diff --git a/feeds/ucentral/udhcpsnoop/src/dev.c b/feeds/ucentral/udhcpsnoop/src/dev.c new file mode 100644 index 000000000..865fb1a76 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/dev.c @@ -0,0 +1,425 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "dhcpsnoop.h" + +#define APPEND(_buf, _ofs, _format, ...) _ofs += snprintf(_buf + _ofs, sizeof(_buf) - _ofs, _format, ##__VA_ARGS__) + +struct vlan_hdr { + uint16_t tci; + uint16_t proto; +}; + +struct packet { + void *buffer; + unsigned int len; +}; + + +struct device { + struct vlist_node node; + char ifname[IFNAMSIZ + 1]; + + int ifindex; + bool ingress; + bool egress; + + bool changed; + bool active; +}; + +static void dev_update_cb(struct vlist_tree *tree, struct vlist_node *node_new, + struct vlist_node *node_old); + +static struct uloop_fd ufd; +static VLIST_TREE(devices, avl_strcmp, dev_update_cb, true, false); + +static void *pkt_peek(struct packet *pkt, unsigned int len) +{ + if (len > pkt->len) + return NULL; + + return pkt->buffer; +} + + +static void *pkt_pull(struct packet *pkt, unsigned int len) +{ + void *ret = pkt_peek(pkt, len); + + if (!ret) + return NULL; + + pkt->buffer += len; + pkt->len -= len; + + return ret; +} + +static bool +proto_is_vlan(uint16_t proto) +{ + return proto == ETH_P_8021Q || proto == ETH_P_8021AD; +} + +static void +dhcpsnoop_packet_cb(struct packet *pkt) +{ + struct ethhdr *eth; + struct ip6_hdr *ip6; + struct ip *ip; + struct udphdr *udp; + uint16_t proto, port; + const char *type; + bool ipv6 = false; + uint32_t rebind = 0; + + eth = pkt_pull(pkt, sizeof(*eth)); + if (!eth) + return; + + proto = be16_to_cpu(eth->h_proto); + if (proto_is_vlan(proto)) { + struct vlan_hdr *vlan; + + vlan = pkt_pull(pkt, sizeof(*vlan)); + if (!vlan) + return; + + proto = be16_to_cpu(vlan->proto); + } + + switch (proto) { + case ETH_P_IP: + ip = pkt_peek(pkt, sizeof(struct ip)); + if (!ip) + return; + + if (!pkt_pull(pkt, ip->ip_hl * 4)) + return; + + proto = ip->ip_p; + break; + case ETH_P_IPV6: + ip6 = pkt_pull(pkt, sizeof(*ip6)); + if (!ip6) + return; + + proto = ip6->ip6_nxt; + ipv6 = true; + break; + default: + return; + } + + if (proto != IPPROTO_UDP) + return; + + udp = pkt_pull(pkt, sizeof(struct udphdr)); + if (!udp) + return; + + port = ntohs(udp->uh_sport); + + if (!ipv6) + type = dhcpsnoop_parse_ipv4(pkt->buffer, pkt->len, port, &rebind); + else + type = dhcpsnoop_parse_ipv6(pkt->buffer, pkt->len, port); + + if (!type) + return; + + dhcpsnoop_ubus_notify(type, pkt->buffer, pkt->len); + if (!ipv6 && !strcmp(type, "ack") && rebind) + cache_entry(pkt->buffer, rebind); +} + +static void +dhcpsnoop_socket_cb(struct uloop_fd *fd, unsigned int events) +{ + static uint8_t buf[8192]; + struct packet pkt = { + .buffer = buf, + }; + int len; + +retry: + len = recvfrom(fd->fd, buf, sizeof(buf), MSG_DONTWAIT, NULL, NULL); + if (len < 0) { + if (errno == EINTR) + goto retry; + return; + } + + if (!len) + return; + + pkt.len = len; + dhcpsnoop_packet_cb(&pkt); +} + +static int +dhcpsnoop_open_socket(void) +{ + struct sockaddr_ll sll = { + .sll_family = AF_PACKET, + .sll_protocol = htons(ETH_P_ALL), + }; + int sock; + + sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + if (sock == -1) { + ULOG_ERR("failed to create raw socket: %s\n", strerror(errno)); + return -1; + } + + sll.sll_ifindex = if_nametoindex(DHCPSNOOP_IFB_NAME); + if (bind(sock, (struct sockaddr *)&sll, sizeof(sll))) { + ULOG_ERR("failed to bind socket to "DHCPSNOOP_IFB_NAME": %s\n", + strerror(errno)); + goto error; + } + + fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK); + + ufd.fd = sock; + ufd.cb = dhcpsnoop_socket_cb; + uloop_fd_add(&ufd, ULOOP_READ); + + return 0; + +error: + close(sock); + return -1; +} + +static int +prepare_filter_cmd(char *buf, int len, const char *dev, int prio, bool add, bool egress) +{ + return snprintf(buf, len, "tc filter %s dev '%s' %sgress prio %d", + add ? "add" : "del", dev, egress ? "e" : "in", prio); +} + +static void +dhcpsnoop_dev_attach_filters(struct device *dev, bool egress) +{ + int prio = DHCPSNOOP_PRIO_BASE; + char buf[256]; + int ofs; + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol ip u32 match ip sport 67 0xffff" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol 802.1Q u32 offset plus 4 match ip sport 67 0xffff" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol ip u32 match ip sport 68 0xffff" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol 802.1Q u32 offset plus 4 match ip sport 68 0xffff" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol ipv6 u32 match ip6 sport 546 0xfffe" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); + + ofs = prepare_filter_cmd(buf, sizeof(buf), dev->ifname, prio++, true, egress); + APPEND(buf, ofs, " protocol 802.1Q u32 offset plus 4 match ip6 sport 546 0xfffe" + " flowid 1:1 action mirred ingress mirror dev " DHCPSNOOP_IFB_NAME); + dhcpsnoop_run_cmd(buf, false); +} + +static void +dhcpsnoop_dev_cleanup_filters(struct device *dev, bool egress) +{ + char buf[128]; + int i; + + for (i = DHCPSNOOP_PRIO_BASE; i < DHCPSNOOP_PRIO_BASE + 6; i++) { + prepare_filter_cmd(buf, sizeof(buf), dev->ifname, i, false, egress); + dhcpsnoop_run_cmd(buf, true); + } +} + +static void +dhcpsnoop_dev_attach(struct device *dev) +{ + char buf[64]; + + dev->active = true; + snprintf(buf, sizeof(buf), "tc qdisc add dev '%s' clsact", dev->ifname); + dhcpsnoop_run_cmd(buf, true); + + if (dev->ingress) + dhcpsnoop_dev_attach_filters(dev, false); + if (dev->egress) + dhcpsnoop_dev_attach_filters(dev, true); +} + +static void +dhcpsnoop_dev_cleanup(struct device *dev) +{ + dev->active = false; + dhcpsnoop_dev_cleanup_filters(dev, true); + dhcpsnoop_dev_cleanup_filters(dev, false); +} + +static void +__dhcpsnoop_dev_check(struct device *dev) +{ + int ifindex; + + ifindex = if_nametoindex(dev->ifname); + if (ifindex != dev->ifindex) { + dev->ifindex = ifindex; + dev->changed = true; + } + + if (!dev->changed) + return; + + dev->changed = false; + dhcpsnoop_dev_cleanup(dev); + if (ifindex) + dhcpsnoop_dev_attach(dev); +} + +static void dev_update_cb(struct vlist_tree *tree, struct vlist_node *node_new, + struct vlist_node *node_old) +{ + struct device *dev = NULL, *dev_free = NULL; + + if (node_old && node_new) { + dev = container_of(node_old, struct device, node); + dev_free = container_of(node_new, struct device, node); + + if (dev->ingress != dev_free->ingress || + dev->egress != dev_free->egress) + dev->changed = true; + + dev->ingress = dev_free->ingress; + dev->egress = dev_free->egress; + } else if (node_old) { + dev_free = container_of(node_old, struct device, node); + if (dev_free->active) + dhcpsnoop_dev_cleanup(dev_free); + } else if (node_new) { + dev = container_of(node_new, struct device, node); + } + + if (dev) + __dhcpsnoop_dev_check(dev); + if (dev_free) + free(dev_free); +} + +static void +dhcpsnoop_dev_config_add(struct blob_attr *data) +{ + enum { + DEV_ATTR_INGRESS, + DEV_ATTR_EGRESS, + __DEV_ATTR_MAX + }; + static const struct blobmsg_policy policy[__DEV_ATTR_MAX] = { + [DEV_ATTR_INGRESS] = { "ingress", BLOBMSG_TYPE_BOOL }, + [DEV_ATTR_EGRESS] = { "egress", BLOBMSG_TYPE_BOOL }, + }; + struct blob_attr *tb[__DEV_ATTR_MAX]; + struct blob_attr *cur; + struct device *dev; + int len; + + if (blobmsg_type(data) != BLOBMSG_TYPE_TABLE) + return; + + dev = calloc(1, sizeof(*dev)); + len = snprintf(dev->ifname, sizeof(dev->ifname), "%s", blobmsg_name(data)); + if (!len || len > IFNAMSIZ) + goto free; + + blobmsg_parse(policy, ARRAY_SIZE(tb), tb, blobmsg_data(data), blobmsg_len(data)); + + if ((cur = tb[DEV_ATTR_INGRESS]) != NULL) + dev->ingress = blobmsg_get_bool(cur); + if ((cur = tb[DEV_ATTR_EGRESS]) != NULL) + dev->egress = blobmsg_get_bool(cur); + + if (!dev->ingress && !dev->egress) + goto free; + + vlist_add(&devices, &dev->node, dev->ifname); + return; + +free: + free(dev); + return; +} + +void dhcpsnoop_dev_config_update(struct blob_attr *data) +{ + struct blob_attr *cur; + int rem; + + vlist_update(&devices); + blobmsg_for_each_attr(cur, data, rem) + dhcpsnoop_dev_config_add(cur); + vlist_flush(&devices); +} + +void dhcpsnoop_dev_check(void) +{ + struct device *dev; + + vlist_for_each_element(&devices, dev, node) + __dhcpsnoop_dev_check(dev); +} + +int dhcpsnoop_dev_init(void) +{ + dhcpsnoop_dev_done(); + + if (dhcpsnoop_run_cmd("ip link add "DHCPSNOOP_IFB_NAME" type ifb", false) || + dhcpsnoop_run_cmd("ip link set dev "DHCPSNOOP_IFB_NAME" up", false) || + dhcpsnoop_open_socket()) + return -1; + + return 0; +} + +void dhcpsnoop_dev_done(void) +{ + if (ufd.registered) { + uloop_fd_delete(&ufd); + close(ufd.fd); + } + + dhcpsnoop_run_cmd("ip link del "DHCPSNOOP_IFB_NAME, true); + vlist_flush_all(&devices); +} diff --git a/feeds/ucentral/udhcpsnoop/src/dhcp.c b/feeds/ucentral/udhcpsnoop/src/dhcp.c new file mode 100644 index 000000000..27ba4d62c --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/dhcp.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ + +#include "dhcpsnoop.h" +#include "msg.h" + +const char *dhcpsnoop_parse_ipv4(const void *buf, size_t len, uint16_t port, uint32_t *rebind) +{ + const struct dhcpv4_message *msg = buf; + const uint8_t *pos, *end; + char type = 0; + + if (port != 67 && port != 68) + return NULL; + + if (len < sizeof(*msg)) + return NULL; + + if (ntohl(msg->magic) != DHCPV4_MAGIC) + return NULL; + + pos = msg->options; + end = buf + len; + + while (pos < end) { + const uint8_t *opt = pos++; + + if (*opt == DHCPV4_OPT_END) + break; + + if (*opt == DHCPV4_OPT_PAD) + continue; + + if (pos >= end || 1 + *pos > end - pos) + break; + + pos += *pos + 1; + if (pos >= end) + break; + + switch (*opt) { + case DHCPV4_OPT_MSG_TYPE: + if (!opt[1]) + continue; + type = opt[2]; + break; + case DHCPV4_OPT_REBIND: + if (!rebind || opt[1] != 4) + continue; + *rebind = *((uint32_t *) &opt[2]); + break; + } + } + + switch(type) { + case DHCPV4_MSG_ACK: + return "ack"; + case DHCPV4_MSG_DISCOVER: + return "discover"; + case DHCPV4_MSG_OFFER: + return "offer"; + case DHCPV4_MSG_REQUEST: + return "request"; + } + + return NULL; +} + +const char *dhcpsnoop_parse_ipv6(const void *buf, size_t len, uint16_t port) +{ + const struct dhcpv6_message *msg = buf; + + if (port != 546 && port != 547) + return NULL; + + switch(msg->msg_type) { + case DHCPV6_MSG_SOLICIT: + return "solicit"; + case DHCPV6_MSG_REPLY: + return "reply"; + case DHCPV6_MSG_RENEW: + return "renew"; + default: + return NULL; + } +} + + diff --git a/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h b/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h new file mode 100644 index 000000000..2ae799c06 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ +#ifndef __DHCPSNOOP_H +#define __DHCPSNOOP_H + +#include +#include +#include + +#define DHCPSNOOP_IFB_NAME "ifb-dhcp" +#define DHCPSNOOP_PRIO_BASE 0x100 + +int dhcpsnoop_run_cmd(char *cmd, bool ignore_error); + +int dhcpsnoop_dev_init(void); +void dhcpsnoop_dev_done(void); +void dhcpsnoop_dev_config_update(struct blob_attr *data); +void dhcpsnoop_dev_check(void); + +void dhcpsnoop_ubus_init(void); +void dhcpsnoop_ubus_done(void); +void dhcpsnoop_ubus_notify(const char *type, const uint8_t *msg, size_t len); + +const char *dhcpsnoop_parse_ipv4(const void *buf, size_t len, uint16_t port, uint32_t *rebind); +const char *dhcpsnoop_parse_ipv6(const void *buf, size_t len, uint16_t port); + +void cache_entry(void *msg, uint32_t rebind); +void cache_dump(struct blob_buf *b); + +#endif diff --git a/feeds/ucentral/udhcpsnoop/src/main.c b/feeds/ucentral/udhcpsnoop/src/main.c new file mode 100644 index 000000000..8a0e588bd --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/main.c @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ +#include +#include +#include +#include "dhcpsnoop.h" + +int dhcpsnoop_run_cmd(char *cmd, bool ignore_error) +{ + char *argv[] = { "sh", "-c", cmd, NULL }; + bool first = true; + int status = -1; + char buf[512]; + int fds[2]; + FILE *f; + int pid; + + if (pipe(fds)) + return -1; + + pid = fork(); + if (!pid) { + close(fds[0]); + if (fds[1] != STDOUT_FILENO) + dup2(fds[1], STDOUT_FILENO); + if (fds[1] != STDERR_FILENO) + dup2(fds[1], STDERR_FILENO); + if (fds[1] > STDERR_FILENO) + close(fds[1]); + execv("/bin/sh", argv); + exit(1); + } + + if (pid < 0) + return -1; + + close(fds[1]); + f = fdopen(fds[0], "r"); + if (!f) { + close(fds[0]); + goto out; + } + + while (fgets(buf, sizeof(buf), f) != NULL) { + if (!strlen(buf)) + break; + if (ignore_error) + continue; + if (first) { + ULOG_WARN("Command: %s\n", cmd); + first = false; + } + ULOG_WARN("%s%s", buf, strchr(buf, '\n') ? "" : "\n"); + } + + fclose(f); + +out: + while (waitpid(pid, &status, 0) < 0) + if (errno != EINTR) + break; + + return status; +} + +int main(int argc, char **argv) +{ + ulog_open(ULOG_STDIO | ULOG_SYSLOG, LOG_DAEMON, "udhcpsnoop"); + + uloop_init(); + dhcpsnoop_ubus_init(); + dhcpsnoop_dev_init(); + + uloop_run(); + + dhcpsnoop_ubus_done(); + dhcpsnoop_dev_done(); + uloop_done(); + + return 0; +} + diff --git a/feeds/ucentral/udhcpsnoop/src/msg.h b/feeds/ucentral/udhcpsnoop/src/msg.h new file mode 100644 index 000000000..7fc3483fc --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/msg.h @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +#ifndef __DHCPSNOOP_MSG_H +#define __DHCPSNOOP_MSG_H + +#include +#include + +enum dhcpv4_msg { + DHCPV4_MSG_DISCOVER = 1, + DHCPV4_MSG_OFFER = 2, + DHCPV4_MSG_REQUEST = 3, + DHCPV4_MSG_DECLINE = 4, + DHCPV4_MSG_ACK = 5, + DHCPV4_MSG_NAK = 6, + DHCPV4_MSG_RELEASE = 7, + DHCPV4_MSG_INFORM = 8, + DHCPV4_MSG_FORCERENEW = 9, +}; + +enum dhcpv4_opt { + DHCPV4_OPT_PAD = 0, + DHCPV4_OPT_NETMASK = 1, + DHCPV4_OPT_ROUTER = 3, + DHCPV4_OPT_DNSSERVER = 6, + DHCPV4_OPT_DOMAIN = 15, + DHCPV4_OPT_MTU = 26, + DHCPV4_OPT_BROADCAST = 28, + DHCPV4_OPT_NTPSERVER = 42, + DHCPV4_OPT_LEASETIME = 51, + DHCPV4_OPT_MESSAGE = 53, + DHCPV4_OPT_SERVERID = 54, + DHCPV4_OPT_REQOPTS = 55, + DHCPV4_OPT_RENEW = 58, + DHCPV4_OPT_REBIND = 59, + DHCPV4_OPT_IPADDRESS = 50, + DHCPV4_OPT_MSG_TYPE = 53, + DHCPV4_OPT_HOSTNAME = 12, + DHCPV4_OPT_REQUEST = 17, + DHCPV4_OPT_USER_CLASS = 77, + DHCPV4_OPT_AUTHENTICATION = 90, + DHCPV4_OPT_SEARCH_DOMAIN = 119, + DHCPV4_OPT_FORCERENEW_NONCE_CAPABLE = 145, + DHCPV4_OPT_END = 255, +}; + +struct dhcpv4_message { + uint8_t op; + uint8_t htype; + uint8_t hlen; + uint8_t hops; + uint32_t xid; + uint16_t secs; + uint16_t flags; + struct in_addr ciaddr; + struct in_addr yiaddr; + struct in_addr siaddr; + struct in_addr giaddr; + uint8_t chaddr[16]; + char sname[64]; + char file[128]; + uint32_t magic; + uint8_t options[]; +} __attribute__((packed)); + +#define DHCPV4_MAGIC 0x63825363 + +enum dhcpv6_opt { + DHCPV6_MSG_SOLICIT = 1, + DHCPV6_MSG_ADVERTISE = 2, + DHCPV6_MSG_REQUEST = 3, + DHCPV6_MSG_CONFIRM = 4, + DHCPV6_MSG_RENEW = 5, + DHCPV6_MSG_REBIND = 6, + DHCPV6_MSG_REPLY = 7, + DHCPV6_MSG_RELEASE = 8, + DHCPV6_MSG_DECLINE = 9, + DHCPV6_MSG_RECONFIGURE = 10, + DHCPV6_MSG_INFORMATION_REQUEST = 11, + DHCPV6_MSG_RELAY_FORW = 12, + DHCPV6_MSG_RELAY_REPL = 13, +}; +struct dhcpv6_message { + uint8_t msg_type; + uint8_t transaction_id[3]; + uint8_t options[]; +} __attribute__((packed)); + +#endif diff --git a/feeds/ucentral/udhcpsnoop/src/ubus.c b/feeds/ucentral/udhcpsnoop/src/ubus.c new file mode 100644 index 000000000..e95849009 --- /dev/null +++ b/feeds/ucentral/udhcpsnoop/src/ubus.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Felix Fietkau + */ +#include + +#include "dhcpsnoop.h" + +enum { + DS_CONFIG_DEVICES, + __DS_CONFIG_MAX +}; + +static const struct blobmsg_policy dhcpsnoop_config_policy[__DS_CONFIG_MAX] = { + [DS_CONFIG_DEVICES] = { "devices", BLOBMSG_TYPE_TABLE }, +}; + +static struct blob_buf b; + +static int +dhcpsnoop_ubus_config(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__DS_CONFIG_MAX]; + + blobmsg_parse(dhcpsnoop_config_policy, __DS_CONFIG_MAX, tb, + blobmsg_data(msg), blobmsg_len(msg)); + + dhcpsnoop_dev_config_update(tb[DS_CONFIG_DEVICES]); + + dhcpsnoop_dev_check(); + + return 0; +} + + +static int +dhcpsnoop_ubus_check_devices(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + dhcpsnoop_dev_check(); + + return 0; +} + +static int +dhcpsnoop_ubus_dump(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + blob_buf_init(&b, 0); + + cache_dump(&b); + + ubus_send_reply(ctx, req, b.head); + + return 0; +} + +static const struct ubus_method dhcpsnoop_methods[] = { + UBUS_METHOD("config", dhcpsnoop_ubus_config, dhcpsnoop_config_policy), + UBUS_METHOD_NOARG("check_devices", dhcpsnoop_ubus_check_devices), + UBUS_METHOD_NOARG("dump", dhcpsnoop_ubus_dump), +}; + +static struct ubus_object_type dhcpsnoop_object_type = + UBUS_OBJECT_TYPE("dhcpsnoop", dhcpsnoop_methods); + +static struct ubus_object dhcpsnoop_object = { + .name = "dhcpsnoop", + .type = &dhcpsnoop_object_type, + .methods = dhcpsnoop_methods, + .n_methods = ARRAY_SIZE(dhcpsnoop_methods), +}; + +static void +ubus_connect_handler(struct ubus_context *ctx) +{ + ubus_add_object(ctx, &dhcpsnoop_object); +} + +static struct ubus_auto_conn conn; + +void dhcpsnoop_ubus_init(void) +{ + conn.cb = ubus_connect_handler; + ubus_auto_connect(&conn); +} + +void dhcpsnoop_ubus_done(void) +{ + ubus_auto_shutdown(&conn); + blob_buf_free(&b); +} + +void dhcpsnoop_ubus_notify(const char *type, const uint8_t *msg, size_t len) +{ + char *buf; + + fprintf(stderr, "dhcp message type=%s\n", type); + + if (!dhcpsnoop_object.has_subscribers) + return; + + blob_buf_init(&b, 0); + buf = blobmsg_alloc_string_buffer(&b, "packet", 2 * len + 1); + while (len > 0) { + buf += sprintf(buf, "%02x", *msg); + msg++; + len--; + } + blobmsg_add_string_buffer(&b); + + ubus_notify(&conn.ctx, &dhcpsnoop_object, type, b.head, -1); +} diff --git a/patches/base/0023-dnsmasq-ignore-dhcp-on-the-ifb-dhcp-interface.patch b/patches/base/0023-dnsmasq-ignore-dhcp-on-the-ifb-dhcp-interface.patch new file mode 100644 index 000000000..0d1803f4f --- /dev/null +++ b/patches/base/0023-dnsmasq-ignore-dhcp-on-the-ifb-dhcp-interface.patch @@ -0,0 +1,25 @@ +From c5b68d334fa19e5fa0632d9d361cb613b1384b75 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Mon, 13 Jun 2022 13:33:31 +0200 +Subject: [PATCH] dnsmasq: ignore dhcp on the ifb-dhcp interface + +Signed-off-by: John Crispin +--- + package/network/services/dnsmasq/files/dnsmasq.init | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init +index dacd476cd4..d00485da90 100644 +--- a/package/network/services/dnsmasq/files/dnsmasq.init ++++ b/package/network/services/dnsmasq/files/dnsmasq.init +@@ -1108,6 +1108,7 @@ dnsmasq_start() + [ -n "$BOOT" ] || config_foreach filter_dnsmasq dhcp dhcp_add "$cfg" + fi + ++ xappend "except-interface=ifb-dhcp" + + echo >> $CONFIGFILE_TMP + config_foreach filter_dnsmasq cname dhcp_cname_add "$cfg" +-- +2.25.1 + From aa3cb95233e2bfcd5fb8ac3635dbbe09f7565b9b Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Jun 2022 13:39:24 +0200 Subject: [PATCH 02/10] wireguard-tools: do not select the kernel module unetd will select the correct kernel module. Fixes: WIFI-7571 Signed-off-by: John Crispin --- feeds/ucentral/unetd/Makefile | 2 +- ...ools-do-not-select-the-kernel-module.patch | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 patches/base/0024-wireguard-tools-do-not-select-the-kernel-module.patch diff --git a/feeds/ucentral/unetd/Makefile b/feeds/ucentral/unetd/Makefile index 20b9177d0..4a0b74c85 100644 --- a/feeds/ucentral/unetd/Makefile +++ b/feeds/ucentral/unetd/Makefile @@ -26,7 +26,7 @@ define Package/unetd SECTION:=utils CATEGORY:=Base system TITLE:=Wireguard network configuration service - DEPENDS:=+libubox +libubus +libblobmsg-json +libnl-tiny +TARGET_ipq807x:kmod-wireguard-backport +!TARGET_ipq807x:kmod-wireguard + DEPENDS:=+libubox +libubus +libblobmsg-json +libnl-tiny +TARGET_ipq807x:kmod-wireguard-backport +!TARGET_ipq807x:kmod-wireguard +wireguard-tools endef TARGET_CFLAGS += \ diff --git a/patches/base/0024-wireguard-tools-do-not-select-the-kernel-module.patch b/patches/base/0024-wireguard-tools-do-not-select-the-kernel-module.patch new file mode 100644 index 000000000..c5727ac81 --- /dev/null +++ b/patches/base/0024-wireguard-tools-do-not-select-the-kernel-module.patch @@ -0,0 +1,29 @@ +From fcea0e786c9311e3fc6ff256ba320aaa07b6ae05 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Mon, 13 Jun 2022 13:37:17 +0200 +Subject: [PATCH] wireguard-tools: do not select the kernel module + +unetd will select the correct kernel module. + +Signed-off-by: John Crispin +--- + package/network/utils/wireguard-tools/Makefile | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/package/network/utils/wireguard-tools/Makefile b/package/network/utils/wireguard-tools/Makefile +index 5f8da147c1..e0df0a6c67 100644 +--- a/package/network/utils/wireguard-tools/Makefile ++++ b/package/network/utils/wireguard-tools/Makefile +@@ -38,8 +38,7 @@ define Package/wireguard-tools + TITLE:=WireGuard userspace control program (wg) + DEPENDS:= \ + +@BUSYBOX_CONFIG_IP \ +- +@BUSYBOX_CONFIG_FEATURE_IP_LINK \ +- +kmod-wireguard ++ +@BUSYBOX_CONFIG_FEATURE_IP_LINK + endef + + define Package/wireguard-tools/description +-- +2.25.1 + From 6399649038cdee6f5064b4daa6c33453fc693d55 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Jun 2022 13:39:42 +0200 Subject: [PATCH 03/10] ipq807x: improve dual boot on eap101/2 inverse the logic that figures out if we want to set upgrade_available. Fixes: WIFI-7712 Signed-off-by: John Crispin --- feeds/ipq807x/ipq807x/base-files/etc/init.d/bootcount | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/ipq807x/ipq807x/base-files/etc/init.d/bootcount b/feeds/ipq807x/ipq807x/base-files/etc/init.d/bootcount index d0fc40e3c..e8e4df1b6 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/init.d/bootcount +++ b/feeds/ipq807x/ipq807x/base-files/etc/init.d/bootcount @@ -11,7 +11,7 @@ boot() { edgecore,eap101|\ edgecore,eap102) avail=$(fw_printenv -n upgrade_available) - [ ${avail} -eq 0 ] && fw_setenv upgrade_available 1 + [ "${avail}" -eq 1 ] || fw_setenv upgrade_available 1 fw_setenv bootcount 0 ;; esac From 588206b93bc1f78871e52f14c5a4fdae6b3fbd95 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Jun 2022 14:52:06 +0200 Subject: [PATCH 04/10] ucentral-schema: update to latest HEAD 417fcc4 fix selection of radius proxy ip Fixes: WIFI-9461 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index e76beec2c..e229c0acb 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=5e67f448e77e918a0225d5174c7eafc2ded09c5e0803f5bcf21f91749649f501 +PKG_MIRROR_HASH:=88a2ef67c3381479c52fb24c9556a6a01cb2eabdc283849efcddb2e06548f42e PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=a292ac3e41ec97fd2e22e6f614c0edeeb7eb7966 +PKG_SOURCE_VERSION:=417fcc429ce2ffd47b42ad92d2230f0c40af974a PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause From cb30d9e20a44b34e63ea5331b7301fcdced2374c Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sun, 22 May 2022 16:58:37 +0200 Subject: [PATCH 05/10] ipq807x: add motorola q14 support Fixes: WIFI-8040 Signed-off-by: John Crispin --- .../arch/arm/boot/dts/qcom-ipq5018-q14.dts | 23 + .../arm64/boot/dts/qcom/qcom-ipq5018-q14.dts | 886 ++++++++++++++++++ feeds/ipq807x/ipq807x/image/ipq50xx.mk | 2 +- feeds/wifi-ax/ath11k-wifi/Makefile | 13 + .../board-2-motorol-q14.bin.QCN6122 | Bin 0 -> 262292 bytes .../ath11k-wifi/board-motorol-q14.bin.IPQ5018 | Bin 0 -> 131072 bytes 6 files changed, 923 insertions(+), 1 deletion(-) create mode 100644 feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-q14.dts create mode 100755 feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-q14.dts create mode 100644 feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 create mode 100644 feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 diff --git a/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-q14.dts b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-q14.dts new file mode 100644 index 000000000..23cff9101 --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-q14.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2020, 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 "../../../arm64/boot/dts/qcom/qcom-ipq5018-q14.dts" + +/ { + pmuv8: pmu { + compatible = "arm,cortex-a7-pmu"; + }; +}; diff --git a/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-q14.dts b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-q14.dts new file mode 100755 index 000000000..97fe96388 --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-q14.dts @@ -0,0 +1,886 @@ +/dts-v1/; +/* Copyright (c) 2018-2020, 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 "qcom-ipq5018.dtsi" + +/ { + #address-cells = <0x2>; + #size-cells = <0x2>; + model = "Motorola Q14"; + compatible = "motorola,q14", "qcom,ipq5018-mp03.5-c1", "qcom,ipq5018"; + interrupt-parent = <&intc>; + + aliases { + sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ + serial0 = &blsp1_uart1; + serial1 = &blsp1_uart2; + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + }; + + chosen { + bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + bootargs-append = " swiotlb=1"; + #else + bootargs-append = " swiotlb=1 coherent_pool=2M"; + #endif + stdout-path = "serial0"; + }; + + reserved-memory { + #ifdef __IPQ_MEM_PROFILE_256_MB__ + /* 256 MB Profile + * +==========+==============+=========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +----------+--------------+-------------------------+ + * | NSS | 0x40000000 | 8MB | + * +----------+--------------+-------------------------+ + * | Linux | 0x40800000 | Depends on total memory | + * +----------+--------------+-------------------------+ + * | uboot | 0x4A600000 | 4MB | + * +----------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +----------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +----------+--------------+-------------------------+ + * | TZ | 0x4AC00000 | 4MB | + * +----------+--------------+-------------------------+ + * | Q6 | | | + * | code/ | 0x4B000000 | 20MB | + * | data | | | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | data | 0x4C400000 | 13MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | M3 Dump | 0x4D100000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | QDSS | 0x4D200000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | data | 0x4D300000 | 15MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | M3 Dump | 0x4E200000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | QDSS | 0x4E300000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | data | 0x4E400000 | 15MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | M3 Dump | 0x4F300000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | QDSS | 0x4F400000 | 1MB | + * +----------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +===================================================+ + */ + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x4500000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x1400000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C400000 { + no-map; + reg = <0x0 0x4C400000 0x0 0xD00000>; + }; + + m3_dump: m3_dump@4D100000 { + no-map; + reg = <0x0 0x4D100000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x100000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D300000 { + no-map; + reg = <0x0 0x4D300000 0x0 0xF00000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { + no-map; + reg = <0x0 0x4E200000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { + no-map; + reg = <0x0 0x4E300000 0x0 0x100000>; + }; + + q6_qcn6122_data2: q6_qcn6122_data2@4E400000 { + no-map; + reg = <0x0 0x4E400000 0x0 0xF00000>; + }; + + m3_dump_qcn6122_2: m3_dump_qcn6122_2@4F300000 { + no-map; + reg = <0x0 0x4F300000 0x0 0x100000>; + }; + + q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F400000 { + no-map; + reg = <0x0 0x4F400000 0x0 0x100000>; + }; + #else + /* 512MB/1GB Profiles + * +==========+==============+=========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +----------+--------------+-------------------------+ + * | NSS | 0x40000000 | 16MB | + * +----------+--------------+-------------------------+ + * | Linux | 0x41000000 | Depends on total memory | + * +----------+--------------+-------------------------+ + * | uboot | 0x4A600000 | 4MB | + * +----------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +----------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +----------+--------------+-------------------------+ + * | TZ | 0x4AC00000 | 4MB | + * +----------+--------------+-------------------------+ + * | Q6 | | | + * | code/ | 0x4B000000 | 20MB | + * | data | | | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | data | 0x4C400000 | 14MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | M3 Dump | 0x4D200000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | QDSS | 0x4D300000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | Caldb | 0x4D400000 | 2MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | data | 0x4D600000 | 16MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | M3 Dump | 0x4E600000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | QDSS | 0x4E700000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | Caldb | 0x4E800000 | 5MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | data | 0x4ED00000 | 16MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | M3 Dump | 0x4FD00000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | QDSS | 0x4FE00000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | Caldb | 0x4FF00000 | 5MB | + * +----------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +===================================================+ + */ + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x5400000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 01400000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C400000 { + no-map; + reg = <0x0 0x4C400000 0x0 0xE00000>; + }; + + m3_dump: m3_dump@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4D300000 { + no-map; + reg = <0x0 0x4D300000 0x0 0x100000>; + }; + + q6_caldb_region: q6_caldb_region@4D400000 { + no-map; + reg = <0x0 0x4D400000 0x0 0x200000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D600000 { + no-map; + reg = <0x0 0x4D600000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E600000 { + no-map; + reg = <0x0 0x4E600000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E700000 { + no-map; + reg = <0x0 0x4E700000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E800000 { + no-map; + reg = <0x0 0x4E800000 0x0 0x500000>; + }; + + q6_qcn6122_data2: q6_qcn6122_data2@4E900000 { + no-map; + reg = <0x0 0x4ED00000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_2: m3_dump_qcn6122_2@4FD00000 { + no-map; + reg = <0x0 0x4FD00000 0x0 0x100000>; + }; + + q6_qcn6122_etr_2: q6_qcn6122_etr_2@4FE00000 { + no-map; + reg = <0x0 0x4FE00000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4FF00000 { + no-map; + reg = <0x0 0x4FF00000 0x0 0x500000>; + }; + + #endif + }; + + soc { + serial@78af000 { + status = "ok"; + }; + + blsp1_uart2: serial@78b0000 { + pinctrl-0 = <&blsp1_uart_pins>; + pinctrl-names = "default"; + }; + + qpic_bam: dma@7984000{ + status = "ok"; + }; + + nand: qpic-nand@79b0000 { + status = "disabled"; + }; + + spi_0: spi@78b5000 { /* BLSP1 QUP0 */ + pinctrl-0 = <&blsp0_spi_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "ok"; + + m25p80@0 { + #address-cells = <1>; + #size-cells = <1>; + reg = <0>; + compatible = "n25q128a11"; + linux,modalias = "m25p80", "n25q128a11"; + spi-max-frequency = <50000000>; + use-default-sizes; + }; + }; + + mdio0: mdio@88000 { + status = "ok"; + + ethernet-phy@0 { + reg = <7>; + }; + }; + + mdio1: mdio@90000 { + status = "ok"; + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 39 0>; + + ethernet-phy@0 { + reg = <28>; + }; + }; + + ess-instance { + num_devices = <0x1>; + ess-switch@0x39c00000 { + switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/ + cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/ + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <7>; + mdiobus = <&mdio0>; + }; + port@1 { + port_id = <2>; + phy_address = <0x1c>; + mdiobus = <&mdio1>; + port_mac_sel = "QGMAC_PORT"; + }; + }; + led_source@0 { + source = <0>; + mode = "normal"; + speed = "all"; + blink_en = "enable"; + active = "high"; + }; + }; + }; + + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <1>; + reg = <0x39C00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + qcom,link-poll = <1>; + qcom,phy-mdio-addr = <7>; + mdio-bus = <&mdio0>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <2>; + reg = <0x39D00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + qcom,link-poll = <1>; + qcom,phy-mdio-addr = <28>; + mdio-bus = <&mdio1>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + qcom,test@0 { + status = "ok"; + }; + + nss-macsec1 { + compatible = "qcom,nss-macsec"; + phy_addr = <0x1c>; + mdiobus = <&mdio1>; + }; + + lpass: lpass@0xA000000{ + status = "disabled"; + }; + + pcm: pcm@0xA3C0000{ + pinctrl-0 = <&audio_pins>; + pinctrl-names = "default"; + status = "disabled"; + }; + + pcm_lb: pcm_lb@0 { + status = "disabled"; + }; + }; + + thermal-zones { + status = "ok"; + }; +}; + +&sdhc_1 { + pinctrl-0 = <&emmc_pins>; + pinctrl-names = "default"; + qcom,clk-rates = <400000 25000000 50000000 100000000 \ + 192000000 384000000>; + qcom,bus-speed-mode = "HS200_1p8v", "DDR_1p8v"; + qcom,nonremovable; + status = "ok"; +}; + +&tlmm { + pinctrl-0 = <&blsp0_uart_pins &phy_led_pins>; + pinctrl-names = "default"; + + blsp0_uart_pins: uart_pins { + blsp0_uart_rx_tx { + pins = "gpio20", "gpio21"; + function = "blsp0_uart0"; + bias-disable; + }; + }; + + blsp1_uart_pins: blsp1_uart_pins { + blsp1_uart_rx_tx { + pins = "gpio23", "gpio25", "gpio24", "gpio26"; + function = "blsp1_uart2"; + bias-disable; + }; + }; + + blsp0_spi_pins: blsp0_spi_pins { + mux { + pins = "gpio10", "gpio11", "gpio12", "gpio13"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-disable; + }; + }; + + emmc_pins: emmc_pins { + emmc_clk { + pins = "gpio9"; + function = "sdc1_clk"; + drive-strength = <8>; + bias-disable; + }; + emmc_cmd { + pins = "gpio8"; + function = "sdc1_cmd"; + drive-strength = <8>; + bias-pull-up; + }; + emmc_data_0 { + pins = "gpio7"; + function = "sdc10"; + drive-strength = <8>; + bias-disable; + }; + emmc_data_1 { + pins = "gpio6"; + function = "sdc11"; + drive-strength = <8>; + bias-disable; + }; + emmc_data_2 { + pins = "gpio5"; + function = "sdc12"; + drive-strength = <8>; + bias-disable; + }; + emmc_data_3 { + pins = "gpio4"; + function = "sdc13"; + drive-strength = <8>; + bias-disable; + }; + }; + + mdio1_pins: mdio_pinmux { + mux_0 { + pins = "gpio36"; + function = "mdc"; + drive-strength = <8>; + bias-pull-up; + }; + + mux_1 { + pins = "gpio37"; + function = "mdio"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + phy_led_pins: phy_led_pins { + gephy_led_pin { + pins = "gpio46"; + function = "led0"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + i2c_pins: i2c_pins { + i2c_scl { + pins = "gpio25"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + + i2c_sda { + pins = "gpio26"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + }; + + button_pins: button_pins { + wps_button { + pins = "gpio38"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + + reset_button { + pins = "gpio31"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + + }; + + audio_pins: audio_pinmux { + mux_1 { + pins = "gpio24"; + function = "audio_rxbclk"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_2 { + pins = "gpio25"; + function = "audio_rxfsync"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_3 { + pins = "gpio26"; + function = "audio_rxd"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_4 { + pins = "gpio27"; + function = "audio_txmclk"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_5 { + pins = "gpio28"; + function = "audio_txbclk"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_6 { + pins = "gpio29"; + function = "audio_txfsync"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_7 { + pins = "gpio30"; + function = "audio_txd"; + drive-strength = <8>; + bias-pull-down; + }; + }; + +}; + +&soc { + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + button@1 { + label = "wps"; + linux,code = ; + gpios = <&tlmm 38 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + + button@2 { + label = "reset"; + linux,code = ; + gpios = <&tlmm 31 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + + }; +}; + +&usb3 { + status = "ok"; + device-power-gpio = <&tlmm 24 1>; +}; + +&eud { + status = "ok"; +}; + +&pcie_x1 { + status = "ok"; + perst-gpio = <&tlmm 18 1>; +}; + +&pcie_x2 { + status = "ok"; + perst-gpio = <&tlmm 15 1>; +}; + +&dwc_0 { + /delete-property/ #phy-cells; + /delete-property/ phys; + /delete-property/ phy-names; +}; + +&hs_m31phy_0 { + status = "ok"; +}; + +&pcie_x1phy { + status = "ok"; +}; + +&pcie_x2phy { + status = "ok"; +}; + +&pcie_x1_rp { + status = "ok"; + + mhi_0: qcom,mhi@0 { + reg = <0 0 0 0 0 >; + }; +}; + +&pcie_x2_rp { + status = "ok"; + + mhi_1: qcom,mhi@1 { + reg = <0 0 0 0 0 >; + + }; +}; + +&qfprom { + status = "ok"; +}; + +&tsens { + status = "ok"; +}; + +&qcom_q6v5_wcss { + qcom,multipd_arch; + memory-region = <&q6_mem_regions>; + qcom,share_bootargs; + qcom,bootargs_smem = <507>; +boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>, + <0x2 0x4 0x2 0x12 0x0 0x0>; + + /* IPQ5018 */ + q6v5_wcss_userpd1 { + m3_firmware = "IPQ5018/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 8 0>, + <&wcss_smp2p_in 9 0>, + <&wcss_smp2p_in 12 0>, + <&wcss_smp2p_in 11 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 8>, + <&wcss_smp2p_out 9>, + <&wcss_smp2p_out 10>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <1>; + qca,auto-restart; + qca,int_radio; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>; + #else + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>, <&q6_caldb_region>; + #endif + }; + + /* QCN6122 6G */ + q6v5_wcss_userpd2 { + m3_firmware = "qcn6122/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 16 0>, + <&wcss_smp2p_in 17 0>, + <&wcss_smp2p_in 20 0>, + <&wcss_smp2p_in 19 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 16>, + <&wcss_smp2p_out 17>, + <&wcss_smp2p_out 18>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <2>; + qca,auto-restart; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>; + #else + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>; + #endif + }; + + /* QCN6122 5G */ + q6v5_wcss_userpd3 { + m3_firmware = "qcn6122/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 24 0>, + <&wcss_smp2p_in 25 0>, + <&wcss_smp2p_in 28 0>, + <&wcss_smp2p_in 27 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 24>, + <&wcss_smp2p_out 25>, + <&wcss_smp2p_out 26>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <3>; + qca,auto-restart; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, + <&q6_qcn6122_etr_2>; + #else + memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, + <&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>; + #endif + }; +}; + +&i2c_0 { + pinctrl-0 = <&i2c_pins>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&qgic_msi_0 { + status = "ok"; +}; + +&qgic_msi_1 { + status = "ok"; +}; + +&wifi0 { + /* IPQ5018 */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x24>; + qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4D400000 0x4D400000 0 0 0>; +#else + qcom,caldb-addr = <0x4D400000>; + m3-dump-addr = <0x4D200000>; + nss-radio-priority = <0>; +#endif + mem-region = <&q6_ipq5018_data>; + qcom,caldb-size = <0x200000>; + status = "ok"; +}; + +&wifi1 { + /* QCN6122 5G */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x60>; + qcom,bdf-addr = <0x4D600000 0x4D600000 0x4D300000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4E800000 0x4E800000 0 0 0>; +#else + qcom,caldb-addr = <0x4E800000>; + m3-dump-addr = <0x4E600000>; + nss-radio-priority = <1>; +#endif + mem-region = <&q6_qcn6122_data1>; + qcom,caldb-size = <0x500000>; + status = "ok"; +}; + +&wifi2 { + /* QCN6122 6G */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0xb0>; + qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>; +#else + qcom,caldb-addr = <0x4FF00000>; + m3-dump-addr = <0x4FD00000>; + nss-radio-priority = <1>; +#endif + mem-region = <&q6_qcn6122_data2>; + qcom,caldb-size = <0x500000>; + status = "ok"; +}; diff --git a/feeds/ipq807x/ipq807x/image/ipq50xx.mk b/feeds/ipq807x/ipq807x/image/ipq50xx.mk index 80ae3e849..87b599c5f 100644 --- a/feeds/ipq807x/ipq807x/image/ipq50xx.mk +++ b/feeds/ipq807x/ipq807x/image/ipq50xx.mk @@ -27,7 +27,7 @@ define Device/motorola_q14 IMAGES := sysupgrade.tar mmc-factory.bin IMAGE/mmc-factory.bin := append-ubi | qsdk-ipq-factory-mmc endef -#TARGET_DEVICES += motorola_q14 +TARGET_DEVICES += motorola_q14 define Device/qcom_mp03_1 DEVICE_TITLE := Qualcomm Maple 03.1 diff --git a/feeds/wifi-ax/ath11k-wifi/Makefile b/feeds/wifi-ax/ath11k-wifi/Makefile index 10f407f3c..5ba9775f4 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -86,6 +86,11 @@ $(call Package/ath11k-wifi-default) TITLE:=gl-ax1800 bdf endef +define Package/ath11k-wifi-motorola-q14 +$(call Package/ath11k-wifi-default) + TITLE:=motorola q14 bdf +endef + define ath11k-wifi-install-one-to $(INSTALL_DIR) $(2)/lib/firmware/$(3)/ $(INSTALL_DATA) $(1) $(2)/lib/firmware/$(3)/board.bin @@ -173,6 +178,13 @@ define Package/ath11k-wifi-gl-ax1800/install $(INSTALL_DATA) ./board-gl-ax1800.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board-2.bin endef +define Package/ath11k-wifi-motorola-q14/install + $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/ + $(INSTALL_DIR) $(1)/lib/firmware/ath11k/qcn6122/hw1.0/ + $(INSTALL_DATA) ./board-motorol-q14.bin.IPQ5018 $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/board.bin + $(INSTALL_DATA) ./board-2-motorol-q14.bin.QCN6122 $(1)/lib/firmware/ath11k/qcn6122/hw1.0/board-2.bin +endef + $(eval $(call generate-ath11k-wifi-package,cig-wf188,Cigtech WF188)) $(eval $(call generate-ath11k-wifi-package,cig-wf188n,Cigtech WF188n)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c)) @@ -196,3 +208,4 @@ $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074)) $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018)) $(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000)) $(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g)) +$(eval $(call BuildPackage,ath11k-wifi-motorola-q14)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 b/feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 new file mode 100644 index 0000000000000000000000000000000000000000..75d77130bc51b7594ad2d5908ded4ab7f0faf499 GIT binary patch literal 262292 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

J{P?! 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 BM-2b~ literal 0 HcmV?d00001 diff --git a/feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 b/feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 new file mode 100644 index 0000000000000000000000000000000000000000..5f5924b0359ca0bada5035355fc5f97260782d41 GIT binary patch literal 131072 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 Date: Mon, 13 Jun 2022 21:53:47 +0300 Subject: [PATCH 06/10] ipq807x: silence dd errors in do_flash_emmc Running dd if=/dev/zero to a partition will always throw an ENOSPC error when reaching the end of the partition. Silence those errors to avoid confusion. Signed-off-by: Stijn Tintel --- feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh index c000a9b7a..f78c3f941 100755 --- a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh +++ b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh @@ -44,7 +44,7 @@ do_flash_emmc() { } echo erase $4 - dd if=/dev/zero of=${emmcblock} + dd if=/dev/zero of=${emmcblock} 2> /dev/null echo flash $4 tar Oxf $tar_file ${board_dir}/$part | dd of=${emmcblock} } From 32b1aade42c7922bfff00bc053eff3b2bf64bed4 Mon Sep 17 00:00:00 2001 From: Stijn Tintel Date: Mon, 13 Jun 2022 21:55:03 +0300 Subject: [PATCH 07/10] ipq807x: force ext4 creation in emmc_do_upgrade Running mkfs.ext4 on a partition that already contains an ext4 filesystem asks for input: mke2fs 1.45.6 (20-Mar-2020) /dev/mmcblk0p9 contains a ext4 file system created on Sat Jun 11 12:23:42 2022 Proceed anyway? (y,N) y This breaks the ability to run sysupgrade non-interactively. Add the -F switch to force ext4 creation to fix this. Fixes: WIFI-9419 Signed-off-by: Stijn Tintel --- feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh index f78c3f941..fc5c9dfac 100755 --- a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh +++ b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh @@ -59,7 +59,7 @@ emmc_do_upgrade() { local emmcblock="$(find_mmc_part "rootfs_data")" if [ -e "$emmcblock" ]; then - mkfs.ext4 "$emmcblock" + mkfs.ext4 -F "$emmcblock" fi } From 1546bef93f5bc8b0e8abc0aa146f21bb305b1073 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 16 Jun 2022 12:44:53 +0200 Subject: [PATCH 08/10] ucentral-schema: update to latest HEAD 1d7e565 optimize the bridge/uci config for gre tunnels Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 +- .../files/etc/ucentral/examples/gre.json | 48 ++++++++++--------- .../files/etc/ucentral/examples/vxlan.json | 46 +++++++++--------- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index e229c0acb..dba8e25a3 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=88a2ef67c3381479c52fb24c9556a6a01cb2eabdc283849efcddb2e06548f42e +PKG_MIRROR_HASH:=dedaf7a09b17c7353a31670953dae68ef6cee0463ec45aacfcfe5c4dc369bfe3 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=417fcc429ce2ffd47b42ad92d2230f0c40af974a +PKG_SOURCE_VERSION:=1d7e5656837dee845d07247c957eab9c62d99673 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause diff --git a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/gre.json b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/gre.json index 176c25fa1..1c0e95d74 100644 --- a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/gre.json +++ b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/gre.json @@ -1,23 +1,12 @@ { "uuid": 2, "radios": [ - { - "band": "6G", - "country": "CA", - "channel-mode": "HE", - "channel-width": 80 - }, - { - "band": "5G", - "country": "CA", - "channel-mode": "HE", - "channel-width": 80 - }, { "band": "2G", "country": "CA", "channel-mode": "HE", - "channel-width": 80 + "channel-width": 20, + "channel": 1 } ], @@ -44,8 +33,27 @@ }, "tunnel": { "proto": "gre", - "peer-address": "50.210.104.108" - } + "peer-address": "192.168.178.59" + }, + "ipv4": { + "addressing": "static", + "subnet": "192.168.2.2/24", + "gateway": "192.168.2.1" + }, + "ssids": [ + { + "name": "OpenWifi-GRE", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] }, { "name": "LAN", @@ -69,19 +77,15 @@ }, "ssids": [ { - "name": "Maverick", + "name": "OpenWifi-GRE-NAT", "wifi-bands": [ - "5G", "2G" ], "bss-mode": "ap", "encryption": { - "proto": "none", + "proto": "psk2", + "key": "OpenWifi", "ieee80211w": "optional" - }, - "roaming": { - "message-exchange": "ds", - "generate-psk": true } } ] diff --git a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/vxlan.json b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/vxlan.json index 29816f701..dc2b75a8d 100644 --- a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/vxlan.json +++ b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/vxlan.json @@ -1,23 +1,11 @@ { "uuid": 2, "radios": [ - { - "band": "6G", - "country": "CA", - "channel-mode": "HE", - "channel-width": 80 - }, - { - "band": "5G", - "country": "CA", - "channel-mode": "HE", - "channel-width": 80 - }, { "band": "2G", "country": "CA", "channel-mode": "HE", - "channel-width": 80 + "channel": 1 } ], @@ -49,13 +37,31 @@ }, "ipv4": { "addressing": "static", - "subnet": "10.0.0.1/24" - } + "subnet": "10.0.0.2/24", + "gateway": "10.0.0.1" + }, + "ssids": [ + { + "name": "OpenWifi-VXLAN", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] }, { "name": "LAN", "role": "downstream", "services": [ "ssh" ], + "vlan": { + "id": 100 + }, "ethernet": [ { "select-ports": [ @@ -74,19 +80,15 @@ }, "ssids": [ { - "name": "Maverick", + "name": "OpenWifi-VXLAN", "wifi-bands": [ - "5G", "2G" ], "bss-mode": "ap", "encryption": { - "proto": "none", + "proto": "psk2", + "key": "OpenWifi", "ieee80211w": "optional" - }, - "roaming": { - "message-exchange": "ds", - "generate-psk": true } } ] From b81d0aaf0ef0603d0caa10a7d6bfa98973d937f3 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 16 Jun 2022 12:47:01 +0200 Subject: [PATCH 09/10] ipq40xx: add dual boot support for ecw5211 Fixes: WIFI-7712 Signed-off-by: John Crispin --- ...xx-add-dual-boot-support-for-ecw5211.patch | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 patches/ipq40xx/0018-ipq40xx-add-dual-boot-support-for-ecw5211.patch diff --git a/patches/ipq40xx/0018-ipq40xx-add-dual-boot-support-for-ecw5211.patch b/patches/ipq40xx/0018-ipq40xx-add-dual-boot-support-for-ecw5211.patch new file mode 100644 index 000000000..347ac48de --- /dev/null +++ b/patches/ipq40xx/0018-ipq40xx-add-dual-boot-support-for-ecw5211.patch @@ -0,0 +1,105 @@ +From 86dc0a3f51da3440bc216d988c04b225ba169247 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Thu, 16 Jun 2022 12:46:08 +0200 +Subject: [PATCH] ipq40xx: add dual boot support for ecw5211 + +Signed-off-by: John Crispin +--- + .../ipq40xx/base-files/etc/init.d/bootcount | 17 ++++++++++++++--- + .../base-files/lib/upgrade/platform.sh | 19 ++++++++++++++++++- + .../arm/boot/dts/qcom-ipq4018-ecw5211.dts | 10 ++++++++++ + 3 files changed, 42 insertions(+), 4 deletions(-) + +diff --git a/target/linux/ipq40xx/base-files/etc/init.d/bootcount b/target/linux/ipq40xx/base-files/etc/init.d/bootcount +index 36b5d56d0c..5cda1fc245 100755 +--- a/target/linux/ipq40xx/base-files/etc/init.d/bootcount ++++ b/target/linux/ipq40xx/base-files/etc/init.d/bootcount +@@ -13,13 +13,24 @@ boot() { + linksys,mr8300) + mtd resetbc s_env || true + ;; +- edgecore,spw2ac1200|\ +- edgecore,spw2ac1200-lan-poe|\ + edgecore,ecw5211) ++ part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | cut -d " " -f1)" ++ case "$part" in ++ rootfs1|\ ++ rootfs2) ++ avail=$(fw_printenv -n upgrade_available) ++ [ ${avail} -ne 1 ] && fw_setenv upgrade_available 1 ++ fw_setenv bootcount 0 ++ ;; ++ esac ++ ;; ++ edgecore,spw2ac1200|\ ++ edgecore,spw2ac1200-lan-poe) + avail=$(fw_printenv -n upgrade_available) + [ ${avail} -eq 0 ] || { +- fw_setenv bootcount 0 + fw_setenv upgrade_available 0 ++ fw_setenv bootcount 0 + } ++ ;; + esac + } +diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +index d44a57c62a..6f2bff527c 100644 +--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +@@ -66,7 +66,6 @@ platform_do_upgrade() { + avm,fritzrepeater-3000 |\ + buffalo,wtr-m2133hp |\ + cilab,meshpoint-one |\ +- edgecore,ecw5211 |\ + edgecore,oap100 |\ + engenius,eap2200 |\ + glinet,gl-ap1300 |\ +@@ -78,6 +77,24 @@ platform_do_upgrade() { + tp-link,ec420-g1) + nand_do_upgrade "$1" + ;; ++ edgecore,ecw5211) ++ mkdir -p /var/lock/ ++ part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | cut -d " " -f 1)" ++ case "$part" in ++ rootfs1) ++ fw_setenv active 2 || exit 1 ++ CI_UBIPART="rootfs2" ++ ;; ++ rootfs2) ++ fw_setenv active 1 || exit 1 ++ CI_UBIPART="rootfs1" ++ ;; ++ *) ++ # legacy bootloader ++ ;; ++ esac ++ nand_do_upgrade "$1" ++ ;; + alfa-network,ap120c-ac) + mkdir -p /var/lock/ + part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | sed -e 's/ .*$//')" +diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts +index 0ee8d1a52e..d8c0853c58 100644 +--- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts ++++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-ecw5211.dts +@@ -258,6 +258,16 @@ + label = "rootfs"; + reg = <0x00000000 0x04000000>; + }; ++ ++ partition@1 { ++ label = "rootfs1"; ++ reg = <0x00000000 0x04000000>; ++ }; ++ ++ partition@4000000 { ++ label = "rootfs2"; ++ reg = <0x04000000 0x04000000>; ++ }; + }; + }; + }; +-- +2.25.1 + From ae2377f4d2c0256840a588c1afb7eb43982a5d68 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 16 Jun 2022 16:37:37 +0200 Subject: [PATCH 10/10] ucentral-schema: update to latest HEAD 4df0373 renderer: quote wireless encryption key Fixes: WIFI-9630 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index dba8e25a3..3584af04d 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=dedaf7a09b17c7353a31670953dae68ef6cee0463ec45aacfcfe5c4dc369bfe3 +PKG_MIRROR_HASH:=e2b3842b59c778cd902845ac2c1196859ad19d79bb0f9611044416ecbe1a502f PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=1d7e5656837dee845d07247c957eab9c62d99673 +PKG_SOURCE_VERSION:=4df03737d616e9d6672504e12877b4b7945769f0 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause