diff --git a/package/utils/ucode/Makefile b/package/utils/ucode/Makefile index 8b5287b9e8..d9df7ed964 100644 --- a/package/utils/ucode/Makefile +++ b/package/utils/ucode/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=https://github.com/jow-/ucode.git -PKG_SOURCE_DATE:=2026-02-27 -PKG_SOURCE_VERSION:=934bb593dba520e84920865703bd4fe94490d11e -PKG_MIRROR_HASH:=baa59093c5a32303f64c2507664f7b36e2b7b7c14ed65524e5d1130633e5b639 +PKG_SOURCE_DATE:=2026-04-24 +PKG_SOURCE_VERSION:=0beaa9dc244f16c52c0a7dc3f180cca0539124cd +PKG_MIRROR_HASH:=9a58c061541cd98d248335c351a10049823a0dd317475fa0be73593c6d90a70a PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=ISC diff --git a/package/utils/ucode/patches/100-add-include-for-older-kernels.patch b/package/utils/ucode/patches/100-add-include-for-older-kernels.patch deleted file mode 100644 index f047bed928..0000000000 --- a/package/utils/ucode/patches/100-add-include-for-older-kernels.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 165d395ffa2a22e293160b24d4791302a156eab8 Mon Sep 17 00:00:00 2001 -From: Rosen Penev -Date: Mon, 8 Dec 2025 12:48:01 -0800 -Subject: add include for older kernels - -in6.h is needed for some macros. Seems newer kernels include this implicitly. ---- - lib/socket.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/lib/socket.c -+++ b/lib/socket.c -@@ -77,6 +77,7 @@ - #include "ucode/platform.h" - - #if defined(__linux__) -+# include - # include - # include - diff --git a/package/utils/ucode/patches/120-ubus-fix-refcounting-bug.patch b/package/utils/ucode/patches/120-ubus-fix-refcounting-bug.patch deleted file mode 100644 index 1f3218a3c8..0000000000 --- a/package/utils/ucode/patches/120-ubus-fix-refcounting-bug.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 Feb 2026 19:04:54 +0000 -Subject: [PATCH] ubus: fix refcounting bug - -In uc_ubus_channel_req_cb an extra ref is taken for args and method, -which are not used elsewhere. - -Signed-off-by: Felix Fietkau ---- - ---- a/lib/ubus.c -+++ b/lib/ubus.c -@@ -2395,10 +2395,10 @@ uc_ubus_channel_req_cb(struct ubus_conte - - args = blob_array_to_ucv(c->vm, blob_data(msg), blob_len(msg), true); - reqproto = ucv_object_new(c->vm); -- ucv_object_add(reqproto, "args", ucv_get(args)); -+ ucv_object_add(reqproto, "args", args); - - if (method) -- ucv_object_add(reqproto, "type", ucv_get(ucv_string_new(method))); -+ ucv_object_add(reqproto, "type", ucv_string_new(method)); - - return uc_ubus_handle_reply_common(ctx, req, c->vm, c->res, func, reqproto); - } diff --git a/package/utils/ucode/patches/121-ubus-avoid-double-close-of-externally-owned-channel-.patch b/package/utils/ucode/patches/121-ubus-avoid-double-close-of-externally-owned-channel-.patch deleted file mode 100644 index 51e3bf2bf2..0000000000 --- a/package/utils/ucode/patches/121-ubus-avoid-double-close-of-externally-owned-channel-.patch +++ /dev/null @@ -1,130 +0,0 @@ -From: Felix Fietkau -Date: Fri, 6 Feb 2026 20:19:59 +0000 -Subject: [PATCH] ubus: avoid double close of externally owned channel fds - -When a channel is opened via an fd obtained through fileno(), the fd is -owned by an external resource. Track this in fd_handle and detach from -uloop without closing the fd on disconnect/shutdown. - -Signed-off-by: Felix Fietkau ---- - ---- a/lib/ubus.c -+++ b/lib/ubus.c -@@ -132,6 +132,7 @@ typedef struct { - struct ubus_context ctx; - struct blob_buf buf; - int timeout; -+ bool fd_handle; - - uc_vm_t *vm; - uc_value_t *res; -@@ -739,7 +740,7 @@ uc_ubus_call_timeout_cb(struct uloop_tim - } - - static int --get_fd(uc_vm_t *vm, uc_value_t *val) -+get_fd(uc_vm_t *vm, uc_value_t *val, bool *handle) - { - uc_value_t *fn; - int64_t n; -@@ -747,6 +748,9 @@ get_fd(uc_vm_t *vm, uc_value_t *val) - fn = ucv_property_get(val, "fileno"); - - if (ucv_is_callable(fn)) { -+ if (handle) -+ *handle = true; -+ - uc_vm_stack_push(vm, ucv_get(val)); - uc_vm_stack_push(vm, ucv_get(fn)); - -@@ -816,7 +820,7 @@ uc_ubus_call_common(uc_vm_t *vm, uc_ubus - ucv_object_to_blob(funargs, &c->buf); - - if (fd) { -- fd_val = get_fd(vm, fd); -+ fd_val = get_fd(vm, fd, NULL); - - if (fd_val < 0) - errval_return(UBUS_STATUS_INVALID_ARGUMENT, -@@ -938,7 +942,7 @@ uc_ubus_defer_common(uc_vm_t *vm, uc_ubu - ucv_object_to_blob(funargs, &c->buf); - - if (fd) { -- fd_val = get_fd(vm, fd); -+ fd_val = get_fd(vm, fd, NULL); - - if (fd_val < 0) - errval_return(UBUS_STATUS_INVALID_ARGUMENT, -@@ -1174,7 +1178,7 @@ uc_ubus_request_set_fd(uc_vm_t *vm, size - if (!callctx) - err_return(UBUS_STATUS_INVALID_ARGUMENT, "Invalid call context"); - -- fd = get_fd(vm, uc_fn_arg(0)); -+ fd = get_fd(vm, uc_fn_arg(0), NULL); - - if (fd < 0) - err_return(UBUS_STATUS_INVALID_ARGUMENT, "Invalid file descriptor"); -@@ -2313,6 +2317,10 @@ uc_ubus_disconnect(uc_vm_t *vm, size_t n - #ifdef HAVE_UBUS_FLUSH_REQUESTS - ubus_flush_requests(&c->ctx); - #endif -+ if (c->fd_handle) { -+ uloop_fd_delete(&c->ctx.sock); -+ c->ctx.sock.fd = -1; -+ } - ubus_shutdown(&c->ctx); - c->ctx.sock.fd = -1; - uc_ubus_put_res(&c->res); -@@ -2422,6 +2430,10 @@ uc_ubus_channel_disconnect_cb(struct ubu - blob_buf_free(&c->buf); - - if (c->ctx.sock.fd >= 0) { -+ if (c->fd_handle) { -+ uloop_fd_delete(&c->ctx.sock); -+ c->ctx.sock.fd = -1; -+ } - ubus_shutdown(&c->ctx); - c->ctx.sock.fd = -1; - } -@@ -2486,6 +2498,7 @@ uc_ubus_channel_connect(uc_vm_t *vm, siz - { - #ifdef HAVE_UBUS_CHANNEL_SUPPORT - uc_value_t *fd, *cb, *disconnect_cb, *timeout; -+ bool handle = false; - uc_ubus_connection_t *c; - int fd_val; - -@@ -2495,7 +2508,7 @@ uc_ubus_channel_connect(uc_vm_t *vm, siz - "disconnect_cb", UC_CLOSURE, true, &disconnect_cb, - "timeout", UC_INTEGER, true, &timeout); - -- fd_val = get_fd(vm, fd); -+ fd_val = get_fd(vm, fd, &handle); - - if (fd_val < 0) - err_return(UBUS_STATUS_INVALID_ARGUMENT, "Invalid file descriptor argument"); -@@ -2505,6 +2518,8 @@ uc_ubus_channel_connect(uc_vm_t *vm, siz - if (!c) - return NULL; - -+ c->fd_handle = handle; -+ - if (ubus_channel_connect(&c->ctx, fd_val, cb ? uc_ubus_channel_req_cb : NULL)) { - ucv_put(c->res); - err_return(UBUS_STATUS_UNKNOWN_ERROR, "Unable to create ubus channel"); -@@ -2602,8 +2617,13 @@ static void free_connection(void *ud) { - - blob_buf_free(&conn->buf); - -- if (conn->ctx.sock.fd >= 0) -+ if (conn->ctx.sock.fd >= 0) { -+ if (conn->fd_handle) { -+ uloop_fd_delete(&conn->ctx.sock); -+ conn->ctx.sock.fd = -1; -+ } - ubus_shutdown(&conn->ctx); -+ } - } - - static void free_deferred(void *ud) { diff --git a/package/utils/ucode/patches/130-nl80211-add-missing-survey-info-attributes.patch b/package/utils/ucode/patches/130-nl80211-add-missing-survey-info-attributes.patch deleted file mode 100644 index 6f780bb9df..0000000000 --- a/package/utils/ucode/patches/130-nl80211-add-missing-survey-info-attributes.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Felix Fietkau -Date: Sat, 28 Feb 2026 11:12:22 +0000 -Subject: [PATCH] nl80211: add missing survey info attributes - -Add in_use, time_bss_rx and frequency_offset to the survey info -nested attribute spec. - -Signed-off-by: Felix Fietkau ---- - ---- a/lib/nl80211.c -+++ b/lib/nl80211.c -@@ -867,16 +867,19 @@ static const uc_nl_nested_spec_t nl80211 - - static const uc_nl_nested_spec_t nl80211_survey_info_nla = { - .headsize = 0, -- .nattrs = 8, -+ .nattrs = 11, - .attrs = { - { NL80211_SURVEY_INFO_FREQUENCY, "frequency", DT_U32, 0, NULL }, -+ { NL80211_SURVEY_INFO_NOISE, "noise", DT_S8, 0, NULL }, -+ { NL80211_SURVEY_INFO_IN_USE, "in_use", DT_FLAG, 0, NULL }, - { NL80211_SURVEY_INFO_TIME, "time", DT_U64, 0, NULL }, -- { NL80211_SURVEY_INFO_TIME_TX, "time_tx", DT_U64, 0, NULL }, -- { NL80211_SURVEY_INFO_TIME_RX, "time_rx", DT_U64, 0, NULL }, - { NL80211_SURVEY_INFO_TIME_BUSY, "busy", DT_U64, 0, NULL }, - { NL80211_SURVEY_INFO_TIME_EXT_BUSY, "ext_busy", DT_U64, 0, NULL }, -+ { NL80211_SURVEY_INFO_TIME_RX, "time_rx", DT_U64, 0, NULL }, -+ { NL80211_SURVEY_INFO_TIME_TX, "time_tx", DT_U64, 0, NULL }, - { NL80211_SURVEY_INFO_TIME_SCAN, "scan", DT_U64, 0, NULL }, -- { NL80211_SURVEY_INFO_NOISE, "noise", DT_S8, 0, NULL }, -+ { NL80211_SURVEY_INFO_TIME_BSS_RX, "time_bss_rx", DT_U64, 0, NULL }, -+ { NL80211_SURVEY_INFO_FREQUENCY_OFFSET, "frequency_offset", DT_U32, 0, NULL }, - } - }; - diff --git a/package/utils/ucode/patches/131-nl80211-fix-dfs_cac_time-attribute-type.patch b/package/utils/ucode/patches/131-nl80211-fix-dfs_cac_time-attribute-type.patch deleted file mode 100644 index 52eebc53ff..0000000000 --- a/package/utils/ucode/patches/131-nl80211-fix-dfs_cac_time-attribute-type.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Felix Fietkau -Date: Sun, 1 Mar 2026 15:32:06 +0000 -Subject: [PATCH] nl80211: fix dfs_cac_time attribute type - -Signed-off-by: Felix Fietkau ---- - ---- a/lib/nl80211.c -+++ b/lib/nl80211.c -@@ -610,7 +610,7 @@ static const uc_nl_nested_spec_t nl80211 - { NL80211_FREQUENCY_ATTR_NO_HT40_PLUS, "no_ht40_plus", DT_FLAG, 0, NULL }, - { NL80211_FREQUENCY_ATTR_NO_80MHZ, "no_80mhz", DT_FLAG, 0, NULL }, - { NL80211_FREQUENCY_ATTR_NO_160MHZ, "no_160mhz", DT_FLAG, 0, NULL }, -- { NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, "dfs_cac_time", DT_FLAG, 0, NULL }, -+ { NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, "dfs_cac_time", DT_U32, 0, NULL }, - { NL80211_FREQUENCY_ATTR_INDOOR_ONLY, "indoor_only", DT_FLAG, 0, NULL }, - { NL80211_FREQUENCY_ATTR_IR_CONCURRENT, "ir_concurrent", DT_FLAG, 0, NULL }, - { NL80211_FREQUENCY_ATTR_NO_20MHZ, "no_20mhz", DT_FLAG, 0, NULL }, diff --git a/package/utils/ucode/patches/132-nl80211-fix-HE-MCS-set-parsing.patch b/package/utils/ucode/patches/132-nl80211-fix-HE-MCS-set-parsing.patch deleted file mode 100644 index c53f7c0305..0000000000 --- a/package/utils/ucode/patches/132-nl80211-fix-HE-MCS-set-parsing.patch +++ /dev/null @@ -1,43 +0,0 @@ -From: Felix Fietkau -Date: Fri, 20 Mar 2026 11:53:30 +0000 -Subject: [PATCH] nl80211: fix HE MCS set parsing - -The Channel Width Set bits occupy B1-B4 of byte 0 of he_cap_phy. -Since this attribute is a byte array, not an integer, reading it via -nla_get_u16() produces an endian-dependent result. The << 8 shift was -correct on big-endian but wrong on little-endian. - -Fix this by reading byte 0 directly as a uint8_t, making the check -endian-neutral. - -Signed-off-by: Felix Fietkau ---- - ---- a/lib/nl80211.c -+++ b/lib/nl80211.c -@@ -1575,21 +1575,22 @@ uc_nl_convert_rta_he_mcs(const uc_nl_att - uint8_t bw_support_mask[] = { (1 << 1) | (1 << 2), (1 << 3), (1 << 4) }; - uc_value_t *mcs_set, *mcs_bw, *mcs_dir, *mcs_entry, *mcs_idx; - uint16_t bw[] = { 80, 160, 8080 }, mcs[6]; -- uint16_t u16, phy_cap_0 = 0; -+ uint8_t phy_cap_0 = 0; -+ uint16_t u16; - size_t i, j, k, l, max_idx; - - if (!nla_check_len(attr, sizeof(mcs))) - return NULL; - - if (nla_check_len(phy_attr, sizeof(phy_cap_0))) -- phy_cap_0 = nla_get_u16(phy_attr); -+ phy_cap_0 = *(uint8_t *)nla_data(phy_attr); - - memcpy(mcs, nla_data(attr), sizeof(mcs)); - - mcs_set = ucv_array_new_length(vm, 3); - - for (i = 0; i < ARRAY_SIZE(bw); i++) { -- if (!(phy_cap_0 & (bw_support_mask[i] << 8))) -+ if (!(phy_cap_0 & bw_support_mask[i])) - continue; - - mcs_bw = ucv_object_new(vm);