From 34a3d7e18ab326e58591a908a4f2cfe5479844b7 Mon Sep 17 00:00:00 2001 From: purplerain Date: Tue, 16 Jan 2024 01:36:31 +0000 Subject: [PATCH] sync with OpenBSD -current --- .../binutils-2.17/include/opcode/i386.h | 4 + lib/libc/asr/getaddrinfo_async.c | 5 +- regress/lib/libcrypto/evp/evp_pkey_cleanup.c | 4 +- regress/lib/libcrypto/evp/evp_test.c | 8 +- regress/sys/netinet/carp/carp_subr | 2 +- sbin/iked/ca.c | 6 +- sbin/iked/config.c | 26 +- sbin/iked/iked.c | 4 +- sbin/iked/iked.h | 8 +- sbin/iked/ikev2.c | 5 +- sbin/iked/types.h | 3 +- sbin/pfctl/pfctl.c | 25 +- sbin/pfctl/pfctl_parser.h | 3 +- sbin/pfctl/pfctl_table.c | 20 +- sys/arch/arm64/arm64/cpu.c | 28 +- sys/arch/arm64/dev/aplhidev.c | 114 ++++- sys/arch/arm64/dev/rtkit.c | 293 ++++++++----- sys/arch/arm64/include/cpu.h | 3 +- sys/dev/fdt/virtio_mmio.c | 18 +- sys/dev/pci/if_bnxt.c | 9 +- sys/dev/pci/virtio_pci.c | 26 +- sys/kern/kern_clockintr.c | 10 +- sys/kern/kern_exit.c | 5 +- sys/kern/kern_fork.c | 3 +- sys/kern/kern_proc.c | 22 +- sys/kern/kern_sysctl.c | 6 +- sys/sys/clockintr.h | 8 +- sys/sys/proc.h | 5 +- usr.sbin/bgpd/rde.c | 398 ++++++++---------- usr.sbin/bgpd/rtr_proto.c | 25 +- usr.sbin/unbound/aclocal.m4 | 2 +- usr.sbin/unbound/configure | 2 +- 32 files changed, 640 insertions(+), 460 deletions(-) diff --git a/gnu/usr.bin/binutils-2.17/include/opcode/i386.h b/gnu/usr.bin/binutils-2.17/include/opcode/i386.h index 7b315144c..a8d4a43d2 100644 --- a/gnu/usr.bin/binutils-2.17/include/opcode/i386.h +++ b/gnu/usr.bin/binutils-2.17/include/opcode/i386.h @@ -1534,6 +1534,10 @@ static const template i386_optab[] = {"invpcid", 2, 0x660f3882, X, CpuNEW|CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } }, {"invpcid", 2, 0x660f3882, X, CpuNEW|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } }, +/* Intel Indirect Branch Tracking extensions */ +{"endbr64", 0, 0xF30F1E, 0xFA, Cpu64, NoSuf|ImmExt, { 0, 0, 0 } }, +{"endbr32", 0, 0xF30F1E, 0xFB, CpuNo64, NoSuf|ImmExt, { 0, 0, 0 } }, + /* sentinel */ {NULL, 0, 0, 0, 0, 0, { 0, 0, 0} } }; diff --git a/lib/libc/asr/getaddrinfo_async.c b/lib/libc/asr/getaddrinfo_async.c index a1282e711..23262f516 100644 --- a/lib/libc/asr/getaddrinfo_async.c +++ b/lib/libc/asr/getaddrinfo_async.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getaddrinfo_async.c,v 1.61 2023/11/21 15:26:56 florian Exp $ */ +/* $OpenBSD: getaddrinfo_async.c,v 1.62 2024/01/15 18:03:39 florian Exp $ */ /* * Copyright (c) 2012 Eric Faurot * @@ -258,7 +258,8 @@ getaddrinfo_async_run(struct asr_query *as, struct asr_result *ar) !is_localhost) ? "::" : "::1"; /* This can't fail */ _asr_sockaddr_from_str(&sa.sa, family, str); - if ((r = addrinfo_add(as, &sa.sa, NULL))) { + if ((r = addrinfo_add(as, &sa.sa, + "localhost."))) { ar->ar_gai_errno = r; break; } diff --git a/regress/lib/libcrypto/evp/evp_pkey_cleanup.c b/regress/lib/libcrypto/evp/evp_pkey_cleanup.c index fd922efb0..055a70d27 100644 --- a/regress/lib/libcrypto/evp/evp_pkey_cleanup.c +++ b/regress/lib/libcrypto/evp/evp_pkey_cleanup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: evp_pkey_cleanup.c,v 1.3 2022/12/01 13:49:12 tb Exp $ */ +/* $OpenBSD: evp_pkey_cleanup.c,v 1.4 2024/01/15 15:09:57 tb Exp $ */ /* * Copyright (c) 2022 Theo Buehler @@ -33,11 +33,13 @@ int pkey_ids[] = { EVP_PKEY_DH, EVP_PKEY_DSA, EVP_PKEY_EC, + EVP_PKEY_ED25519, EVP_PKEY_GOSTIMIT, EVP_PKEY_GOSTR01, EVP_PKEY_HMAC, EVP_PKEY_RSA, EVP_PKEY_RSA_PSS, + EVP_PKEY_X25519, }; static const size_t N_PKEY_IDS = sizeof(pkey_ids) / sizeof(pkey_ids[0]); diff --git a/regress/lib/libcrypto/evp/evp_test.c b/regress/lib/libcrypto/evp/evp_test.c index ef11089d2..3bd4fb11c 100644 --- a/regress/lib/libcrypto/evp/evp_test.c +++ b/regress/lib/libcrypto/evp/evp_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: evp_test.c,v 1.14 2024/01/11 16:45:26 tb Exp $ */ +/* $OpenBSD: evp_test.c,v 1.15 2024/01/15 15:00:13 tb Exp $ */ /* * Copyright (c) 2022 Joel Sing * Copyright (c) 2023 Theo Buehler @@ -579,13 +579,11 @@ evp_do_all_test(void) int failure = 0; memset(&arg, 0, sizeof(arg)); - /* XXX - replace with EVP_CIPHER_do_all() after next bump. */ - EVP_CIPHER_do_all_sorted(evp_cipher_do_all_cb, &arg); + EVP_CIPHER_do_all(evp_cipher_do_all_cb, &arg); failure |= arg.failure; memset(&arg, 0, sizeof(arg)); - /* XXX - replace with EVP_MD_do_all() after next bump. */ - EVP_MD_do_all_sorted(evp_md_do_all_cb, &arg); + EVP_MD_do_all(evp_md_do_all_cb, &arg); failure |= arg.failure; return failure; diff --git a/regress/sys/netinet/carp/carp_subr b/regress/sys/netinet/carp/carp_subr index e3456c79d..312944fdc 100644 --- a/regress/sys/netinet/carp/carp_subr +++ b/regress/sys/netinet/carp/carp_subr @@ -58,7 +58,7 @@ test() wait_until() { local _i=0 - while [ "$_i" -lt 8 ]; do + while [ "$_i" -lt 16 ]; do sh -c "$@" && return 0 sleep 0.5 _i="$((_i + 1))" diff --git a/sbin/iked/ca.c b/sbin/iked/ca.c index 424bd997c..398a9ffac 100644 --- a/sbin/iked/ca.c +++ b/sbin/iked/ca.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ca.c,v 1.97 2023/09/02 18:16:02 tobhe Exp $ */ +/* $OpenBSD: ca.c,v 1.98 2024/01/15 15:29:00 tobhe Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter @@ -351,8 +351,8 @@ ca_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg) case IMSG_PUBKEY: config_getkey(env, imsg); break; - case IMSG_CERT_PARTIAL_CHAIN: - config_getcertpartialchain(env, imsg); + case IMSG_CTL_STATIC: + config_getstatic(env, imsg); break; default: return (-1); diff --git a/sbin/iked/config.c b/sbin/iked/config.c index e1dabf773..157aeb44b 100644 --- a/sbin/iked/config.c +++ b/sbin/iked/config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.93 2023/08/04 19:06:25 claudio Exp $ */ +/* $OpenBSD: config.c,v 1.94 2024/01/15 15:29:00 tobhe Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -900,6 +900,8 @@ config_setstatic(struct iked *env) { proc_compose(&env->sc_ps, PROC_IKEV2, IMSG_CTL_STATIC, &env->sc_static, sizeof(env->sc_static)); + proc_compose(&env->sc_ps, PROC_CERT, IMSG_CTL_STATIC, + &env->sc_static, sizeof(env->sc_static)); return (0); } @@ -984,28 +986,6 @@ config_getocsp(struct iked *env, struct imsg *imsg) return (0); } -int -config_setcertpartialchain(struct iked *env) -{ - unsigned int boolval; - - boolval = env->sc_cert_partial_chain; - proc_compose(&env->sc_ps, PROC_CERT, IMSG_CERT_PARTIAL_CHAIN, - &boolval, sizeof(boolval)); - return (0); -} - -int -config_getcertpartialchain(struct iked *env, struct imsg *imsg) -{ - unsigned int boolval; - - IMSG_SIZE_CHECK(imsg, &boolval); - memcpy(&boolval, imsg->data, sizeof(boolval)); - env->sc_cert_partial_chain = boolval; - return (0); -} - int config_setkeys(struct iked *env) { diff --git a/sbin/iked/iked.c b/sbin/iked/iked.c index 66268a9ca..e370424c2 100644 --- a/sbin/iked/iked.c +++ b/sbin/iked/iked.c @@ -1,4 +1,4 @@ -/* $OpenBSD: iked.c,v 1.66 2023/06/28 12:31:19 gerhard Exp $ */ +/* $OpenBSD: iked.c,v 1.67 2024/01/15 15:29:00 tobhe Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -301,7 +301,6 @@ parent_configure(struct iked *env) config_setstatic(env); config_setcoupled(env, env->sc_decoupled ? 0 : 1); config_setocsp(env); - config_setcertpartialchain(env); /* Must be last */ config_setmode(env, env->sc_passive ? 1 : 0); @@ -334,7 +333,6 @@ parent_reload(struct iked *env, int reset, const char *filename) config_setstatic(env); config_setcoupled(env, env->sc_decoupled ? 0 : 1); config_setocsp(env); - config_setcertpartialchain(env); /* Must be last */ config_setmode(env, env->sc_passive ? 1 : 0); } else { diff --git a/sbin/iked/iked.h b/sbin/iked/iked.h index bdfac0ee7..89d491aba 100644 --- a/sbin/iked/iked.h +++ b/sbin/iked/iked.h @@ -1,4 +1,4 @@ -/* $OpenBSD: iked.h,v 1.224 2023/08/11 11:24:55 tobhe Exp $ */ +/* $OpenBSD: iked.h,v 1.225 2024/01/15 15:29:00 tobhe Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -774,6 +774,7 @@ enum natt_mode { struct iked_static { uint64_t st_alive_timeout; + int st_cert_partial_chain; int st_enforcesingleikesa; uint8_t st_frag; /* fragmentation */ uint8_t st_mobike; /* MOBIKE */ @@ -793,6 +794,7 @@ struct iked { struct iked_static sc_static; #define sc_alive_timeout sc_static.st_alive_timeout +#define sc_cert_partial_chain sc_static.st_cert_partial_chain #define sc_enforcesingleikesa sc_static.st_enforcesingleikesa #define sc_frag sc_static.st_frag #define sc_mobike sc_static.st_mobike @@ -836,8 +838,6 @@ struct iked { struct iked_addrpool sc_addrpool; struct iked_addrpool6 sc_addrpool6; - - int sc_cert_partial_chain; }; struct iked_socket { @@ -940,8 +940,6 @@ int config_setkeys(struct iked *); int config_getkey(struct iked *, struct imsg *); int config_setstatic(struct iked *); int config_getstatic(struct iked *, struct imsg *); -int config_setcertpartialchain(struct iked *); -int config_getcertpartialchain(struct iked *, struct imsg *); /* policy.c */ void policy_init(struct iked *); diff --git a/sbin/iked/ikev2.c b/sbin/iked/ikev2.c index 673327a80..27f246c3a 100644 --- a/sbin/iked/ikev2.c +++ b/sbin/iked/ikev2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikev2.c,v 1.380 2023/11/24 14:43:00 tobhe Exp $ */ +/* $OpenBSD: ikev2.c,v 1.382 2024/01/15 21:37:58 jan Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -295,8 +295,6 @@ ikev2_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg) return (config_getcompile(env)); case IMSG_CTL_STATIC: return (config_getstatic(env, imsg)); - case IMSG_CERT_PARTIAL_CHAIN: - return(config_getcertpartialchain(env, imsg)); default: break; } @@ -659,6 +657,7 @@ ikev2_recv(struct iked *env, struct iked_message *msg) initiator); msg->msg_msgid = betoh32(hdr->ike_msgid); if (policy_lookup(env, msg, NULL, NULL, 0) != 0) { + log_debug("%s: no compatible policy found", __func__); ikestat_inc(env, ikes_msg_rcvd_dropped); return; } diff --git a/sbin/iked/types.h b/sbin/iked/types.h index 64923dbb2..fd8add52a 100644 --- a/sbin/iked/types.h +++ b/sbin/iked/types.h @@ -1,4 +1,4 @@ -/* $OpenBSD: types.h,v 1.52 2023/03/04 22:22:51 tobhe Exp $ */ +/* $OpenBSD: types.h,v 1.53 2024/01/15 15:29:00 tobhe Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -116,7 +116,6 @@ enum imsg_type { IMSG_CERT, IMSG_CERTVALID, IMSG_CERTINVALID, - IMSG_CERT_PARTIAL_CHAIN, IMSG_SCERT, IMSG_IF_ADDADDR, IMSG_IF_DELADDR, diff --git a/sbin/pfctl/pfctl.c b/sbin/pfctl/pfctl.c index f4ff345a4..ece39d210 100644 --- a/sbin/pfctl/pfctl.c +++ b/sbin/pfctl/pfctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl.c,v 1.392 2023/10/26 16:26:01 deraadt Exp $ */ +/* $OpenBSD: pfctl.c,v 1.393 2024/01/15 07:23:32 sashan Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -118,6 +118,7 @@ int pfctl_recurse(int, int, const char *, int pfctl_call_clearrules(int, int, struct pfr_anchoritem *); int pfctl_call_cleartables(int, int, struct pfr_anchoritem *); int pfctl_call_clearanchors(int, int, struct pfr_anchoritem *); +int pfctl_call_showtables(int, int, struct pfr_anchoritem *); const char *clearopt; char *rulesopt; @@ -2300,6 +2301,13 @@ pfctl_call_clearrules(int dev, int opts, struct pfr_anchoritem *pfra) return (pfctl_clear_rules(dev, opts, pfra->pfra_anchorname)); } +int +pfctl_call_showtables(int dev, int opts, struct pfr_anchoritem *pfra) +{ + pfctl_show_tables(pfra->pfra_anchorname, opts); + return (0); +} + int pfctl_call_clearanchors(int dev, int opts, struct pfr_anchoritem *pfra) { @@ -2325,10 +2333,12 @@ pfctl_recurse(int dev, int opts, const char *anchorname, * so that failures on one anchor do not prevent clearing others. */ opts |= PF_OPT_IGNFAIL; - printf("Removing:\n"); + if ((opts & PF_OPT_CALLSHOW) == 0) + printf("Removing:\n"); SLIST_FOREACH_SAFE(pfra, anchors, pfra_sle, pfra_save) { - printf(" %s\n", (*pfra->pfra_anchorname == '\0') ? - "/" : pfra->pfra_anchorname); + if ((opts & PF_OPT_CALLSHOW) == 0) + printf(" %s\n", (*pfra->pfra_anchorname == '\0') ? + "/" : pfra->pfra_anchorname); rv |= walkf(dev, opts, pfra); SLIST_REMOVE(anchors, pfra, pfr_anchoritem, pfra_sle); free(pfra->pfra_anchorname); @@ -2747,7 +2757,12 @@ main(int argc, char *argv[]) pfctl_show_fingerprints(opts); break; case 'T': - pfctl_show_tables(anchorname, opts); + if (opts & PF_OPT_RECURSE) { + opts |= PF_OPT_CALLSHOW; + pfctl_recurse(dev, opts, anchorname, + pfctl_call_showtables); + } else + pfctl_show_tables(anchorname, opts); break; case 'o': pfctl_load_fingerprints(dev, opts); diff --git a/sbin/pfctl/pfctl_parser.h b/sbin/pfctl/pfctl_parser.h index 01a61a49d..146580db2 100644 --- a/sbin/pfctl/pfctl_parser.h +++ b/sbin/pfctl/pfctl_parser.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_parser.h,v 1.118 2021/10/25 14:50:29 sashan Exp $ */ +/* $OpenBSD: pfctl_parser.h,v 1.119 2024/01/15 07:23:32 sashan Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -52,6 +52,7 @@ #define PF_OPT_RECURSE 0x04000 #define PF_OPT_PORTNAMES 0x08000 #define PF_OPT_IGNFAIL 0x10000 +#define PF_OPT_CALLSHOW 0x20000 #define PF_TH_ALL 0xFF diff --git a/sbin/pfctl/pfctl_table.c b/sbin/pfctl/pfctl_table.c index d041b15d5..ba2140294 100644 --- a/sbin/pfctl/pfctl_table.c +++ b/sbin/pfctl/pfctl_table.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_table.c,v 1.86 2023/10/26 16:26:01 deraadt Exp $ */ +/* $OpenBSD: pfctl_table.c,v 1.87 2024/01/15 07:23:32 sashan Exp $ */ /* * Copyright (c) 2002 Cedric Berger @@ -369,21 +369,21 @@ print_table(struct pfr_table *ta, int verbose, int debug) { if (!debug && !(ta->pfrt_flags & PFR_TFLAG_ACTIVE)) return; - if (verbose) { - printf("%c%c%c%c%c%c%c\t%s", + if (verbose) + printf("%c%c%c%c%c%c%c\t", (ta->pfrt_flags & PFR_TFLAG_CONST) ? 'c' : '-', (ta->pfrt_flags & PFR_TFLAG_PERSIST) ? 'p' : '-', (ta->pfrt_flags & PFR_TFLAG_ACTIVE) ? 'a' : '-', (ta->pfrt_flags & PFR_TFLAG_INACTIVE) ? 'i' : '-', (ta->pfrt_flags & PFR_TFLAG_REFERENCED) ? 'r' : '-', (ta->pfrt_flags & PFR_TFLAG_REFDANCHOR) ? 'h' : '-', - (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-', - ta->pfrt_name); - if (ta->pfrt_anchor[0]) - printf("\t%s", ta->pfrt_anchor); - puts(""); - } else - puts(ta->pfrt_name); + (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-'); + + printf("%s", ta->pfrt_name); + if (ta->pfrt_anchor[0] != '\0') + printf("@%s", ta->pfrt_anchor); + + printf("\n"); } void diff --git a/sys/arch/arm64/arm64/cpu.c b/sys/arch/arm64/arm64/cpu.c index 5be861a5b..ab2a77385 100644 --- a/sys/arch/arm64/arm64/cpu.c +++ b/sys/arch/arm64/arm64/cpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.c,v 1.102 2023/12/26 09:19:15 kettenis Exp $ */ +/* $OpenBSD: cpu.c,v 1.103 2024/01/15 11:58:45 kettenis Exp $ */ /* * Copyright (c) 2016 Dale Rahn @@ -275,6 +275,7 @@ cpu_identify(struct cpu_info *ci) midr = READ_SPECIALREG(midr_el1); impl = CPU_IMPL(midr); part = CPU_PART(midr); + ci->ci_midr = midr; for (i = 0; cpu_implementers[i].name; i++) { if (impl == cpu_implementers[i].id) { @@ -947,14 +948,14 @@ cpu_attach(struct device *parent, struct device *dev, void *aux) } cpu_init(); - -#if NKSTAT > 0 - cpu_kstat_attach(ci); -#endif #ifdef MULTIPROCESSOR } #endif +#if NKSTAT > 0 + cpu_kstat_attach(ci); +#endif + opp = OF_getpropint(ci->ci_node, "operating-points-v2", 0); if (opp) cpu_opp_init(ci, opp); @@ -1204,10 +1205,6 @@ cpu_init_secondary(struct cpu_info *ci) spllower(IPL_NONE); -#if NKSTAT > 0 - cpu_kstat_attach(ci); -#endif - sched_toidle(); } @@ -1862,25 +1859,22 @@ cpu_kstat_attach(struct cpu_info *ci) { struct kstat *ks; struct cpu_kstats *ck; - - uint64_t midr, impl, part; + uint64_t impl, part; const char *impl_name = NULL, *part_name = NULL; const struct cpu_cores *coreselecter = cpu_cores_none; - size_t i; + int i; ks = kstat_create(ci->ci_dev->dv_xname, 0, "mach", 0, KSTAT_T_KV, 0); if (ks == NULL) { printf("%s: unable to create cpu kstats\n", ci->ci_dev->dv_xname); - /* printf? */ return; } ck = malloc(sizeof(*ck), M_DEVBUF, M_WAITOK); - midr = READ_SPECIALREG(midr_el1); - impl = CPU_IMPL(midr); - part = CPU_PART(midr); + impl = CPU_IMPL(ci->ci_midr); + part = CPU_PART(ci->ci_midr); for (i = 0; cpu_implementers[i].name; i++) { if (impl == cpu_implementers[i].id) { @@ -1913,7 +1907,7 @@ cpu_kstat_attach(struct cpu_info *ci) kstat_kv_init(&ck->ck_rev, "rev", KSTAT_KV_T_ISTR); snprintf(kstat_kv_istr(&ck->ck_rev), sizeof(kstat_kv_istr(&ck->ck_rev)), - "r%llup%llu", CPU_VAR(midr), CPU_REV(midr)); + "r%llup%llu", CPU_VAR(ci->ci_midr), CPU_REV(ci->ci_midr)); ks->ks_softc = ci; ks->ks_data = ck; diff --git a/sys/arch/arm64/dev/aplhidev.c b/sys/arch/arm64/dev/aplhidev.c index db6feb6bc..97d00a887 100644 --- a/sys/arch/arm64/dev/aplhidev.c +++ b/sys/arch/arm64/dev/aplhidev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aplhidev.c,v 1.12 2023/07/02 21:44:04 bru Exp $ */ +/* $OpenBSD: aplhidev.c,v 1.13 2024/01/15 13:27:20 kettenis Exp $ */ /* * Copyright (c) 2021 Mark Kettenis * Copyright (c) 2013-2014 joshua stein @@ -62,6 +62,16 @@ #define APLHIDEV_SET_MODE 0x0252 #define APLHIDEV_MODE_HID 0x00 #define APLHIDEV_MODE_RAW 0x01 +#define APLHIDEV_GET_DIMENSIONS 0xd932 + +struct aplhidev_dim { + uint32_t width; + uint32_t height; + int16_t x_min; + int16_t y_min; + int16_t x_max; + int16_t y_max; +}; struct aplhidev_attach_args { uint8_t aa_reportid; @@ -144,6 +154,14 @@ struct aplhidev_softc { struct device *sc_ms; uint8_t sc_tpdesc[APLHIDEV_DESC_MAX]; size_t sc_tpdesclen; + uint8_t sc_dimdesc[APLHIDEV_DESC_MAX]; + size_t sc_dimdesclen; + int sc_x_min; + int sc_x_max; + int sc_y_min; + int sc_y_max; + int sc_h_res; + int sc_v_res; }; int aplhidev_match(struct device *, void *, void *); @@ -161,6 +179,7 @@ void aplhidev_get_info(struct aplhidev_softc *); void aplhidev_get_descriptor(struct aplhidev_softc *, uint8_t); void aplhidev_set_leds(struct aplhidev_softc *, uint8_t); void aplhidev_set_mode(struct aplhidev_softc *, uint8_t); +void aplhidev_get_dimensions(struct aplhidev_softc *); int aplhidev_intr(void *); void aplkbd_intr(struct device *, uint8_t *, size_t); @@ -183,6 +202,7 @@ aplhidev_attach(struct device *parent, struct device *self, void *aux) struct aplhidev_softc *sc = (struct aplhidev_softc *)self; struct spi_attach_args *sa = aux; struct aplhidev_attach_args aa; + struct aplhidev_dim dim; int retry; sc->sc_spi_tag = sa->sa_tag; @@ -248,8 +268,26 @@ aplhidev_attach(struct device *parent, struct device *self, void *aux) break; } + aplhidev_get_dimensions(sc); + for (retry = 10; retry > 0; retry--) { + aplhidev_intr(sc); + delay(1000); + if (sc->sc_dimdesclen > 0) + break; + } + printf("\n"); + if (sc->sc_dimdesclen == sizeof(dim) + 1) { + memcpy(&dim, &sc->sc_dimdesc[1], sizeof(dim)); + sc->sc_x_min = dim.x_min; + sc->sc_x_max = dim.x_max; + sc->sc_y_min = dim.y_min; + sc->sc_y_max = dim.y_max; + sc->sc_h_res = (100 * (dim.x_max - dim.x_min)) / dim.width; + sc->sc_v_res = (100 * (dim.y_max - dim.y_min)) / dim.height; + } + if (sc->sc_kbddesclen > 0) { aa.aa_reportid = APLHIDEV_KBD_DEVICE; aa.aa_desc = sc->sc_kbddesc; @@ -406,6 +444,39 @@ aplhidev_set_mode(struct aplhidev_softc *sc, uint8_t mode) delay(1000); } +void +aplhidev_get_dimensions(struct aplhidev_softc *sc) +{ + struct aplhidev_spi_packet packet; + struct aplhidev_get_desc *msg; + struct aplhidev_spi_status status; + + memset(&packet, 0, sizeof(packet)); + packet.flags = APLHIDEV_WRITE_PACKET; + packet.device = APLHIDEV_TP_DEVICE; + packet.len = sizeof(*msg); + + msg = (void *)&packet.data[0]; + msg->hdr.type = APLHIDEV_GET_DIMENSIONS; + msg->hdr.device = 0; + msg->hdr.msgid = sc->sc_msgid++; + msg->hdr.cmdlen = 0; + msg->hdr.rsplen = APLHIDEV_DESC_MAX; + msg->crc = crc16(0, (void *)msg, sizeof(*msg) - 2); + + packet.crc = crc16(0, (void *)&packet, sizeof(packet) - 2); + + spi_acquire_bus(sc->sc_spi_tag, 0); + spi_config(sc->sc_spi_tag, &sc->sc_spi_conf); + spi_transfer(sc->sc_spi_tag, (char *)&packet, NULL, sizeof(packet), + SPI_KEEP_CS); + delay(100); + spi_read(sc->sc_spi_tag, (char *)&status, sizeof(status)); + spi_release_bus(sc->sc_spi_tag, 0); + + delay(1000); +} + int aplhidev_intr(void *arg) { @@ -476,6 +547,13 @@ aplhidev_intr(void *arg) sc->sc_mode = APLHIDEV_MODE_RAW; return 1; } + if (packet.flags == APLHIDEV_WRITE_PACKET && + packet.device == APLHIDEV_TP_DEVICE && + hdr->type == APLHIDEV_GET_DIMENSIONS) { + memcpy(sc->sc_dimdesc, &packet.data[8], hdr->cmdlen); + sc->sc_dimdesclen = hdr->cmdlen; + return 1; + } /* Valid, but unrecognized packet; ignore for now. */ return 1; @@ -688,17 +766,18 @@ static struct wsmouse_param aplms_wsmousecfg[] = { }; struct aplms_softc { - struct device sc_dev; - struct device *sc_wsmousedev; + struct device sc_dev; + struct aplhidev_softc *sc_hidev; + struct device *sc_wsmousedev; - int sc_enabled; + int sc_enabled; - int tp_offset; - int tp_fingerpad; + int tp_offset; + int tp_fingerpad; - struct mtpoint frame[UBCMTP_MAX_FINGERS]; - int contacts; - int btn; + struct mtpoint frame[UBCMTP_MAX_FINGERS]; + int contacts; + int btn; }; int aplms_enable(void *); @@ -738,6 +817,8 @@ aplms_attach(struct device *parent, struct device *self, void *aux) struct aplms_softc *sc = (struct aplms_softc *)self; struct wsmousedev_attach_args aa; + sc->sc_hidev = (struct aplhidev_softc *)parent; + printf("\n"); sc->tp_offset = UBCMTP_TYPE4_TPOFF; @@ -756,13 +837,14 @@ aplms_configure(struct aplms_softc *sc) { struct wsmousehw *hw = wsmouse_get_hw(sc->sc_wsmousedev); - /* The values below are for the MacBookPro17,1 */ hw->type = WSMOUSE_TYPE_TOUCHPAD; hw->hw_type = WSMOUSEHW_CLICKPAD; - hw->x_min = -6046; - hw->x_max = 6536; - hw->y_min = -164; - hw->y_max = 7439; + hw->x_min = sc->sc_hidev->sc_x_min; + hw->x_max = sc->sc_hidev->sc_x_max; + hw->y_min = sc->sc_hidev->sc_y_min; + hw->y_max = sc->sc_hidev->sc_y_max; + hw->h_res = sc->sc_hidev->sc_h_res; + hw->v_res = sc->sc_hidev->sc_v_res; hw->mt_slots = UBCMTP_MAX_FINGERS; hw->flags = WSMOUSEHW_MT_TRACKING; @@ -846,8 +928,8 @@ aplms_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) wsmc->miny = hw->y_min; wsmc->maxy = hw->y_max; wsmc->swapxy = 0; - wsmc->resx = 0; - wsmc->resy = 0; + wsmc->resx = hw->h_res; + wsmc->resy = hw->v_res; break; case WSMOUSEIO_SETMODE: diff --git a/sys/arch/arm64/dev/rtkit.c b/sys/arch/arm64/dev/rtkit.c index 2c159cd6f..6ebb6da59 100644 --- a/sys/arch/arm64/dev/rtkit.c +++ b/sys/arch/arm64/dev/rtkit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtkit.c,v 1.14 2023/12/30 13:13:11 kettenis Exp $ */ +/* $OpenBSD: rtkit.c,v 1.15 2024/01/15 16:57:31 kettenis Exp $ */ /* * Copyright (c) 2021 Mark Kettenis * @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -107,9 +108,21 @@ struct rtkit_state { struct rtkit *rk; int flags; char *crashlog; + bus_addr_t crashlog_addr; + bus_size_t crashlog_size; + struct task crashlog_task; char *ioreport; + bus_addr_t ioreport_addr; + bus_size_t ioreport_size; + struct task ioreport_task; char *oslog; + bus_addr_t oslog_addr; + bus_size_t oslog_size; + struct task oslog_task; char *syslog; + bus_addr_t syslog_addr; + bus_size_t syslog_size; + struct task syslog_task; uint8_t syslog_n_entries; uint8_t syslog_msg_size; char *syslog_msg; @@ -239,9 +252,11 @@ rtkit_handle_mgmt(struct rtkit_state *state, struct aplmbox_msg *msg) break; case RTKIT_MGMT_IOP_PWR_STATE_ACK: state->iop_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0); + wakeup(&state->iop_pwrstate); break; case RTKIT_MGMT_AP_PWR_STATE: state->ap_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0); + wakeup(&state->ap_pwrstate); break; case RTKIT_MGMT_EPMAP: base = RTKIT_MGMT_EPMAP_BASE(msg->data0); @@ -440,14 +455,54 @@ rtkit_crashlog_dump(char *buf, size_t size) } } +void +rtkit_handle_crashlog_buffer(void *arg) +{ + struct rtkit_state *state = arg; + struct mbox_channel *mc = state->mc; + struct rtkit *rk = state->rk; + bus_addr_t addr = state->crashlog_addr; + bus_size_t size = state->crashlog_size; + + if (addr) { + paddr_t pa = addr; + vaddr_t va; + + if (rk && rk->rk_logmap) { + pa = rk->rk_logmap(rk->rk_cookie, addr); + if (pa == (paddr_t)-1) + return; + } + + state->crashlog = km_alloc(size * PAGE_SIZE, + &kv_any, &kp_none, &kd_waitok); + va = (vaddr_t)state->crashlog; + + while (size-- > 0) { + pmap_kenter_cache(va, pa, PROT_READ, + PMAP_CACHE_CI); + va += PAGE_SIZE; + pa += PAGE_SIZE; + } + return; + } + + if (rk) { + addr = rtkit_alloc(state, size << PAGE_SHIFT, + &state->crashlog); + if (addr == (bus_addr_t)-1) + return; + } + + rtkit_send(mc, RTKIT_EP_CRASHLOG, RTKIT_BUFFER_REQUEST, + (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); +} + int rtkit_handle_crashlog(struct rtkit_state *state, struct aplmbox_msg *msg) { - struct mbox_channel *mc = state->mc; - struct rtkit *rk = state->rk; bus_addr_t addr; bus_size_t size; - int error; switch (RTKIT_MGMT_TYPE(msg->data0)) { case RTKIT_BUFFER_REQUEST: @@ -467,40 +522,12 @@ rtkit_handle_crashlog(struct rtkit_state *state, struct aplmbox_msg *msg) break; } - if (addr) { - paddr_t pa = addr; - vaddr_t va; - - if (rk && rk->rk_logmap) { - pa = rk->rk_logmap(rk->rk_cookie, addr); - if (pa == (paddr_t)-1) - break; - } - - state->crashlog = km_alloc(size * PAGE_SIZE, - &kv_any, &kp_none, &kd_waitok); - va = (vaddr_t)state->crashlog; - - while (size-- > 0) { - pmap_kenter_cache(va, pa, PROT_READ, - PMAP_CACHE_CI); - va += PAGE_SIZE; - pa += PAGE_SIZE; - } - break; - } - - if (rk) { - addr = rtkit_alloc(state, size << PAGE_SHIFT, - &state->crashlog); - if (addr == (bus_addr_t)-1) - return ENOMEM; - } - - error = rtkit_send(mc, RTKIT_EP_CRASHLOG, RTKIT_BUFFER_REQUEST, - (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); - if (error) - return error; + state->crashlog_addr = addr; + state->crashlog_size = size; + if (cold) + rtkit_handle_crashlog_buffer(state); + else + task_add(systq, &state->crashlog_task); break; default: printf("%s: unhandled crashlog event 0x%016llx\n", @@ -522,6 +549,8 @@ rtkit_handle_syslog_log(struct rtkit_state *state, struct aplmbox_msg *msg) if ((state->flags & RK_SYSLOG) == 0) return; + if (state->syslog_msg == NULL) + return; idx = RTKIT_SYSLOG_LOG_IDX(msg->data0); if (idx > state->syslog_n_entries) return; @@ -547,11 +576,30 @@ rtkit_handle_syslog_log(struct rtkit_state *state, struct aplmbox_msg *msg) printf("RTKit syslog %d: %s:%s\n", idx, context, state->syslog_msg); } +void +rtkit_handle_syslog_buffer(void *arg) +{ + struct rtkit_state *state = arg; + struct mbox_channel *mc = state->mc; + struct rtkit *rk = state->rk; + bus_addr_t addr = state->syslog_addr; + bus_size_t size = state->syslog_size; + + if (rk) { + addr = rtkit_alloc(state, size << PAGE_SHIFT, + &state->syslog); + if (addr == (bus_addr_t)-1) + return; + } + + rtkit_send(mc, RTKIT_EP_SYSLOG, RTKIT_BUFFER_REQUEST, + (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); +} + int rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) { struct mbox_channel *mc = state->mc; - struct rtkit *rk = state->rk; bus_addr_t addr; bus_size_t size; int error; @@ -563,17 +611,12 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) if (addr) break; - if (rk) { - addr = rtkit_alloc(state, size << PAGE_SHIFT, - &state->syslog); - if (addr == (bus_addr_t)-1) - return ENOMEM; - } - - error = rtkit_send(mc, RTKIT_EP_SYSLOG, RTKIT_BUFFER_REQUEST, - (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); - if (error) - return error; + state->syslog_addr = addr; + state->syslog_size = size; + if (cold) + rtkit_handle_syslog_buffer(state); + else + task_add(systq, &state->syslog_task); break; case RTKIT_SYSLOG_INIT: state->syslog_n_entries = @@ -581,7 +624,7 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) state->syslog_msg_size = RTKIT_SYSLOG_INIT_MSG_SIZE(msg->data0); state->syslog_msg = malloc(state->syslog_msg_size, - M_DEVBUF, M_WAITOK); + M_DEVBUF, M_NOWAIT); break; case RTKIT_SYSLOG_LOG: rtkit_handle_syslog_log(state, msg); @@ -599,11 +642,30 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) return 0; } +void +rtkit_handle_ioreport_buffer(void *arg) +{ + struct rtkit_state *state = arg; + struct mbox_channel *mc = state->mc; + struct rtkit *rk = state->rk; + bus_addr_t addr = state->ioreport_addr; + bus_size_t size = state->ioreport_size; + + if (rk) { + addr = rtkit_alloc(state, size << PAGE_SHIFT, + &state->ioreport); + if (addr == (bus_addr_t)-1) + return; + } + + rtkit_send(mc, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST, + (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); +} + int rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) { struct mbox_channel *mc = state->mc; - struct rtkit *rk = state->rk; bus_addr_t addr; bus_size_t size; int error; @@ -615,17 +677,12 @@ rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) if (addr) break; - if (rk) { - addr = rtkit_alloc(state, size << PAGE_SHIFT, - &state->ioreport); - if (addr == (bus_addr_t)-1) - return ENOMEM; - } - - error = rtkit_send(mc, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST, - (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); - if (error) - return error; + state->ioreport_addr = addr; + state->ioreport_size = size; + if (cold) + rtkit_handle_ioreport_buffer(state); + else + task_add(systq, &state->ioreport_task); break; case RTKIT_IOREPORT_UNKNOWN1: case RTKIT_IOREPORT_UNKNOWN2: @@ -644,14 +701,31 @@ rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) return 0; } +void +rtkit_handle_oslog_buffer(void *arg) +{ + struct rtkit_state *state = arg; + struct mbox_channel *mc = state->mc; + struct rtkit *rk = state->rk; + bus_addr_t addr = state->oslog_addr; + bus_size_t size = state->oslog_size; + + if (rk) { + addr = rtkit_alloc(state, size, &state->oslog); + if (addr == (bus_addr_t)-1) + return; + } + + rtkit_send(mc, RTKIT_EP_OSLOG, + (RTKIT_OSLOG_BUFFER_REQUEST << RTKIT_OSLOG_TYPE_SHIFT), + (size << RTKIT_OSLOG_BUFFER_SIZE_SHIFT) | (addr >> PAGE_SHIFT)); +} + int rtkit_handle_oslog(struct rtkit_state *state, struct aplmbox_msg *msg) { - struct mbox_channel *mc = state->mc; - struct rtkit *rk = state->rk; bus_addr_t addr; bus_size_t size; - int error; switch (RTKIT_OSLOG_TYPE(msg->data0)) { case RTKIT_OSLOG_BUFFER_REQUEST: @@ -660,18 +734,12 @@ rtkit_handle_oslog(struct rtkit_state *state, struct aplmbox_msg *msg) if (addr) break; - if (rk) { - addr = rtkit_alloc(state, size, &state->oslog); - if (addr == (bus_addr_t)-1) - return ENOMEM; - } - - error = rtkit_send(mc, RTKIT_EP_OSLOG, - (RTKIT_OSLOG_BUFFER_REQUEST << RTKIT_OSLOG_TYPE_SHIFT), - (size << RTKIT_OSLOG_BUFFER_SIZE_SHIFT) | - (addr >> PAGE_SHIFT)); - if (error) - return error; + state->oslog_addr = addr; + state->oslog_size = size; + if (cold) + rtkit_handle_oslog_buffer(state); + else + task_add(systq, &state->oslog_task); break; case RTKIT_OSLOG_UNKNOWN1: case RTKIT_OSLOG_UNKNOWN2: @@ -776,6 +844,11 @@ rtkit_init(int node, const char *name, int flags, struct rtkit *rk) state->iop_pwrstate = RTKIT_MGMT_PWR_STATE_SLEEP; state->ap_pwrstate = RTKIT_MGMT_PWR_STATE_QUIESCED; + task_set(&state->crashlog_task, rtkit_handle_crashlog_buffer, state); + task_set(&state->syslog_task, rtkit_handle_syslog_buffer, state); + task_set(&state->ioreport_task, rtkit_handle_ioreport_buffer, state); + task_set(&state->oslog_task, rtkit_handle_oslog_buffer, state); + return state; } @@ -834,20 +907,29 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate) if (error) return error; - for (timo = 0; timo < 100000; timo++) { - error = rtkit_poll(state); - if (error == EWOULDBLOCK) { - delay(10); - continue; - } - if (error) - return error; + if (cold) { + for (timo = 0; timo < 100000; timo++) { + error = rtkit_poll(state); + if (error == EWOULDBLOCK) { + delay(10); + continue; + } + if (error) + return error; - if (state->ap_pwrstate == pwrstate) - break; + if (state->ap_pwrstate == pwrstate) + return 0; + } } - return error; + while (state->ap_pwrstate != pwrstate) { + error = tsleep_nsec(&state->ap_pwrstate, PWAIT, "appwr", + SEC_TO_NSEC(1)); + if (error) + return error; + } + + return 0; } int @@ -856,7 +938,7 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate) struct mbox_channel *mc = state->mc; int error, timo; - if (state->iop_pwrstate == pwrstate) + if (state->iop_pwrstate == (pwrstate & 0xff)) return 0; error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE, @@ -864,20 +946,29 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate) if (error) return error; - for (timo = 0; timo < 100000; timo++) { - error = rtkit_poll(state); - if (error == EWOULDBLOCK) { - delay(10); - continue; - } - if (error) - return error; + if (cold) { + for (timo = 0; timo < 100000; timo++) { + error = rtkit_poll(state); + if (error == EWOULDBLOCK) { + delay(10); + continue; + } + if (error) + return error; - if (state->iop_pwrstate == (pwrstate & 0xff)) - break; + if (state->iop_pwrstate == (pwrstate & 0xff)) + return 0; + } } - return error; + while (state->iop_pwrstate != (pwrstate & 0xff)) { + error = tsleep_nsec(&state->iop_pwrstate, PWAIT, "ioppwr", + SEC_TO_NSEC(1)); + if (error) + return error; + } + + return 0; } int diff --git a/sys/arch/arm64/include/cpu.h b/sys/arch/arm64/include/cpu.h index a457f27e0..37ae5c402 100644 --- a/sys/arch/arm64/include/cpu.h +++ b/sys/arch/arm64/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.40 2023/12/26 09:19:15 kettenis Exp $ */ +/* $OpenBSD: cpu.h,v 1.41 2024/01/15 11:58:45 kettenis Exp $ */ /* * Copyright (c) 2016 Dale Rahn * @@ -116,6 +116,7 @@ struct cpu_info { u_int32_t ci_cpuid; uint64_t ci_mpidr; + uint64_t ci_midr; u_int ci_acpi_proc_id; int ci_node; struct cpu_info *ci_self; diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c index 4f1e9eba9..4d92508f7 100644 --- a/sys/dev/fdt/virtio_mmio.c +++ b/sys/dev/fdt/virtio_mmio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio_mmio.c,v 1.11 2023/05/29 08:13:35 sf Exp $ */ +/* $OpenBSD: virtio_mmio.c,v 1.12 2024/01/15 02:35:23 dv Exp $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */ /* @@ -200,11 +200,19 @@ virtio_mmio_set_status(struct virtio_softc *vsc, int status) struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; int old = 0; - if (status != 0) + if (status == 0) { + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS, + 0); + while (bus_space_read_4(sc->sc_iot, sc->sc_ioh, + VIRTIO_MMIO_STATUS) != 0) { + CPU_BUSY_CYCLE(); + } + } else { old = bus_space_read_4(sc->sc_iot, sc->sc_ioh, - VIRTIO_MMIO_STATUS); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS, - status|old); + VIRTIO_MMIO_STATUS); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS, + status|old); + } } int diff --git a/sys/dev/pci/if_bnxt.c b/sys/dev/pci/if_bnxt.c index 8f309a63c..1efa7b724 100644 --- a/sys/dev/pci/if_bnxt.c +++ b/sys/dev/pci/if_bnxt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bnxt.c,v 1.43 2024/01/10 05:06:00 jmatthew Exp $ */ +/* $OpenBSD: if_bnxt.c,v 1.44 2024/01/15 08:56:45 jmatthew Exp $ */ /*- * Broadcom NetXtreme-C/E network driver. * @@ -92,7 +92,7 @@ #define BNXT_CP_PAGES 4 -#define BNXT_MAX_TX_SEGS 32 /* a bit much? */ +#define BNXT_MAX_TX_SEGS 31 #define BNXT_TX_SLOTS(bs) (bs->bs_map->dm_nsegs + 1) #define BNXT_HWRM_SHORT_REQ_LEN sizeof(struct hwrm_short_input) @@ -1395,8 +1395,9 @@ bnxt_start(struct ifqueue *ifq) else txflags = TX_BD_LONG_FLAGS_LHINT_GTE2K; txflags |= TX_BD_LONG_TYPE_TX_BD_LONG | - TX_BD_LONG_FLAGS_NO_CMPL | - (BNXT_TX_SLOTS(bs) << TX_BD_LONG_FLAGS_BD_CNT_SFT); + TX_BD_LONG_FLAGS_NO_CMPL; + txflags |= (BNXT_TX_SLOTS(bs) << TX_BD_LONG_FLAGS_BD_CNT_SFT) & + TX_BD_LONG_FLAGS_BD_CNT_MASK; if (map->dm_nsegs == 1) txflags |= TX_BD_SHORT_FLAGS_PACKET_END; txring[idx].flags_type = htole16(txflags); diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c index 398dc960f..36a62c13b 100644 --- a/sys/dev/pci/virtio_pci.c +++ b/sys/dev/pci/virtio_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio_pci.c,v 1.35 2023/07/07 10:23:39 patrick Exp $ */ +/* $OpenBSD: virtio_pci.c,v 1.36 2024/01/15 02:35:23 dv Exp $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */ /* @@ -282,15 +282,29 @@ virtio_pci_set_status(struct virtio_softc *vsc, int status) int old = 0; if (sc->sc_sc.sc_version_1) { - if (status != 0) + if (status == 0) { + CWRITE(sc, device_status, 0); + while (CREAD(sc, device_status) != 0) { + CPU_BUSY_CYCLE(); + } + } else { old = CREAD(sc, device_status); - CWRITE(sc, device_status, status|old); + CWRITE(sc, device_status, status|old); + } } else { - if (status != 0) + if (status == 0) { + bus_space_write_1(sc->sc_iot, sc->sc_ioh, + VIRTIO_CONFIG_DEVICE_STATUS, status|old); + while (bus_space_read_1(sc->sc_iot, sc->sc_ioh, + VIRTIO_CONFIG_DEVICE_STATUS) != 0) { + CPU_BUSY_CYCLE(); + } + } else { old = bus_space_read_1(sc->sc_iot, sc->sc_ioh, VIRTIO_CONFIG_DEVICE_STATUS); - bus_space_write_1(sc->sc_iot, sc->sc_ioh, - VIRTIO_CONFIG_DEVICE_STATUS, status|old); + bus_space_write_1(sc->sc_iot, sc->sc_ioh, + VIRTIO_CONFIG_DEVICE_STATUS, status|old); + } } } diff --git a/sys/kern/kern_clockintr.c b/sys/kern/kern_clockintr.c index c9f5fd2cd..6e771a043 100644 --- a/sys/kern/kern_clockintr.c +++ b/sys/kern/kern_clockintr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_clockintr.c,v 1.62 2023/10/17 00:04:02 cheloha Exp $ */ +/* $OpenBSD: kern_clockintr.c,v 1.63 2024/01/15 01:15:37 cheloha Exp $ */ /* * Copyright (c) 2003 Dale Rahn * Copyright (c) 2020 Mark Kettenis @@ -220,8 +220,8 @@ clockintr_dispatch(void *frame) mtx_enter(&cq->cq_mtx); cq->cq_running = NULL; - if (ISSET(cl->cl_flags, CLST_IGNORE_REQUEST)) { - CLR(cl->cl_flags, CLST_IGNORE_REQUEST); + if (ISSET(cq->cq_flags, CQ_IGNORE_REQUEST)) { + CLR(cq->cq_flags, CQ_IGNORE_REQUEST); CLR(request->cr_flags, CR_RESCHEDULE); } if (ISSET(request->cr_flags, CR_RESCHEDULE)) { @@ -333,7 +333,7 @@ clockintr_cancel(struct clockintr *cl) } } if (cl == cq->cq_running) - SET(cl->cl_flags, CLST_IGNORE_REQUEST); + SET(cq->cq_flags, CQ_IGNORE_REQUEST); mtx_leave(&cq->cq_mtx); } @@ -384,7 +384,7 @@ clockintr_schedule_locked(struct clockintr *cl, uint64_t expiration) } } if (cl == cq->cq_running) - SET(cl->cl_flags, CLST_IGNORE_REQUEST); + SET(cq->cq_flags, CQ_IGNORE_REQUEST); } void diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index ce6aea2aa..06aabdc07 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exit.c,v 1.217 2023/09/29 12:47:34 claudio Exp $ */ +/* $OpenBSD: kern_exit.c,v 1.218 2024/01/15 15:47:37 mvs Exp $ */ /* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */ /* @@ -165,6 +165,8 @@ exit1(struct proc *p, int xexit, int xsig, int flags) /* main thread gotta wait because it has the pid, et al */ while (pr->ps_threadcnt > 1) tsleep_nsec(&pr->ps_threads, PWAIT, "thrdeath", INFSLP); + LIST_REMOVE(pr, ps_list); + refcnt_finalize(&pr->ps_refcnt, "psdtor"); } rup = pr->ps_ru; @@ -252,7 +254,6 @@ exit1(struct proc *p, int xexit, int xsig, int flags) if ((p->p_flag & P_THREAD) == 0) { LIST_REMOVE(pr, ps_hash); - LIST_REMOVE(pr, ps_list); if ((pr->ps_flags & PS_NOZOMBIE) == 0) LIST_INSERT_HEAD(&zombprocess, pr, ps_list); diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 0ab3fb698..c606826af 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.253 2023/10/24 13:20:11 claudio Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.254 2024/01/15 15:47:37 mvs Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -197,6 +197,7 @@ process_initialize(struct process *pr, struct proc *p) LIST_INIT(&pr->ps_sigiolst); TAILQ_INIT(&pr->ps_tslpqueue); + refcnt_init(&pr->ps_refcnt); rw_init(&pr->ps_lock, "pslock"); mtx_init(&pr->ps_mtx, IPL_HIGH); diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index ba6ae513c..659d6f97b 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_proc.c,v 1.95 2023/09/19 11:35:30 claudio Exp $ */ +/* $OpenBSD: kern_proc.c,v 1.96 2024/01/15 15:47:37 mvs Exp $ */ /* $NetBSD: kern_proc.c,v 1.14 1996/02/09 18:59:41 christos Exp $ */ /* @@ -231,6 +231,26 @@ prfind(pid_t pid) return (NULL); } +struct process * +priterator(struct process *ps) +{ + struct process *nps; + + KERNEL_ASSERT_LOCKED(); + + if (ps == NULL) + nps = LIST_FIRST(&allprocess); + else + nps = LIST_NEXT(ps, ps_list); + + if (nps) + refcnt_take(&nps->ps_refcnt); + if (ps) + refcnt_rele_wake(&ps->ps_refcnt); + + return nps; +} + /* * Locate a process group by number */ diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index bcabee27f..edc85b193 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.421 2024/01/10 16:44:30 bluhm Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.422 2024/01/15 15:47:37 mvs Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -1534,7 +1534,7 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep, break; } matched = 0; - LIST_FOREACH(pr, &allprocess, ps_list) { + for (pr = priterator(NULL); pr != NULL; pr = priterator(pr)) { /* * skip system, exiting, embryonic and undead * processes @@ -1566,7 +1566,7 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep, error = ESRCH; break; case KERN_FILE_BYUID: - LIST_FOREACH(pr, &allprocess, ps_list) { + for (pr = priterator(NULL); pr != NULL; pr = priterator(pr)) { /* * skip system, exiting, embryonic and undead * processes diff --git a/sys/sys/clockintr.h b/sys/sys/clockintr.h index 92d841edf..8a6991bfa 100644 --- a/sys/sys/clockintr.h +++ b/sys/sys/clockintr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: clockintr.h,v 1.23 2023/10/17 00:04:02 cheloha Exp $ */ +/* $OpenBSD: clockintr.h,v 1.24 2024/01/15 01:15:37 cheloha Exp $ */ /* * Copyright (c) 2020-2022 Scott Cheloha * @@ -68,7 +68,6 @@ struct clockintr { }; #define CLST_PENDING 0x00000001 /* scheduled to run */ -#define CLST_IGNORE_REQUEST 0x00000002 /* ignore callback requests */ /* * Interface for callback rescheduling requests. @@ -108,12 +107,13 @@ struct clockintr_queue { struct clockintr_stat cq_stat; /* [o] dispatch statistics */ volatile uint32_t cq_gen; /* [o] cq_stat update generation */ volatile uint32_t cq_dispatch; /* [o] dispatch is running */ - uint32_t cq_flags; /* [I] CQ_* flags; see below */ + uint32_t cq_flags; /* [m] CQ_* flags; see below */ }; #define CQ_INIT 0x00000001 /* clockintr_cpu_init() done */ #define CQ_INTRCLOCK 0x00000002 /* intrclock installed */ -#define CQ_STATE_MASK 0x00000003 +#define CQ_IGNORE_REQUEST 0x00000004 /* ignore callback requests */ +#define CQ_STATE_MASK 0x00000007 void clockintr_cpu_init(const struct intrclock *); int clockintr_dispatch(void *); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 452311610..31ca608e5 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.352 2023/09/29 12:47:34 claudio Exp $ */ +/* $OpenBSD: proc.h,v 1.353 2024/01/15 15:47:37 mvs Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -50,6 +50,7 @@ #include /* For struct rusage */ #include /* For struct rwlock */ #include /* For struct sigio */ +#include #ifdef _KERNEL #include @@ -164,6 +165,7 @@ struct process { struct futex_list ps_ftlist; /* futexes attached to this process */ struct tslpqueue ps_tslpqueue; /* [p] queue of threads in thrsleep */ + struct refcnt ps_refcnt; struct rwlock ps_lock; /* per-process rwlock */ struct mutex ps_mtx; /* per-process mutex */ @@ -526,6 +528,7 @@ void freepid(pid_t); struct process *prfind(pid_t); /* Find process by id. */ struct process *zombiefind(pid_t); /* Find zombie process by id. */ +struct process *priterator(struct process *); struct proc *tfind(pid_t); /* Find thread by id. */ struct pgrp *pgfind(pid_t); /* Find process group by id. */ struct proc *tfind_user(pid_t, struct process *); diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c index b5ba5d720..245393f2f 100644 --- a/usr.sbin/bgpd/rde.c +++ b/usr.sbin/bgpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.613 2023/12/14 13:52:37 claudio Exp $ */ +/* $OpenBSD: rde.c,v 1.614 2024/01/15 15:44:50 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -56,7 +56,7 @@ void rde_update_withdraw(struct rde_peer *, uint32_t, struct bgpd_addr *, uint8_t); int rde_attr_parse(u_char *, uint16_t, struct rde_peer *, struct filterstate *, struct mpattr *); -int rde_attr_add(struct filterstate *, u_char *, uint16_t); +int rde_attr_add(struct filterstate *, struct ibuf *); uint8_t rde_attr_missing(struct rde_aspath *, int, uint16_t); int rde_get_mp_nexthop(u_char *, uint16_t, uint8_t, struct rde_peer *, struct filterstate *); @@ -364,21 +364,22 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) { static struct flowspec *curflow; struct imsg imsg; + struct ibuf ibuf; struct rde_peer_stats stats; struct ctl_show_set cset; struct ctl_show_rib csr; struct ctl_show_rib_request req; struct session_up sup; + struct peer_config pconf; struct rde_peer *peer; struct rde_aspath *asp; struct filter_set *s; struct as_set *aset; struct rde_prefixset *pset; - uint8_t *asdata; ssize_t n; - size_t aslen; + uint32_t peerid; + pid_t pid; int verbose; - uint16_t len; uint8_t aid; while (imsgbuf) { @@ -387,43 +388,43 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) if (n == 0) break; - switch (imsg.hdr.type) { + peerid = imsg_get_id(&imsg); + pid = imsg_get_pid(&imsg); + switch (imsg_get_type(&imsg)) { case IMSG_UPDATE: case IMSG_REFRESH: - if ((peer = peer_get(imsg.hdr.peerid)) == NULL) { + if ((peer = peer_get(peerid)) == NULL) { log_warnx("rde_dispatch: unknown peer id %d", - imsg.hdr.peerid); + peerid); break; } peer_imsg_push(peer, &imsg); break; case IMSG_SESSION_ADD: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct peer_config)) + if (imsg_get_data(&imsg, &pconf, sizeof(pconf)) == -1) fatalx("incorrect size of session request"); - peer = peer_add(imsg.hdr.peerid, imsg.data, out_rules); + peer = peer_add(peerid, &pconf, out_rules); /* make sure rde_eval_all is on if needed. */ if (peer->conf.flags & PEERFLAG_EVALUATE_ALL) rde_eval_all = 1; break; case IMSG_SESSION_UP: - if ((peer = peer_get(imsg.hdr.peerid)) == NULL) { + if ((peer = peer_get(peerid)) == NULL) { log_warnx("%s: unknown peer id %d", - "IMSG_SESSION_UP", imsg.hdr.peerid); + "IMSG_SESSION_UP", peerid); break; } - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(sup)) + if (imsg_get_data(&imsg, &sup, sizeof(sup)) == -1) fatalx("incorrect size of session request"); - memcpy(&sup, imsg.data, sizeof(sup)); peer_up(peer, &sup); /* make sure rde_eval_all is on if needed. */ if (peer_has_add_path(peer, AID_UNSPEC, CAPA_AP_SEND)) rde_eval_all = 1; break; case IMSG_SESSION_DOWN: - if ((peer = peer_get(imsg.hdr.peerid)) == NULL) { + if ((peer = peer_get(peerid)) == NULL) { log_warnx("%s: unknown peer id %d", - "IMSG_SESSION_DOWN", imsg.hdr.peerid); + "IMSG_SESSION_DOWN", peerid); break; } peer_down(peer, NULL); @@ -432,26 +433,25 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) case IMSG_SESSION_NOGRACE: case IMSG_SESSION_FLUSH: case IMSG_SESSION_RESTARTED: - if ((peer = peer_get(imsg.hdr.peerid)) == NULL) { + if ((peer = peer_get(peerid)) == NULL) { log_warnx("%s: unknown peer id %d", - "graceful restart", imsg.hdr.peerid); + "graceful restart", peerid); break; } - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(aid)) { + if (imsg_get_data(&imsg, &aid, sizeof(aid)) == -1) { log_warnx("%s: wrong imsg len", __func__); break; } - memcpy(&aid, imsg.data, sizeof(aid)); if (aid >= AID_MAX) { log_warnx("%s: bad AID", __func__); break; } - switch (imsg.hdr.type) { + switch (imsg_get_type(&imsg)) { case IMSG_SESSION_STALE: case IMSG_SESSION_NOGRACE: peer_stale(peer, aid, - imsg.hdr.type == IMSG_SESSION_NOGRACE); + imsg_get_type(&imsg) == IMSG_SESSION_NOGRACE); break; case IMSG_SESSION_FLUSH: peer_flush(peer, aid, peer->staletime[aid]); @@ -464,12 +464,11 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) } break; case IMSG_NETWORK_ADD: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct network_config)) { + if (imsg_get_data(&imsg, &netconf_s, + sizeof(netconf_s)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&netconf_s, imsg.data, sizeof(netconf_s)); TAILQ_INIT(&netconf_s.attrset); rde_filterstate_init(&netconf_state); asp = &netconf_state.aspath; @@ -480,16 +479,16 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) F_ANN_DYNAMIC; break; case IMSG_NETWORK_ASPATH: - if (imsg.hdr.len - IMSG_HEADER_SIZE < - sizeof(csr)) { + if (imsg_get_ibuf(&imsg, &ibuf) == -1) { + log_warnx("rde_dispatch: bad imsg"); + memset(&netconf_s, 0, sizeof(netconf_s)); + break; + } + if (ibuf_get(&ibuf, &csr, sizeof(csr)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); memset(&netconf_s, 0, sizeof(netconf_s)); break; } - aslen = imsg.hdr.len - IMSG_HEADER_SIZE - sizeof(csr); - asdata = imsg.data; - asdata += sizeof(struct ctl_show_rib); - memcpy(&csr, imsg.data, sizeof(csr)); asp = &netconf_state.aspath; asp->lpref = csr.local_pref; asp->med = csr.med; @@ -498,17 +497,13 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) asp->origin = csr.origin; asp->flags |= F_PREFIX_ANNOUNCED | F_ANN_DYNAMIC; aspath_put(asp->aspath); - asp->aspath = aspath_get(asdata, aslen); + asp->aspath = aspath_get(ibuf_data(&ibuf), + ibuf_size(&ibuf)); break; case IMSG_NETWORK_ATTR: - if (imsg.hdr.len <= IMSG_HEADER_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } /* parse optional path attributes */ - len = imsg.hdr.len - IMSG_HEADER_SIZE; - if (rde_attr_add(&netconf_state, imsg.data, - len) == -1) { + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + rde_attr_add(&netconf_state, &ibuf) == -1) { log_warnx("rde_dispatch: bad network " "attribute"); rde_filterstate_clean(&netconf_state); @@ -517,10 +512,6 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) } break; case IMSG_NETWORK_DONE: - if (imsg.hdr.len != IMSG_HEADER_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } TAILQ_CONCAT(&netconf_s.attrset, &session_set, entry); switch (netconf_s.prefix.aid) { case AID_INET: @@ -544,12 +535,11 @@ badnet: rde_filterstate_clean(&netconf_state); break; case IMSG_NETWORK_REMOVE: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct network_config)) { + if (imsg_get_data(&imsg, &netconf_s, + sizeof(netconf_s)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&netconf_s, imsg.data, sizeof(netconf_s)); TAILQ_INIT(&netconf_s.attrset); switch (netconf_s.prefix.aid) { @@ -570,32 +560,27 @@ badnetdel: } break; case IMSG_NETWORK_FLUSH: - if (imsg.hdr.len != IMSG_HEADER_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if (rib_dump_new(RIB_ADJ_IN, AID_UNSPEC, RDE_RUNNER_ROUNDS, NULL, network_flush_upcall, NULL, NULL) == -1) log_warn("rde_dispatch: IMSG_NETWORK_FLUSH"); break; case IMSG_FLOWSPEC_ADD: - if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if (curflow != NULL) { log_warnx("rde_dispatch: " "unexpected flowspec add"); break; } - curflow = malloc(imsg.hdr.len - IMSG_HEADER_SIZE); + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + ibuf_size(&ibuf) <= FLOWSPEC_SIZE) { + log_warnx("rde_dispatch: wrong imsg len"); + break; + } + curflow = malloc(ibuf_size(&ibuf)); if (curflow == NULL) fatal(NULL); - memcpy(curflow, imsg.data, - imsg.hdr.len - IMSG_HEADER_SIZE); - if (curflow->len + FLOWSPEC_SIZE != - imsg.hdr.len - IMSG_HEADER_SIZE) { + memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf)); + if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) { free(curflow); curflow = NULL; log_warnx("rde_dispatch: wrong flowspec len"); @@ -630,22 +615,21 @@ badnetdel: curflow = NULL; break; case IMSG_FLOWSPEC_REMOVE: - if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if (curflow != NULL) { log_warnx("rde_dispatch: " "unexpected flowspec remove"); break; } - curflow = malloc(imsg.hdr.len - IMSG_HEADER_SIZE); + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + ibuf_size(&ibuf) <= FLOWSPEC_SIZE) { + log_warnx("rde_dispatch: wrong imsg len"); + break; + } + curflow = malloc(ibuf_size(&ibuf)); if (curflow == NULL) fatal(NULL); - memcpy(curflow, imsg.data, - imsg.hdr.len - IMSG_HEADER_SIZE); - if (curflow->len + FLOWSPEC_SIZE != - imsg.hdr.len - IMSG_HEADER_SIZE) { + memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf)); + if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) { free(curflow); curflow = NULL; log_warnx("rde_dispatch: wrong flowspec len"); @@ -663,22 +647,18 @@ badnetdel: curflow = NULL; break; case IMSG_FLOWSPEC_FLUSH: - if (imsg.hdr.len != IMSG_HEADER_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } prefix_flowspec_dump(AID_UNSPEC, NULL, flowspec_flush_upcall, NULL); break; case IMSG_FILTER_SET: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct filter_set)) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if ((s = malloc(sizeof(struct filter_set))) == NULL) fatal(NULL); - memcpy(s, imsg.data, sizeof(struct filter_set)); + if (imsg_get_data(&imsg, s, sizeof(struct filter_set)) + == -1) { + log_warnx("rde_dispatch: wrong imsg len"); + free(s); + break; + } if (s->type == ACTION_SET_NEXTHOP) { s->action.nh_ref = nexthop_get(&s->action.nexthop); @@ -689,39 +669,32 @@ badnetdel: case IMSG_CTL_SHOW_NETWORK: case IMSG_CTL_SHOW_RIB: case IMSG_CTL_SHOW_RIB_PREFIX: - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(req)) { + if (imsg_get_data(&imsg, &req, sizeof(req)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&req, imsg.data, sizeof(req)); - rde_dump_ctx_new(&req, imsg.hdr.pid, imsg.hdr.type); + rde_dump_ctx_new(&req, pid, imsg_get_type(&imsg)); break; case IMSG_CTL_SHOW_FLOWSPEC: - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(req)) { + if (imsg_get_data(&imsg, &req, sizeof(req)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&req, imsg.data, sizeof(req)); - prefix_flowspec_dump(req.aid, &imsg.hdr.pid, + prefix_flowspec_dump(req.aid, &pid, flowspec_dump_upcall, flowspec_dump_done); break; case IMSG_CTL_SHOW_NEIGHBOR: - if (imsg.hdr.len - IMSG_HEADER_SIZE != 0) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } - peer = peer_get(imsg.hdr.peerid); + peer = peer_get(peerid); if (peer != NULL) memcpy(&stats, &peer->stats, sizeof(stats)); else memset(&stats, 0, sizeof(stats)); imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NEIGHBOR, - imsg.hdr.peerid, imsg.hdr.pid, -1, - &stats, sizeof(stats)); + peerid, pid, -1, &stats, sizeof(stats)); break; case IMSG_CTL_SHOW_RIB_MEM: imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_RIB_MEM, 0, - imsg.hdr.pid, -1, &rdemem, sizeof(rdemem)); + pid, -1, &rdemem, sizeof(rdemem)); break; case IMSG_CTL_SHOW_SET: /* first roa set */ @@ -733,7 +706,7 @@ badnetdel: cset.v4_cnt = pset->th.v4_cnt; cset.v6_cnt = pset->th.v6_cnt; imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, - imsg.hdr.pid, -1, &cset, sizeof(cset)); + pid, -1, &cset, sizeof(cset)); /* then aspa set */ memset(&cset, 0, sizeof(cset)); @@ -741,7 +714,7 @@ badnetdel: strlcpy(cset.name, "RPKI ASPA", sizeof(cset.name)); aspa_table_stats(rde_aspa, &cset); imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, - imsg.hdr.pid, -1, &cset, sizeof(cset)); + pid, -1, &cset, sizeof(cset)); SIMPLEQ_FOREACH(aset, &conf->as_sets, entry) { memset(&cset, 0, sizeof(cset)); @@ -751,7 +724,7 @@ badnetdel: cset.lastchange = aset->lastchange; cset.as_cnt = set_nmemb(aset->set); imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, - imsg.hdr.pid, -1, &cset, sizeof(cset)); + pid, -1, &cset, sizeof(cset)); } SIMPLEQ_FOREACH(pset, &conf->rde_prefixsets, entry) { memset(&cset, 0, sizeof(cset)); @@ -762,7 +735,7 @@ badnetdel: cset.v4_cnt = pset->th.v4_cnt; cset.v6_cnt = pset->th.v6_cnt; imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, - imsg.hdr.pid, -1, &cset, sizeof(cset)); + pid, -1, &cset, sizeof(cset)); } SIMPLEQ_FOREACH(pset, &conf->rde_originsets, entry) { memset(&cset, 0, sizeof(cset)); @@ -773,39 +746,43 @@ badnetdel: cset.v4_cnt = pset->th.v4_cnt; cset.v6_cnt = pset->th.v6_cnt; imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, - imsg.hdr.pid, -1, &cset, sizeof(cset)); + pid, -1, &cset, sizeof(cset)); } - imsg_compose(ibuf_se_ctl, IMSG_CTL_END, 0, imsg.hdr.pid, + imsg_compose(ibuf_se_ctl, IMSG_CTL_END, 0, pid, -1, NULL, 0); break; case IMSG_CTL_LOG_VERBOSE: /* already checked by SE */ - memcpy(&verbose, imsg.data, sizeof(verbose)); + if (imsg_get_data(&imsg, &verbose, sizeof(verbose)) == + -1) { + log_warnx("rde_dispatch: wrong imsg len"); + break; + } log_setverbose(verbose); break; case IMSG_CTL_END: - imsg_compose(ibuf_se_ctl, IMSG_CTL_END, 0, imsg.hdr.pid, + imsg_compose(ibuf_se_ctl, IMSG_CTL_END, 0, pid, -1, NULL, 0); break; case IMSG_CTL_TERMINATE: - rde_dump_ctx_terminate(imsg.hdr.pid); + rde_dump_ctx_terminate(pid); break; case IMSG_XON: - if (imsg.hdr.peerid) { - peer = peer_get(imsg.hdr.peerid); + if (peerid) { + peer = peer_get(peerid); if (peer) peer->throttled = 0; } else { - rde_dump_ctx_throttle(imsg.hdr.pid, 0); + rde_dump_ctx_throttle(pid, 0); } break; case IMSG_XOFF: - if (imsg.hdr.peerid) { - peer = peer_get(imsg.hdr.peerid); + if (peerid) { + peer = peer_get(peerid); if (peer) peer->throttled = 1; } else { - rde_dump_ctx_throttle(imsg.hdr.pid, 1); + rde_dump_ctx_throttle(pid, 1); } break; case IMSG_RECONF_DRAIN: @@ -827,10 +804,15 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) static struct l3vpn *vpn; static struct flowspec *curflow; struct imsg imsg; - struct mrt xmrt; - struct roa roa; - struct rde_rib rr; + struct ibuf ibuf; + struct bgpd_config tconf; struct filterstate state; + struct kroute_nexthop knext; + struct mrt xmrt; + struct prefixset_item psi; + struct rde_rib rr; + struct roa roa; + char name[SET_NAME_LEN]; struct imsgbuf *i; struct filter_head *nr; struct filter_rule *r; @@ -838,8 +820,6 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) struct rib *rib; struct rde_prefixset *ps; struct rde_aspath *asp; - struct prefixset_item psi; - char *name; size_t nmemb; int n, fd, rv; uint16_t rid; @@ -850,7 +830,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) if (n == 0) break; - switch (imsg.hdr.type) { + switch (imsg_get_type(&imsg)) { case IMSG_SOCKET_CONN: case IMSG_SOCKET_CONN_CTL: case IMSG_SOCKET_CONN_RTR: @@ -862,7 +842,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) if ((i = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); imsg_init(i, fd); - switch (imsg.hdr.type) { + switch (imsg_get_type(&imsg)) { case IMSG_SOCKET_CONN: if (ibuf_se) { log_warnx("Unexpected imsg connection " @@ -893,12 +873,11 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) } break; case IMSG_NETWORK_ADD: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct network_config)) { + if (imsg_get_data(&imsg, &netconf_p, + sizeof(netconf_p)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&netconf_p, imsg.data, sizeof(netconf_p)); TAILQ_INIT(&netconf_p.attrset); break; case IMSG_NETWORK_DONE: @@ -915,32 +894,30 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) rde_filterstate_clean(&state); break; case IMSG_NETWORK_REMOVE: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct network_config)) { + if (imsg_get_data(&imsg, &netconf_p, + sizeof(netconf_p)) == -1) { log_warnx("rde_dispatch: wrong imsg len"); break; } - memcpy(&netconf_p, imsg.data, sizeof(netconf_p)); TAILQ_INIT(&netconf_p.attrset); network_delete(&netconf_p); break; case IMSG_FLOWSPEC_ADD: - if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if (curflow != NULL) { log_warnx("rde_dispatch: " "unexpected flowspec add"); break; } - curflow = malloc(imsg.hdr.len - IMSG_HEADER_SIZE); + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + ibuf_size(&ibuf) <= FLOWSPEC_SIZE) { + log_warnx("rde_dispatch: wrong imsg len"); + break; + } + curflow = malloc(ibuf_size(&ibuf)); if (curflow == NULL) fatal(NULL); - memcpy(curflow, imsg.data, - imsg.hdr.len - IMSG_HEADER_SIZE); - if (curflow->len + FLOWSPEC_SIZE != - imsg.hdr.len - IMSG_HEADER_SIZE) { + memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf)); + if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) { free(curflow); curflow = NULL; log_warnx("rde_dispatch: wrong flowspec len"); @@ -974,22 +951,21 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) curflow = NULL; break; case IMSG_FLOWSPEC_REMOVE: - if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) { - log_warnx("rde_dispatch: wrong imsg len"); - break; - } if (curflow != NULL) { log_warnx("rde_dispatch: " "unexpected flowspec remove"); break; } - curflow = malloc(imsg.hdr.len - IMSG_HEADER_SIZE); + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + ibuf_size(&ibuf) <= FLOWSPEC_SIZE) { + log_warnx("rde_dispatch: wrong imsg len"); + break; + } + curflow = malloc(ibuf_size(&ibuf)); if (curflow == NULL) fatal(NULL); - memcpy(curflow, imsg.data, - imsg.hdr.len - IMSG_HEADER_SIZE); - if (curflow->len + FLOWSPEC_SIZE != - imsg.hdr.len - IMSG_HEADER_SIZE) { + memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf)); + if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) { free(curflow); curflow = NULL; log_warnx("rde_dispatch: wrong flowspec len"); @@ -1007,15 +983,14 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) curflow = NULL; break; case IMSG_RECONF_CONF: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct bgpd_config)) + if (imsg_get_data(&imsg, &tconf, sizeof(tconf)) == -1) fatalx("IMSG_RECONF_CONF bad len"); out_rules_tmp = calloc(1, sizeof(struct filter_head)); if (out_rules_tmp == NULL) fatal(NULL); TAILQ_INIT(out_rules_tmp); nconf = new_config(); - copy_config(nconf, imsg.data); + copy_config(nconf, &tconf); for (rid = 0; rid < rib_size; rid++) { if ((rib = rib_byid(rid)) == NULL) @@ -1025,10 +1000,8 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) } break; case IMSG_RECONF_RIB: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct rde_rib)) + if (imsg_get_data(&imsg, &rr, sizeof(rr)) == -1) fatalx("IMSG_RECONF_RIB bad len"); - memcpy(&rr, imsg.data, sizeof(rr)); rib = rib_byid(rib_find(rr.name)); if (rib == NULL) { rib = rib_new(rr.name, rr.rtableid, rr.flags); @@ -1044,12 +1017,10 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) } break; case IMSG_RECONF_FILTER: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct filter_rule)) - fatalx("IMSG_RECONF_FILTER bad len"); if ((r = malloc(sizeof(struct filter_rule))) == NULL) fatal(NULL); - memcpy(r, imsg.data, sizeof(struct filter_rule)); + if (imsg_get_data(&imsg, r, sizeof(*r)) == -1) + fatalx("IMSG_RECONF_FILTER bad len"); if (r->match.prefixset.name[0] != '\0') { r->match.prefixset.ps = rde_find_prefixset(r->match.prefixset.name, @@ -1106,14 +1077,13 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) break; case IMSG_RECONF_PREFIX_SET: case IMSG_RECONF_ORIGIN_SET: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(ps->name)) - fatalx("IMSG_RECONF_PREFIX_SET bad len"); ps = calloc(1, sizeof(struct rde_prefixset)); if (ps == NULL) fatal(NULL); - memcpy(ps->name, imsg.data, sizeof(ps->name)); - if (imsg.hdr.type == IMSG_RECONF_ORIGIN_SET) { + if (imsg_get_data(&imsg, ps->name, sizeof(ps->name)) == + -1) + fatalx("IMSG_RECONF_PREFIX_SET bad len"); + if (imsg_get_type(&imsg) == IMSG_RECONF_ORIGIN_SET) { SIMPLEQ_INSERT_TAIL(&nconf->rde_originsets, ps, entry); } else { @@ -1123,15 +1093,13 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) last_prefixset = ps; break; case IMSG_RECONF_ROA_ITEM: - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(roa)) + if (imsg_get_data(&imsg, &roa, sizeof(roa)) == -1) fatalx("IMSG_RECONF_ROA_ITEM bad len"); - memcpy(&roa, imsg.data, sizeof(roa)); rv = trie_roa_add(&last_prefixset->th, &roa); break; case IMSG_RECONF_PREFIX_SET_ITEM: - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(psi)) + if (imsg_get_data(&imsg, &psi, sizeof(psi)) == -1) fatalx("IMSG_RECONF_PREFIX_SET_ITEM bad len"); - memcpy(&psi, imsg.data, sizeof(psi)); if (last_prefixset == NULL) fatalx("King Bula has no prefixset"); rv = trie_add(&last_prefixset->th, @@ -1143,20 +1111,21 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) psi.p.len); break; case IMSG_RECONF_AS_SET: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(nmemb) + SET_NAME_LEN) + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + ibuf_get(&ibuf, &nmemb, sizeof(nmemb)) == -1 || + ibuf_get(&ibuf, name, sizeof(name)) == -1) fatalx("IMSG_RECONF_AS_SET bad len"); - memcpy(&nmemb, imsg.data, sizeof(nmemb)); - name = (char *)imsg.data + sizeof(nmemb); if (as_sets_lookup(&nconf->as_sets, name) != NULL) fatalx("duplicate as-set %s", name); last_as_set = as_sets_new(&nconf->as_sets, name, nmemb, sizeof(uint32_t)); break; case IMSG_RECONF_AS_SET_ITEMS: - nmemb = imsg.hdr.len - IMSG_HEADER_SIZE; - nmemb /= sizeof(uint32_t); - if (set_add(last_as_set->set, imsg.data, nmemb) != 0) + if (imsg_get_ibuf(&imsg, &ibuf) == -1) + fatalx("IMSG_RECONF_AS_SET_ITEMS bad len"); + nmemb = ibuf_size(&ibuf) / sizeof(uint32_t); + if (set_add(last_as_set->set, ibuf_data(&ibuf), + nmemb) != 0) fatal(NULL); break; case IMSG_RECONF_AS_SET_DONE: @@ -1164,12 +1133,10 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) last_as_set = NULL; break; case IMSG_RECONF_VPN: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(struct l3vpn)) - fatalx("IMSG_RECONF_VPN bad len"); - if ((vpn = malloc(sizeof(struct l3vpn))) == NULL) + if ((vpn = malloc(sizeof(*vpn))) == NULL) fatal(NULL); - memcpy(vpn, imsg.data, sizeof(struct l3vpn)); + if (imsg_get_data(&imsg, vpn, sizeof(*vpn)) == -1) + fatalx("IMSG_RECONF_VPN bad len"); TAILQ_INIT(&vpn->import); TAILQ_INIT(&vpn->export); TAILQ_INIT(&vpn->net_l); @@ -1205,15 +1172,15 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) rde_reload_done(); break; case IMSG_NEXTHOP_UPDATE: - nexthop_update(imsg.data); + if (imsg_get_data(&imsg, &knext, sizeof(knext)) == -1) + fatalx("IMSG_NEXTHOP_UPDATE bad len"); + nexthop_update(&knext); break; case IMSG_FILTER_SET: - if (imsg.hdr.len > IMSG_HEADER_SIZE + - sizeof(struct filter_set)) - fatalx("IMSG_FILTER_SET bad len"); - if ((s = malloc(sizeof(struct filter_set))) == NULL) + if ((s = malloc(sizeof(*s))) == NULL) fatal(NULL); - memcpy(s, imsg.data, sizeof(struct filter_set)); + if (imsg_get_data(&imsg, s, sizeof(*s)) == -1) + fatalx("IMSG_FILTER_SET bad len"); if (s->type == ACTION_SET_NEXTHOP) { s->action.nh_ref = nexthop_get(&s->action.nexthop); @@ -1223,19 +1190,18 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) break; case IMSG_MRT_OPEN: case IMSG_MRT_REOPEN: - if (imsg.hdr.len > IMSG_HEADER_SIZE + - sizeof(struct mrt)) { + if (imsg_get_data(&imsg, &xmrt, sizeof(xmrt)) == -1) { log_warnx("wrong imsg len"); break; } - memcpy(&xmrt, imsg.data, sizeof(xmrt)); if ((fd = imsg_get_fd(&imsg)) == -1) log_warnx("expected to receive fd for mrt dump " "but didn't receive any"); else if (xmrt.type == MRT_TABLE_DUMP || xmrt.type == MRT_TABLE_DUMP_MP || xmrt.type == MRT_TABLE_DUMP_V2) { - rde_dump_mrt_new(&xmrt, imsg.hdr.pid, fd); + rde_dump_mrt_new(&xmrt, imsg_get_pid(&imsg), + fd); } else close(fd); break; @@ -1243,7 +1209,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) /* ignore end message because a dump is atomic */ break; default: - fatalx("unhandled IMSG %u", imsg.hdr.type); + fatalx("unhandled IMSG %u", imsg_get_type(&imsg)); } imsg_free(&imsg); } @@ -1264,16 +1230,14 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf) if (n == 0) break; - switch (imsg.hdr.type) { + switch (imsg_get_type(&imsg)) { case IMSG_RECONF_ROA_SET: /* start of update */ trie_free(&roa_new.th); /* clear new roa */ break; case IMSG_RECONF_ROA_ITEM: - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(roa)) + if (imsg_get_data(&imsg, &roa, sizeof(roa)) == -1) fatalx("IMSG_RECONF_ROA_ITEM bad len"); - memcpy(&roa, imsg.data, sizeof(roa)); if (trie_roa_add(&roa_new.th, &roa) != 0) { struct bgpd_addr p = { .aid = roa.aid, @@ -1284,11 +1248,10 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf) } break; case IMSG_RECONF_ASPA_PREP: - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(ap)) + if (imsg_get_data(&imsg, &ap, sizeof(ap)) == -1) fatalx("IMSG_RECONF_ASPA_PREP bad len"); if (aspa_new) fatalx("unexpected IMSG_RECONF_ASPA_PREP"); - memcpy(&ap, imsg.data, sizeof(ap)); aspa_new = aspa_table_prep(ap.entries, ap.datasize); break; case IMSG_RECONF_ASPA: @@ -1296,28 +1259,24 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf) fatalx("unexpected IMSG_RECONF_ASPA"); if (aspa != NULL) fatalx("IMSG_RECONF_ASPA already sent"); - if (imsg.hdr.len - IMSG_HEADER_SIZE != - sizeof(uint32_t) * 2) - fatalx("IMSG_RECONF_ASPA bad len"); - if ((aspa = calloc(1, sizeof(*aspa))) == NULL) fatal("IMSG_RECONF_ASPA"); - memcpy(&aspa->as, imsg.data, sizeof(aspa->as)); - memcpy(&aspa->num, (char *)imsg.data + sizeof(aspa->as), - sizeof(aspa->num)); + if (imsg_get_data(&imsg, aspa, + offsetof(struct aspa_set, tas)) == -1) + fatal("IMSG_RECONF_ASPA bad len"); break; case IMSG_RECONF_ASPA_TAS: if (aspa == NULL) fatalx("unexpected IMSG_RECONF_ASPA_TAS"); - if (imsg.hdr.len - IMSG_HEADER_SIZE != - aspa->num * sizeof(uint32_t)) + if (imsg_get_len(&imsg) != aspa->num * sizeof(uint32_t)) fatalx("IMSG_RECONF_ASPA_TAS bad len"); aspa->tas = reallocarray(NULL, aspa->num, sizeof(uint32_t)); if (aspa->tas == NULL) fatal("IMSG_RECONF_ASPA_TAS"); - memcpy(aspa->tas, imsg.data, - aspa->num * sizeof(uint32_t)); + if (imsg_get_data(&imsg, aspa->tas, + aspa->num * sizeof(uint32_t)) == -1) + fatal("IMSG_RECONF_ASPA_TAS bad len"); break; case IMSG_RECONF_ASPA_DONE: if (aspa_new == NULL) @@ -1346,18 +1305,17 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula) if (!peer_imsg_pop(peer, &imsg)) return; - switch (imsg.hdr.type) { + switch (imsg_get_type(&imsg)) { case IMSG_UPDATE: if (peer->state != PEER_UP) break; rde_update_dispatch(peer, &imsg); break; case IMSG_REFRESH: - if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(rr)) { + if (imsg_get_data(&imsg, &rr, sizeof(rr)) == -1) { log_warnx("route refresh: wrong imsg len"); break; } - memcpy(&rr, imsg.data, sizeof(rr)); if (rr.aid >= AID_MAX) { log_peer_warnx(&peer->conf, "route refresh: bad AID %d", rr.aid); @@ -1401,7 +1359,7 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula) break; default: log_warnx("%s: unhandled imsg type %d", __func__, - imsg.hdr.type); + imsg_get_type(&imsg)); break; } @@ -2413,53 +2371,51 @@ bad_list: return (plen); } +#undef UPD_READ +#undef CHECK_FLAGS + int -rde_attr_add(struct filterstate *state, u_char *p, uint16_t len) +rde_attr_add(struct filterstate *state, struct ibuf *buf) { uint16_t attr_len; - uint16_t plen = 0; uint8_t flags; uint8_t type; uint8_t tmp8; - if (len < 3) + if (ibuf_get_n8(buf, &flags) == -1 || + ibuf_get_n8(buf, &type) == -1) return (-1); - UPD_READ(&flags, p, plen, 1); - UPD_READ(&type, p, plen, 1); - if (flags & ATTR_EXTLEN) { - if (len - plen < 2) + if (ibuf_get_n16(buf, &attr_len) == -1) return (-1); - UPD_READ(&attr_len, p, plen, 2); - attr_len = ntohs(attr_len); } else { - UPD_READ(&tmp8, p, plen, 1); + if (ibuf_get_n8(buf, &tmp8) == -1) + return (-1); attr_len = tmp8; } - if (len - plen < attr_len) + if (ibuf_size(buf) != attr_len) return (-1); switch (type) { case ATTR_COMMUNITIES: - return community_add(&state->communities, flags, p, attr_len); + return community_add(&state->communities, flags, + ibuf_data(buf), attr_len); case ATTR_LARGE_COMMUNITIES: - return community_large_add(&state->communities, flags, p, - attr_len); + return community_large_add(&state->communities, flags, + ibuf_data(buf), attr_len); case ATTR_EXT_COMMUNITIES: return community_ext_add(&state->communities, flags, 0, - p, attr_len); + ibuf_data(buf), attr_len); } - if (attr_optadd(&state->aspath, flags, type, p, attr_len) == -1) + if (attr_optadd(&state->aspath, flags, type, ibuf_data(buf), + attr_len) == -1) return (-1); return (0); } -#undef UPD_READ -#undef CHECK_FLAGS - uint8_t rde_attr_missing(struct rde_aspath *a, int ebgp, uint16_t nlrilen) { diff --git a/usr.sbin/bgpd/rtr_proto.c b/usr.sbin/bgpd/rtr_proto.c index 46a043408..958d4385e 100644 --- a/usr.sbin/bgpd/rtr_proto.c +++ b/usr.sbin/bgpd/rtr_proto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtr_proto.c,v 1.31 2024/01/11 15:38:05 claudio Exp $ */ +/* $OpenBSD: rtr_proto.c,v 1.32 2024/01/15 11:55:26 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker @@ -419,6 +419,7 @@ rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr, { struct rtr_header rh; size_t len; + uint16_t errcode; if (ibuf_get(hdr, &rh, sizeof(rh)) == -1) fatal("%s: ibuf_get", __func__); @@ -443,7 +444,14 @@ rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr, rtr_fsm(rs, RTR_EVNT_NEGOTIATION_DONE); break; case ERROR_REPORT: - /* version handled in rtr_parse_error() */ + errcode = ntohs(rh.session_id); + if (errcode == UNSUPP_PROTOCOL_VERS || + errcode == NO_DATA_AVAILABLE) { + if (rh.version < rs->version) { + rs->prev_version = rs->version; + rs->version = rh.version; + } + } break; case SERIAL_NOTIFY: /* ignore SERIAL_NOTIFY */ @@ -537,6 +545,10 @@ rtr_parse_notify(struct rtr_session *rs, struct ibuf *pdu) if (ibuf_get(pdu, ¬ify, sizeof(notify)) == -1) goto badlen; + /* set session_id if not yet happened */ + if (rs->session_id == -1) + rs->session_id = ntohs(notify.hdr.session_id); + if (rtr_check_session_id(rs, rs->session_id, ¬ify.hdr, pdu) == -1) return -1; @@ -960,10 +972,6 @@ rtr_parse_error(struct rtr_session *rs, struct ibuf *pdu) rtr_fsm(rs, RTR_EVNT_NO_DATA); rv = 0; } else if (errcode == UNSUPP_PROTOCOL_VERS) { - if (rh.version < rs->version) { - rs->prev_version = rs->version; - rs->version = rh.version; - } rtr_fsm(rs, RTR_EVNT_UNSUPP_PROTO_VERSION); rv = 0; } else @@ -1126,6 +1134,11 @@ rtr_fsm(struct rtr_session *rs, enum rtr_event event) timer_set(&rs->timers, Timer_Rtr_Retry, rs->retry); rtr_imsg_compose(IMSG_SOCKET_CONN, rs->id, 0, NULL, 0); break; + case RTR_STATE_ESTABLISHED: + if (rs->session_id == -1) + rtr_send_reset_query(rs); + else + rtr_send_serial_query(rs); default: break; } diff --git a/usr.sbin/unbound/aclocal.m4 b/usr.sbin/unbound/aclocal.m4 index 0ce842b19..b6a48d8a1 100644 --- a/usr.sbin/unbound/aclocal.m4 +++ b/usr.sbin/unbound/aclocal.m4 @@ -3503,7 +3503,7 @@ freebsd* | dragonfly*) i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly|SecBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; diff --git a/usr.sbin/unbound/configure b/usr.sbin/unbound/configure index 7592463ad..9f8a19087 100644 --- a/usr.sbin/unbound/configure +++ b/usr.sbin/unbound/configure @@ -8071,7 +8071,7 @@ freebsd* | dragonfly*) i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly|SecBSD)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;;