sync with OpenBSD -current

This commit is contained in:
purplerain 2024-01-16 01:36:31 +00:00
parent 25aa71bc5f
commit 34a3d7e18a
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
32 changed files with 640 additions and 460 deletions

View file

@ -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|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 } }, {"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 */ /* sentinel */
{NULL, 0, 0, 0, 0, 0, { 0, 0, 0} } {NULL, 0, 0, 0, 0, 0, { 0, 0, 0} }
}; };

View file

@ -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 <eric@openbsd.org> * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
* *
@ -258,7 +258,8 @@ getaddrinfo_async_run(struct asr_query *as, struct asr_result *ar)
!is_localhost) ? "::" : "::1"; !is_localhost) ? "::" : "::1";
/* This can't fail */ /* This can't fail */
_asr_sockaddr_from_str(&sa.sa, family, str); _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; ar->ar_gai_errno = r;
break; break;
} }

View file

@ -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 <tb@openbsd.org> * Copyright (c) 2022 Theo Buehler <tb@openbsd.org>
@ -33,11 +33,13 @@ int pkey_ids[] = {
EVP_PKEY_DH, EVP_PKEY_DH,
EVP_PKEY_DSA, EVP_PKEY_DSA,
EVP_PKEY_EC, EVP_PKEY_EC,
EVP_PKEY_ED25519,
EVP_PKEY_GOSTIMIT, EVP_PKEY_GOSTIMIT,
EVP_PKEY_GOSTR01, EVP_PKEY_GOSTR01,
EVP_PKEY_HMAC, EVP_PKEY_HMAC,
EVP_PKEY_RSA, EVP_PKEY_RSA,
EVP_PKEY_RSA_PSS, EVP_PKEY_RSA_PSS,
EVP_PKEY_X25519,
}; };
static const size_t N_PKEY_IDS = sizeof(pkey_ids) / sizeof(pkey_ids[0]); static const size_t N_PKEY_IDS = sizeof(pkey_ids) / sizeof(pkey_ids[0]);

View file

@ -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 <jsing@openbsd.org> * Copyright (c) 2022 Joel Sing <jsing@openbsd.org>
* Copyright (c) 2023 Theo Buehler <tb@openbsd.org> * Copyright (c) 2023 Theo Buehler <tb@openbsd.org>
@ -579,13 +579,11 @@ evp_do_all_test(void)
int failure = 0; int failure = 0;
memset(&arg, 0, sizeof(arg)); memset(&arg, 0, sizeof(arg));
/* XXX - replace with EVP_CIPHER_do_all() after next bump. */ EVP_CIPHER_do_all(evp_cipher_do_all_cb, &arg);
EVP_CIPHER_do_all_sorted(evp_cipher_do_all_cb, &arg);
failure |= arg.failure; failure |= arg.failure;
memset(&arg, 0, sizeof(arg)); memset(&arg, 0, sizeof(arg));
/* XXX - replace with EVP_MD_do_all() after next bump. */ EVP_MD_do_all(evp_md_do_all_cb, &arg);
EVP_MD_do_all_sorted(evp_md_do_all_cb, &arg);
failure |= arg.failure; failure |= arg.failure;
return failure; return failure;

View file

@ -58,7 +58,7 @@ test()
wait_until() { wait_until() {
local _i=0 local _i=0
while [ "$_i" -lt 8 ]; do while [ "$_i" -lt 16 ]; do
sh -c "$@" && return 0 sh -c "$@" && return 0
sleep 0.5 sleep 0.5
_i="$((_i + 1))" _i="$((_i + 1))"

View file

@ -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 <reyk@openbsd.org> * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
@ -351,8 +351,8 @@ ca_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
case IMSG_PUBKEY: case IMSG_PUBKEY:
config_getkey(env, imsg); config_getkey(env, imsg);
break; break;
case IMSG_CERT_PARTIAL_CHAIN: case IMSG_CTL_STATIC:
config_getcertpartialchain(env, imsg); config_getstatic(env, imsg);
break; break;
default: default:
return (-1); return (-1);

View file

@ -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 <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -900,6 +900,8 @@ config_setstatic(struct iked *env)
{ {
proc_compose(&env->sc_ps, PROC_IKEV2, IMSG_CTL_STATIC, proc_compose(&env->sc_ps, PROC_IKEV2, IMSG_CTL_STATIC,
&env->sc_static, sizeof(env->sc_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); return (0);
} }
@ -984,28 +986,6 @@ config_getocsp(struct iked *env, struct imsg *imsg)
return (0); 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 int
config_setkeys(struct iked *env) config_setkeys(struct iked *env)
{ {

View file

@ -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 <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -301,7 +301,6 @@ parent_configure(struct iked *env)
config_setstatic(env); config_setstatic(env);
config_setcoupled(env, env->sc_decoupled ? 0 : 1); config_setcoupled(env, env->sc_decoupled ? 0 : 1);
config_setocsp(env); config_setocsp(env);
config_setcertpartialchain(env);
/* Must be last */ /* Must be last */
config_setmode(env, env->sc_passive ? 1 : 0); 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_setstatic(env);
config_setcoupled(env, env->sc_decoupled ? 0 : 1); config_setcoupled(env, env->sc_decoupled ? 0 : 1);
config_setocsp(env); config_setocsp(env);
config_setcertpartialchain(env);
/* Must be last */ /* Must be last */
config_setmode(env, env->sc_passive ? 1 : 0); config_setmode(env, env->sc_passive ? 1 : 0);
} else { } else {

View file

@ -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 <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -774,6 +774,7 @@ enum natt_mode {
struct iked_static { struct iked_static {
uint64_t st_alive_timeout; uint64_t st_alive_timeout;
int st_cert_partial_chain;
int st_enforcesingleikesa; int st_enforcesingleikesa;
uint8_t st_frag; /* fragmentation */ uint8_t st_frag; /* fragmentation */
uint8_t st_mobike; /* MOBIKE */ uint8_t st_mobike; /* MOBIKE */
@ -793,6 +794,7 @@ struct iked {
struct iked_static sc_static; struct iked_static sc_static;
#define sc_alive_timeout sc_static.st_alive_timeout #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_enforcesingleikesa sc_static.st_enforcesingleikesa
#define sc_frag sc_static.st_frag #define sc_frag sc_static.st_frag
#define sc_mobike sc_static.st_mobike #define sc_mobike sc_static.st_mobike
@ -836,8 +838,6 @@ struct iked {
struct iked_addrpool sc_addrpool; struct iked_addrpool sc_addrpool;
struct iked_addrpool6 sc_addrpool6; struct iked_addrpool6 sc_addrpool6;
int sc_cert_partial_chain;
}; };
struct iked_socket { struct iked_socket {
@ -940,8 +940,6 @@ int config_setkeys(struct iked *);
int config_getkey(struct iked *, struct imsg *); int config_getkey(struct iked *, struct imsg *);
int config_setstatic(struct iked *); int config_setstatic(struct iked *);
int config_getstatic(struct iked *, struct imsg *); int config_getstatic(struct iked *, struct imsg *);
int config_setcertpartialchain(struct iked *);
int config_getcertpartialchain(struct iked *, struct imsg *);
/* policy.c */ /* policy.c */
void policy_init(struct iked *); void policy_init(struct iked *);

View file

@ -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 <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -295,8 +295,6 @@ ikev2_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
return (config_getcompile(env)); return (config_getcompile(env));
case IMSG_CTL_STATIC: case IMSG_CTL_STATIC:
return (config_getstatic(env, imsg)); return (config_getstatic(env, imsg));
case IMSG_CERT_PARTIAL_CHAIN:
return(config_getcertpartialchain(env, imsg));
default: default:
break; break;
} }
@ -659,6 +657,7 @@ ikev2_recv(struct iked *env, struct iked_message *msg)
initiator); initiator);
msg->msg_msgid = betoh32(hdr->ike_msgid); msg->msg_msgid = betoh32(hdr->ike_msgid);
if (policy_lookup(env, msg, NULL, NULL, 0) != 0) { if (policy_lookup(env, msg, NULL, NULL, 0) != 0) {
log_debug("%s: no compatible policy found", __func__);
ikestat_inc(env, ikes_msg_rcvd_dropped); ikestat_inc(env, ikes_msg_rcvd_dropped);
return; return;
} }

View file

@ -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 <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -116,7 +116,6 @@ enum imsg_type {
IMSG_CERT, IMSG_CERT,
IMSG_CERTVALID, IMSG_CERTVALID,
IMSG_CERTINVALID, IMSG_CERTINVALID,
IMSG_CERT_PARTIAL_CHAIN,
IMSG_SCERT, IMSG_SCERT,
IMSG_IF_ADDADDR, IMSG_IF_ADDADDR,
IMSG_IF_DELADDR, IMSG_IF_DELADDR,

View file

@ -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 * 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_clearrules(int, int, struct pfr_anchoritem *);
int pfctl_call_cleartables(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_clearanchors(int, int, struct pfr_anchoritem *);
int pfctl_call_showtables(int, int, struct pfr_anchoritem *);
const char *clearopt; const char *clearopt;
char *rulesopt; 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)); 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 int
pfctl_call_clearanchors(int dev, int opts, struct pfr_anchoritem *pfra) pfctl_call_clearanchors(int dev, int opts, struct pfr_anchoritem *pfra)
{ {
@ -2325,8 +2333,10 @@ pfctl_recurse(int dev, int opts, const char *anchorname,
* so that failures on one anchor do not prevent clearing others. * so that failures on one anchor do not prevent clearing others.
*/ */
opts |= PF_OPT_IGNFAIL; opts |= PF_OPT_IGNFAIL;
if ((opts & PF_OPT_CALLSHOW) == 0)
printf("Removing:\n"); printf("Removing:\n");
SLIST_FOREACH_SAFE(pfra, anchors, pfra_sle, pfra_save) { SLIST_FOREACH_SAFE(pfra, anchors, pfra_sle, pfra_save) {
if ((opts & PF_OPT_CALLSHOW) == 0)
printf(" %s\n", (*pfra->pfra_anchorname == '\0') ? printf(" %s\n", (*pfra->pfra_anchorname == '\0') ?
"/" : pfra->pfra_anchorname); "/" : pfra->pfra_anchorname);
rv |= walkf(dev, opts, pfra); rv |= walkf(dev, opts, pfra);
@ -2747,6 +2757,11 @@ main(int argc, char *argv[])
pfctl_show_fingerprints(opts); pfctl_show_fingerprints(opts);
break; break;
case 'T': case 'T':
if (opts & PF_OPT_RECURSE) {
opts |= PF_OPT_CALLSHOW;
pfctl_recurse(dev, opts, anchorname,
pfctl_call_showtables);
} else
pfctl_show_tables(anchorname, opts); pfctl_show_tables(anchorname, opts);
break; break;
case 'o': case 'o':

View file

@ -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 * Copyright (c) 2001 Daniel Hartmeier
@ -52,6 +52,7 @@
#define PF_OPT_RECURSE 0x04000 #define PF_OPT_RECURSE 0x04000
#define PF_OPT_PORTNAMES 0x08000 #define PF_OPT_PORTNAMES 0x08000
#define PF_OPT_IGNFAIL 0x10000 #define PF_OPT_IGNFAIL 0x10000
#define PF_OPT_CALLSHOW 0x20000
#define PF_TH_ALL 0xFF #define PF_TH_ALL 0xFF

View file

@ -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 * 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)) if (!debug && !(ta->pfrt_flags & PFR_TFLAG_ACTIVE))
return; return;
if (verbose) { if (verbose)
printf("%c%c%c%c%c%c%c\t%s", printf("%c%c%c%c%c%c%c\t",
(ta->pfrt_flags & PFR_TFLAG_CONST) ? 'c' : '-', (ta->pfrt_flags & PFR_TFLAG_CONST) ? 'c' : '-',
(ta->pfrt_flags & PFR_TFLAG_PERSIST) ? 'p' : '-', (ta->pfrt_flags & PFR_TFLAG_PERSIST) ? 'p' : '-',
(ta->pfrt_flags & PFR_TFLAG_ACTIVE) ? 'a' : '-', (ta->pfrt_flags & PFR_TFLAG_ACTIVE) ? 'a' : '-',
(ta->pfrt_flags & PFR_TFLAG_INACTIVE) ? 'i' : '-', (ta->pfrt_flags & PFR_TFLAG_INACTIVE) ? 'i' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFERENCED) ? 'r' : '-', (ta->pfrt_flags & PFR_TFLAG_REFERENCED) ? 'r' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFDANCHOR) ? 'h' : '-', (ta->pfrt_flags & PFR_TFLAG_REFDANCHOR) ? 'h' : '-',
(ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-', (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-');
ta->pfrt_name);
if (ta->pfrt_anchor[0]) printf("%s", ta->pfrt_name);
printf("\t%s", ta->pfrt_anchor); if (ta->pfrt_anchor[0] != '\0')
puts(""); printf("@%s", ta->pfrt_anchor);
} else
puts(ta->pfrt_name); printf("\n");
} }
void void

View file

@ -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 <drahn@dalerahn.com> * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
@ -275,6 +275,7 @@ cpu_identify(struct cpu_info *ci)
midr = READ_SPECIALREG(midr_el1); midr = READ_SPECIALREG(midr_el1);
impl = CPU_IMPL(midr); impl = CPU_IMPL(midr);
part = CPU_PART(midr); part = CPU_PART(midr);
ci->ci_midr = midr;
for (i = 0; cpu_implementers[i].name; i++) { for (i = 0; cpu_implementers[i].name; i++) {
if (impl == cpu_implementers[i].id) { if (impl == cpu_implementers[i].id) {
@ -947,13 +948,13 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
} }
cpu_init(); cpu_init();
#ifdef MULTIPROCESSOR
}
#endif
#if NKSTAT > 0 #if NKSTAT > 0
cpu_kstat_attach(ci); cpu_kstat_attach(ci);
#endif #endif
#ifdef MULTIPROCESSOR
}
#endif
opp = OF_getpropint(ci->ci_node, "operating-points-v2", 0); opp = OF_getpropint(ci->ci_node, "operating-points-v2", 0);
if (opp) if (opp)
@ -1204,10 +1205,6 @@ cpu_init_secondary(struct cpu_info *ci)
spllower(IPL_NONE); spllower(IPL_NONE);
#if NKSTAT > 0
cpu_kstat_attach(ci);
#endif
sched_toidle(); sched_toidle();
} }
@ -1862,25 +1859,22 @@ cpu_kstat_attach(struct cpu_info *ci)
{ {
struct kstat *ks; struct kstat *ks;
struct cpu_kstats *ck; struct cpu_kstats *ck;
uint64_t impl, part;
uint64_t midr, impl, part;
const char *impl_name = NULL, *part_name = NULL; const char *impl_name = NULL, *part_name = NULL;
const struct cpu_cores *coreselecter = cpu_cores_none; 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); ks = kstat_create(ci->ci_dev->dv_xname, 0, "mach", 0, KSTAT_T_KV, 0);
if (ks == NULL) { if (ks == NULL) {
printf("%s: unable to create cpu kstats\n", printf("%s: unable to create cpu kstats\n",
ci->ci_dev->dv_xname); ci->ci_dev->dv_xname);
/* printf? */
return; return;
} }
ck = malloc(sizeof(*ck), M_DEVBUF, M_WAITOK); ck = malloc(sizeof(*ck), M_DEVBUF, M_WAITOK);
midr = READ_SPECIALREG(midr_el1); impl = CPU_IMPL(ci->ci_midr);
impl = CPU_IMPL(midr); part = CPU_PART(ci->ci_midr);
part = CPU_PART(midr);
for (i = 0; cpu_implementers[i].name; i++) { for (i = 0; cpu_implementers[i].name; i++) {
if (impl == cpu_implementers[i].id) { 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); 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)), 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_softc = ci;
ks->ks_data = ck; ks->ks_data = ck;

View file

@ -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 <kettenis@openbsd.org> * Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
* Copyright (c) 2013-2014 joshua stein <jcs@openbsd.org> * Copyright (c) 2013-2014 joshua stein <jcs@openbsd.org>
@ -62,6 +62,16 @@
#define APLHIDEV_SET_MODE 0x0252 #define APLHIDEV_SET_MODE 0x0252
#define APLHIDEV_MODE_HID 0x00 #define APLHIDEV_MODE_HID 0x00
#define APLHIDEV_MODE_RAW 0x01 #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 { struct aplhidev_attach_args {
uint8_t aa_reportid; uint8_t aa_reportid;
@ -144,6 +154,14 @@ struct aplhidev_softc {
struct device *sc_ms; struct device *sc_ms;
uint8_t sc_tpdesc[APLHIDEV_DESC_MAX]; uint8_t sc_tpdesc[APLHIDEV_DESC_MAX];
size_t sc_tpdesclen; 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 *); 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_get_descriptor(struct aplhidev_softc *, uint8_t);
void aplhidev_set_leds(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_set_mode(struct aplhidev_softc *, uint8_t);
void aplhidev_get_dimensions(struct aplhidev_softc *);
int aplhidev_intr(void *); int aplhidev_intr(void *);
void aplkbd_intr(struct device *, uint8_t *, size_t); 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 aplhidev_softc *sc = (struct aplhidev_softc *)self;
struct spi_attach_args *sa = aux; struct spi_attach_args *sa = aux;
struct aplhidev_attach_args aa; struct aplhidev_attach_args aa;
struct aplhidev_dim dim;
int retry; int retry;
sc->sc_spi_tag = sa->sa_tag; sc->sc_spi_tag = sa->sa_tag;
@ -248,8 +268,26 @@ aplhidev_attach(struct device *parent, struct device *self, void *aux)
break; break;
} }
aplhidev_get_dimensions(sc);
for (retry = 10; retry > 0; retry--) {
aplhidev_intr(sc);
delay(1000);
if (sc->sc_dimdesclen > 0)
break;
}
printf("\n"); 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) { if (sc->sc_kbddesclen > 0) {
aa.aa_reportid = APLHIDEV_KBD_DEVICE; aa.aa_reportid = APLHIDEV_KBD_DEVICE;
aa.aa_desc = sc->sc_kbddesc; aa.aa_desc = sc->sc_kbddesc;
@ -406,6 +444,39 @@ aplhidev_set_mode(struct aplhidev_softc *sc, uint8_t mode)
delay(1000); 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 int
aplhidev_intr(void *arg) aplhidev_intr(void *arg)
{ {
@ -476,6 +547,13 @@ aplhidev_intr(void *arg)
sc->sc_mode = APLHIDEV_MODE_RAW; sc->sc_mode = APLHIDEV_MODE_RAW;
return 1; 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. */ /* Valid, but unrecognized packet; ignore for now. */
return 1; return 1;
@ -689,6 +767,7 @@ static struct wsmouse_param aplms_wsmousecfg[] = {
struct aplms_softc { struct aplms_softc {
struct device sc_dev; struct device sc_dev;
struct aplhidev_softc *sc_hidev;
struct device *sc_wsmousedev; struct device *sc_wsmousedev;
int sc_enabled; int sc_enabled;
@ -738,6 +817,8 @@ aplms_attach(struct device *parent, struct device *self, void *aux)
struct aplms_softc *sc = (struct aplms_softc *)self; struct aplms_softc *sc = (struct aplms_softc *)self;
struct wsmousedev_attach_args aa; struct wsmousedev_attach_args aa;
sc->sc_hidev = (struct aplhidev_softc *)parent;
printf("\n"); printf("\n");
sc->tp_offset = UBCMTP_TYPE4_TPOFF; 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); struct wsmousehw *hw = wsmouse_get_hw(sc->sc_wsmousedev);
/* The values below are for the MacBookPro17,1 */
hw->type = WSMOUSE_TYPE_TOUCHPAD; hw->type = WSMOUSE_TYPE_TOUCHPAD;
hw->hw_type = WSMOUSEHW_CLICKPAD; hw->hw_type = WSMOUSEHW_CLICKPAD;
hw->x_min = -6046; hw->x_min = sc->sc_hidev->sc_x_min;
hw->x_max = 6536; hw->x_max = sc->sc_hidev->sc_x_max;
hw->y_min = -164; hw->y_min = sc->sc_hidev->sc_y_min;
hw->y_max = 7439; 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->mt_slots = UBCMTP_MAX_FINGERS;
hw->flags = WSMOUSEHW_MT_TRACKING; 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->miny = hw->y_min;
wsmc->maxy = hw->y_max; wsmc->maxy = hw->y_max;
wsmc->swapxy = 0; wsmc->swapxy = 0;
wsmc->resx = 0; wsmc->resx = hw->h_res;
wsmc->resy = 0; wsmc->resy = hw->v_res;
break; break;
case WSMOUSEIO_SETMODE: case WSMOUSEIO_SETMODE:

View file

@ -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 <kettenis@openbsd.org> * Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
* *
@ -19,6 +19,7 @@
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/device.h> #include <sys/device.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/task.h>
#include <machine/bus.h> #include <machine/bus.h>
#include <machine/fdt.h> #include <machine/fdt.h>
@ -107,9 +108,21 @@ struct rtkit_state {
struct rtkit *rk; struct rtkit *rk;
int flags; int flags;
char *crashlog; char *crashlog;
bus_addr_t crashlog_addr;
bus_size_t crashlog_size;
struct task crashlog_task;
char *ioreport; char *ioreport;
bus_addr_t ioreport_addr;
bus_size_t ioreport_size;
struct task ioreport_task;
char *oslog; char *oslog;
bus_addr_t oslog_addr;
bus_size_t oslog_size;
struct task oslog_task;
char *syslog; char *syslog;
bus_addr_t syslog_addr;
bus_size_t syslog_size;
struct task syslog_task;
uint8_t syslog_n_entries; uint8_t syslog_n_entries;
uint8_t syslog_msg_size; uint8_t syslog_msg_size;
char *syslog_msg; char *syslog_msg;
@ -239,9 +252,11 @@ rtkit_handle_mgmt(struct rtkit_state *state, struct aplmbox_msg *msg)
break; break;
case RTKIT_MGMT_IOP_PWR_STATE_ACK: case RTKIT_MGMT_IOP_PWR_STATE_ACK:
state->iop_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0); state->iop_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0);
wakeup(&state->iop_pwrstate);
break; break;
case RTKIT_MGMT_AP_PWR_STATE: case RTKIT_MGMT_AP_PWR_STATE:
state->ap_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0); state->ap_pwrstate = RTKIT_MGMT_PWR_STATE(msg->data0);
wakeup(&state->ap_pwrstate);
break; break;
case RTKIT_MGMT_EPMAP: case RTKIT_MGMT_EPMAP:
base = RTKIT_MGMT_EPMAP_BASE(msg->data0); 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 int
rtkit_handle_crashlog(struct rtkit_state *state, struct aplmbox_msg *msg) 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_addr_t addr;
bus_size_t size; bus_size_t size;
int error;
switch (RTKIT_MGMT_TYPE(msg->data0)) { switch (RTKIT_MGMT_TYPE(msg->data0)) {
case RTKIT_BUFFER_REQUEST: case RTKIT_BUFFER_REQUEST:
@ -467,40 +522,12 @@ rtkit_handle_crashlog(struct rtkit_state *state, struct aplmbox_msg *msg)
break; break;
} }
if (addr) { state->crashlog_addr = addr;
paddr_t pa = addr; state->crashlog_size = size;
vaddr_t va; if (cold)
rtkit_handle_crashlog_buffer(state);
if (rk && rk->rk_logmap) { else
pa = rk->rk_logmap(rk->rk_cookie, addr); task_add(systq, &state->crashlog_task);
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;
break; break;
default: default:
printf("%s: unhandled crashlog event 0x%016llx\n", 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) if ((state->flags & RK_SYSLOG) == 0)
return; return;
if (state->syslog_msg == NULL)
return;
idx = RTKIT_SYSLOG_LOG_IDX(msg->data0); idx = RTKIT_SYSLOG_LOG_IDX(msg->data0);
if (idx > state->syslog_n_entries) if (idx > state->syslog_n_entries)
return; 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); 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 int
rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg)
{ {
struct mbox_channel *mc = state->mc; struct mbox_channel *mc = state->mc;
struct rtkit *rk = state->rk;
bus_addr_t addr; bus_addr_t addr;
bus_size_t size; bus_size_t size;
int error; int error;
@ -563,17 +611,12 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg)
if (addr) if (addr)
break; break;
if (rk) { state->syslog_addr = addr;
addr = rtkit_alloc(state, size << PAGE_SHIFT, state->syslog_size = size;
&state->syslog); if (cold)
if (addr == (bus_addr_t)-1) rtkit_handle_syslog_buffer(state);
return ENOMEM; else
} task_add(systq, &state->syslog_task);
error = rtkit_send(mc, RTKIT_EP_SYSLOG, RTKIT_BUFFER_REQUEST,
(size << RTKIT_BUFFER_SIZE_SHIFT) | addr);
if (error)
return error;
break; break;
case RTKIT_SYSLOG_INIT: case RTKIT_SYSLOG_INIT:
state->syslog_n_entries = state->syslog_n_entries =
@ -581,7 +624,7 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg)
state->syslog_msg_size = state->syslog_msg_size =
RTKIT_SYSLOG_INIT_MSG_SIZE(msg->data0); RTKIT_SYSLOG_INIT_MSG_SIZE(msg->data0);
state->syslog_msg = malloc(state->syslog_msg_size, state->syslog_msg = malloc(state->syslog_msg_size,
M_DEVBUF, M_WAITOK); M_DEVBUF, M_NOWAIT);
break; break;
case RTKIT_SYSLOG_LOG: case RTKIT_SYSLOG_LOG:
rtkit_handle_syslog_log(state, msg); rtkit_handle_syslog_log(state, msg);
@ -599,11 +642,30 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg)
return 0; 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 int
rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg)
{ {
struct mbox_channel *mc = state->mc; struct mbox_channel *mc = state->mc;
struct rtkit *rk = state->rk;
bus_addr_t addr; bus_addr_t addr;
bus_size_t size; bus_size_t size;
int error; int error;
@ -615,17 +677,12 @@ rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg)
if (addr) if (addr)
break; break;
if (rk) { state->ioreport_addr = addr;
addr = rtkit_alloc(state, size << PAGE_SHIFT, state->ioreport_size = size;
&state->ioreport); if (cold)
if (addr == (bus_addr_t)-1) rtkit_handle_ioreport_buffer(state);
return ENOMEM; else
} task_add(systq, &state->ioreport_task);
error = rtkit_send(mc, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST,
(size << RTKIT_BUFFER_SIZE_SHIFT) | addr);
if (error)
return error;
break; break;
case RTKIT_IOREPORT_UNKNOWN1: case RTKIT_IOREPORT_UNKNOWN1:
case RTKIT_IOREPORT_UNKNOWN2: case RTKIT_IOREPORT_UNKNOWN2:
@ -644,14 +701,31 @@ rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg)
return 0; 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 int
rtkit_handle_oslog(struct rtkit_state *state, struct aplmbox_msg *msg) 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_addr_t addr;
bus_size_t size; bus_size_t size;
int error;
switch (RTKIT_OSLOG_TYPE(msg->data0)) { switch (RTKIT_OSLOG_TYPE(msg->data0)) {
case RTKIT_OSLOG_BUFFER_REQUEST: case RTKIT_OSLOG_BUFFER_REQUEST:
@ -660,18 +734,12 @@ rtkit_handle_oslog(struct rtkit_state *state, struct aplmbox_msg *msg)
if (addr) if (addr)
break; break;
if (rk) { state->oslog_addr = addr;
addr = rtkit_alloc(state, size, &state->oslog); state->oslog_size = size;
if (addr == (bus_addr_t)-1) if (cold)
return ENOMEM; rtkit_handle_oslog_buffer(state);
} else
task_add(systq, &state->oslog_task);
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;
break; break;
case RTKIT_OSLOG_UNKNOWN1: case RTKIT_OSLOG_UNKNOWN1:
case RTKIT_OSLOG_UNKNOWN2: 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->iop_pwrstate = RTKIT_MGMT_PWR_STATE_SLEEP;
state->ap_pwrstate = RTKIT_MGMT_PWR_STATE_QUIESCED; 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; return state;
} }
@ -834,6 +907,7 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
if (error) if (error)
return error; return error;
if (cold) {
for (timo = 0; timo < 100000; timo++) { for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state); error = rtkit_poll(state);
if (error == EWOULDBLOCK) { if (error == EWOULDBLOCK) {
@ -844,10 +918,18 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
return error; return error;
if (state->ap_pwrstate == pwrstate) if (state->ap_pwrstate == pwrstate)
break; return 0;
}
} }
while (state->ap_pwrstate != pwrstate) {
error = tsleep_nsec(&state->ap_pwrstate, PWAIT, "appwr",
SEC_TO_NSEC(1));
if (error)
return error; return error;
}
return 0;
} }
int int
@ -856,7 +938,7 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
struct mbox_channel *mc = state->mc; struct mbox_channel *mc = state->mc;
int error, timo; int error, timo;
if (state->iop_pwrstate == pwrstate) if (state->iop_pwrstate == (pwrstate & 0xff))
return 0; return 0;
error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE, error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
@ -864,6 +946,7 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
if (error) if (error)
return error; return error;
if (cold) {
for (timo = 0; timo < 100000; timo++) { for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state); error = rtkit_poll(state);
if (error == EWOULDBLOCK) { if (error == EWOULDBLOCK) {
@ -874,10 +957,18 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
return error; return error;
if (state->iop_pwrstate == (pwrstate & 0xff)) if (state->iop_pwrstate == (pwrstate & 0xff))
break; return 0;
}
} }
while (state->iop_pwrstate != (pwrstate & 0xff)) {
error = tsleep_nsec(&state->iop_pwrstate, PWAIT, "ioppwr",
SEC_TO_NSEC(1));
if (error)
return error; return error;
}
return 0;
} }
int int

View file

@ -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 <drahn@dalerahn.com> * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
* *
@ -116,6 +116,7 @@ struct cpu_info {
u_int32_t ci_cpuid; u_int32_t ci_cpuid;
uint64_t ci_mpidr; uint64_t ci_mpidr;
uint64_t ci_midr;
u_int ci_acpi_proc_id; u_int ci_acpi_proc_id;
int ci_node; int ci_node;
struct cpu_info *ci_self; struct cpu_info *ci_self;

View file

@ -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 $ */ /* $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; struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc;
int old = 0; 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, old = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
VIRTIO_MMIO_STATUS); VIRTIO_MMIO_STATUS);
bus_space_write_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); status|old);
}
} }
int int

View file

@ -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. * Broadcom NetXtreme-C/E network driver.
* *
@ -92,7 +92,7 @@
#define BNXT_CP_PAGES 4 #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_TX_SLOTS(bs) (bs->bs_map->dm_nsegs + 1)
#define BNXT_HWRM_SHORT_REQ_LEN sizeof(struct hwrm_short_input) #define BNXT_HWRM_SHORT_REQ_LEN sizeof(struct hwrm_short_input)
@ -1395,8 +1395,9 @@ bnxt_start(struct ifqueue *ifq)
else else
txflags = TX_BD_LONG_FLAGS_LHINT_GTE2K; txflags = TX_BD_LONG_FLAGS_LHINT_GTE2K;
txflags |= TX_BD_LONG_TYPE_TX_BD_LONG | txflags |= TX_BD_LONG_TYPE_TX_BD_LONG |
TX_BD_LONG_FLAGS_NO_CMPL | TX_BD_LONG_FLAGS_NO_CMPL;
(BNXT_TX_SLOTS(bs) << TX_BD_LONG_FLAGS_BD_CNT_SFT); txflags |= (BNXT_TX_SLOTS(bs) << TX_BD_LONG_FLAGS_BD_CNT_SFT) &
TX_BD_LONG_FLAGS_BD_CNT_MASK;
if (map->dm_nsegs == 1) if (map->dm_nsegs == 1)
txflags |= TX_BD_SHORT_FLAGS_PACKET_END; txflags |= TX_BD_SHORT_FLAGS_PACKET_END;
txring[idx].flags_type = htole16(txflags); txring[idx].flags_type = htole16(txflags);

View file

@ -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 $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */
/* /*
@ -282,16 +282,30 @@ virtio_pci_set_status(struct virtio_softc *vsc, int status)
int old = 0; int old = 0;
if (sc->sc_sc.sc_version_1) { 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); old = CREAD(sc, device_status);
CWRITE(sc, device_status, status|old); CWRITE(sc, device_status, status|old);
}
} else {
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 { } else {
if (status != 0)
old = bus_space_read_1(sc->sc_iot, sc->sc_ioh, old = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS); VIRTIO_CONFIG_DEVICE_STATUS);
bus_space_write_1(sc->sc_iot, sc->sc_ioh, bus_space_write_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS, status|old); VIRTIO_CONFIG_DEVICE_STATUS, status|old);
} }
}
} }
int int

View file

@ -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 <drahn@openbsd.org> * Copyright (c) 2003 Dale Rahn <drahn@openbsd.org>
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@ -220,8 +220,8 @@ clockintr_dispatch(void *frame)
mtx_enter(&cq->cq_mtx); mtx_enter(&cq->cq_mtx);
cq->cq_running = NULL; cq->cq_running = NULL;
if (ISSET(cl->cl_flags, CLST_IGNORE_REQUEST)) { if (ISSET(cq->cq_flags, CQ_IGNORE_REQUEST)) {
CLR(cl->cl_flags, CLST_IGNORE_REQUEST); CLR(cq->cq_flags, CQ_IGNORE_REQUEST);
CLR(request->cr_flags, CR_RESCHEDULE); CLR(request->cr_flags, CR_RESCHEDULE);
} }
if (ISSET(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) if (cl == cq->cq_running)
SET(cl->cl_flags, CLST_IGNORE_REQUEST); SET(cq->cq_flags, CQ_IGNORE_REQUEST);
mtx_leave(&cq->cq_mtx); mtx_leave(&cq->cq_mtx);
} }
@ -384,7 +384,7 @@ clockintr_schedule_locked(struct clockintr *cl, uint64_t expiration)
} }
} }
if (cl == cq->cq_running) if (cl == cq->cq_running)
SET(cl->cl_flags, CLST_IGNORE_REQUEST); SET(cq->cq_flags, CQ_IGNORE_REQUEST);
} }
void void

View file

@ -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 $ */ /* $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 */ /* main thread gotta wait because it has the pid, et al */
while (pr->ps_threadcnt > 1) while (pr->ps_threadcnt > 1)
tsleep_nsec(&pr->ps_threads, PWAIT, "thrdeath", INFSLP); tsleep_nsec(&pr->ps_threads, PWAIT, "thrdeath", INFSLP);
LIST_REMOVE(pr, ps_list);
refcnt_finalize(&pr->ps_refcnt, "psdtor");
} }
rup = pr->ps_ru; 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) { if ((p->p_flag & P_THREAD) == 0) {
LIST_REMOVE(pr, ps_hash); LIST_REMOVE(pr, ps_hash);
LIST_REMOVE(pr, ps_list);
if ((pr->ps_flags & PS_NOZOMBIE) == 0) if ((pr->ps_flags & PS_NOZOMBIE) == 0)
LIST_INSERT_HEAD(&zombprocess, pr, ps_list); LIST_INSERT_HEAD(&zombprocess, pr, ps_list);

View file

@ -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 $ */ /* $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); LIST_INIT(&pr->ps_sigiolst);
TAILQ_INIT(&pr->ps_tslpqueue); TAILQ_INIT(&pr->ps_tslpqueue);
refcnt_init(&pr->ps_refcnt);
rw_init(&pr->ps_lock, "pslock"); rw_init(&pr->ps_lock, "pslock");
mtx_init(&pr->ps_mtx, IPL_HIGH); mtx_init(&pr->ps_mtx, IPL_HIGH);

View file

@ -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 $ */ /* $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); 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 * Locate a process group by number
*/ */

View file

@ -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 $ */ /* $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; break;
} }
matched = 0; matched = 0;
LIST_FOREACH(pr, &allprocess, ps_list) { for (pr = priterator(NULL); pr != NULL; pr = priterator(pr)) {
/* /*
* skip system, exiting, embryonic and undead * skip system, exiting, embryonic and undead
* processes * processes
@ -1566,7 +1566,7 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep,
error = ESRCH; error = ESRCH;
break; break;
case KERN_FILE_BYUID: 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 * skip system, exiting, embryonic and undead
* processes * processes

View file

@ -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 <cheloha@openbsd.org> * Copyright (c) 2020-2022 Scott Cheloha <cheloha@openbsd.org>
* *
@ -68,7 +68,6 @@ struct clockintr {
}; };
#define CLST_PENDING 0x00000001 /* scheduled to run */ #define CLST_PENDING 0x00000001 /* scheduled to run */
#define CLST_IGNORE_REQUEST 0x00000002 /* ignore callback requests */
/* /*
* Interface for callback rescheduling requests. * Interface for callback rescheduling requests.
@ -108,12 +107,13 @@ struct clockintr_queue {
struct clockintr_stat cq_stat; /* [o] dispatch statistics */ struct clockintr_stat cq_stat; /* [o] dispatch statistics */
volatile uint32_t cq_gen; /* [o] cq_stat update generation */ volatile uint32_t cq_gen; /* [o] cq_stat update generation */
volatile uint32_t cq_dispatch; /* [o] dispatch is running */ 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_INIT 0x00000001 /* clockintr_cpu_init() done */
#define CQ_INTRCLOCK 0x00000002 /* intrclock installed */ #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 *); void clockintr_cpu_init(const struct intrclock *);
int clockintr_dispatch(void *); int clockintr_dispatch(void *);

View file

@ -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 $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */
/*- /*-
@ -50,6 +50,7 @@
#include <sys/resource.h> /* For struct rusage */ #include <sys/resource.h> /* For struct rusage */
#include <sys/rwlock.h> /* For struct rwlock */ #include <sys/rwlock.h> /* For struct rwlock */
#include <sys/sigio.h> /* For struct sigio */ #include <sys/sigio.h> /* For struct sigio */
#include <sys/refcnt.h>
#ifdef _KERNEL #ifdef _KERNEL
#include <sys/atomic.h> #include <sys/atomic.h>
@ -164,6 +165,7 @@ struct process {
struct futex_list ps_ftlist; /* futexes attached to this process */ struct futex_list ps_ftlist; /* futexes attached to this process */
struct tslpqueue ps_tslpqueue; /* [p] queue of threads in thrsleep */ struct tslpqueue ps_tslpqueue; /* [p] queue of threads in thrsleep */
struct refcnt ps_refcnt;
struct rwlock ps_lock; /* per-process rwlock */ struct rwlock ps_lock; /* per-process rwlock */
struct mutex ps_mtx; /* per-process mutex */ 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 *prfind(pid_t); /* Find process by id. */
struct process *zombiefind(pid_t); /* Find zombie 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 proc *tfind(pid_t); /* Find thread by id. */
struct pgrp *pgfind(pid_t); /* Find process group by id. */ struct pgrp *pgfind(pid_t); /* Find process group by id. */
struct proc *tfind_user(pid_t, struct process *); struct proc *tfind_user(pid_t, struct process *);

View file

@ -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 <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -56,7 +56,7 @@ void rde_update_withdraw(struct rde_peer *, uint32_t,
struct bgpd_addr *, uint8_t); struct bgpd_addr *, uint8_t);
int rde_attr_parse(u_char *, uint16_t, struct rde_peer *, int rde_attr_parse(u_char *, uint16_t, struct rde_peer *,
struct filterstate *, struct mpattr *); 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); uint8_t rde_attr_missing(struct rde_aspath *, int, uint16_t);
int rde_get_mp_nexthop(u_char *, uint16_t, uint8_t, int rde_get_mp_nexthop(u_char *, uint16_t, uint8_t,
struct rde_peer *, struct filterstate *); struct rde_peer *, struct filterstate *);
@ -364,21 +364,22 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
{ {
static struct flowspec *curflow; static struct flowspec *curflow;
struct imsg imsg; struct imsg imsg;
struct ibuf ibuf;
struct rde_peer_stats stats; struct rde_peer_stats stats;
struct ctl_show_set cset; struct ctl_show_set cset;
struct ctl_show_rib csr; struct ctl_show_rib csr;
struct ctl_show_rib_request req; struct ctl_show_rib_request req;
struct session_up sup; struct session_up sup;
struct peer_config pconf;
struct rde_peer *peer; struct rde_peer *peer;
struct rde_aspath *asp; struct rde_aspath *asp;
struct filter_set *s; struct filter_set *s;
struct as_set *aset; struct as_set *aset;
struct rde_prefixset *pset; struct rde_prefixset *pset;
uint8_t *asdata;
ssize_t n; ssize_t n;
size_t aslen; uint32_t peerid;
pid_t pid;
int verbose; int verbose;
uint16_t len;
uint8_t aid; uint8_t aid;
while (imsgbuf) { while (imsgbuf) {
@ -387,43 +388,43 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
if (n == 0) if (n == 0)
break; 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_UPDATE:
case IMSG_REFRESH: 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", log_warnx("rde_dispatch: unknown peer id %d",
imsg.hdr.peerid); peerid);
break; break;
} }
peer_imsg_push(peer, &imsg); peer_imsg_push(peer, &imsg);
break; break;
case IMSG_SESSION_ADD: case IMSG_SESSION_ADD:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &pconf, sizeof(pconf)) == -1)
sizeof(struct peer_config))
fatalx("incorrect size of session request"); 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. */ /* make sure rde_eval_all is on if needed. */
if (peer->conf.flags & PEERFLAG_EVALUATE_ALL) if (peer->conf.flags & PEERFLAG_EVALUATE_ALL)
rde_eval_all = 1; rde_eval_all = 1;
break; break;
case IMSG_SESSION_UP: 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", log_warnx("%s: unknown peer id %d",
"IMSG_SESSION_UP", imsg.hdr.peerid); "IMSG_SESSION_UP", peerid);
break; 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"); fatalx("incorrect size of session request");
memcpy(&sup, imsg.data, sizeof(sup));
peer_up(peer, &sup); peer_up(peer, &sup);
/* make sure rde_eval_all is on if needed. */ /* make sure rde_eval_all is on if needed. */
if (peer_has_add_path(peer, AID_UNSPEC, CAPA_AP_SEND)) if (peer_has_add_path(peer, AID_UNSPEC, CAPA_AP_SEND))
rde_eval_all = 1; rde_eval_all = 1;
break; break;
case IMSG_SESSION_DOWN: 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", log_warnx("%s: unknown peer id %d",
"IMSG_SESSION_DOWN", imsg.hdr.peerid); "IMSG_SESSION_DOWN", peerid);
break; break;
} }
peer_down(peer, NULL); peer_down(peer, NULL);
@ -432,26 +433,25 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
case IMSG_SESSION_NOGRACE: case IMSG_SESSION_NOGRACE:
case IMSG_SESSION_FLUSH: case IMSG_SESSION_FLUSH:
case IMSG_SESSION_RESTARTED: 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", log_warnx("%s: unknown peer id %d",
"graceful restart", imsg.hdr.peerid); "graceful restart", peerid);
break; 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__); log_warnx("%s: wrong imsg len", __func__);
break; break;
} }
memcpy(&aid, imsg.data, sizeof(aid));
if (aid >= AID_MAX) { if (aid >= AID_MAX) {
log_warnx("%s: bad AID", __func__); log_warnx("%s: bad AID", __func__);
break; break;
} }
switch (imsg.hdr.type) { switch (imsg_get_type(&imsg)) {
case IMSG_SESSION_STALE: case IMSG_SESSION_STALE:
case IMSG_SESSION_NOGRACE: case IMSG_SESSION_NOGRACE:
peer_stale(peer, aid, peer_stale(peer, aid,
imsg.hdr.type == IMSG_SESSION_NOGRACE); imsg_get_type(&imsg) == IMSG_SESSION_NOGRACE);
break; break;
case IMSG_SESSION_FLUSH: case IMSG_SESSION_FLUSH:
peer_flush(peer, aid, peer->staletime[aid]); peer_flush(peer, aid, peer->staletime[aid]);
@ -464,12 +464,11 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_NETWORK_ADD: case IMSG_NETWORK_ADD:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &netconf_s,
sizeof(struct network_config)) { sizeof(netconf_s)) == -1) {
log_warnx("rde_dispatch: wrong imsg len"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&netconf_s, imsg.data, sizeof(netconf_s));
TAILQ_INIT(&netconf_s.attrset); TAILQ_INIT(&netconf_s.attrset);
rde_filterstate_init(&netconf_state); rde_filterstate_init(&netconf_state);
asp = &netconf_state.aspath; asp = &netconf_state.aspath;
@ -480,16 +479,16 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
F_ANN_DYNAMIC; F_ANN_DYNAMIC;
break; break;
case IMSG_NETWORK_ASPATH: case IMSG_NETWORK_ASPATH:
if (imsg.hdr.len - IMSG_HEADER_SIZE < if (imsg_get_ibuf(&imsg, &ibuf) == -1) {
sizeof(csr)) { 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"); log_warnx("rde_dispatch: wrong imsg len");
memset(&netconf_s, 0, sizeof(netconf_s)); memset(&netconf_s, 0, sizeof(netconf_s));
break; 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 = &netconf_state.aspath;
asp->lpref = csr.local_pref; asp->lpref = csr.local_pref;
asp->med = csr.med; asp->med = csr.med;
@ -498,17 +497,13 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
asp->origin = csr.origin; asp->origin = csr.origin;
asp->flags |= F_PREFIX_ANNOUNCED | F_ANN_DYNAMIC; asp->flags |= F_PREFIX_ANNOUNCED | F_ANN_DYNAMIC;
aspath_put(asp->aspath); aspath_put(asp->aspath);
asp->aspath = aspath_get(asdata, aslen); asp->aspath = aspath_get(ibuf_data(&ibuf),
ibuf_size(&ibuf));
break; break;
case IMSG_NETWORK_ATTR: case IMSG_NETWORK_ATTR:
if (imsg.hdr.len <= IMSG_HEADER_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
break;
}
/* parse optional path attributes */ /* parse optional path attributes */
len = imsg.hdr.len - IMSG_HEADER_SIZE; if (imsg_get_ibuf(&imsg, &ibuf) == -1 ||
if (rde_attr_add(&netconf_state, imsg.data, rde_attr_add(&netconf_state, &ibuf) == -1) {
len) == -1) {
log_warnx("rde_dispatch: bad network " log_warnx("rde_dispatch: bad network "
"attribute"); "attribute");
rde_filterstate_clean(&netconf_state); rde_filterstate_clean(&netconf_state);
@ -517,10 +512,6 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_NETWORK_DONE: 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); TAILQ_CONCAT(&netconf_s.attrset, &session_set, entry);
switch (netconf_s.prefix.aid) { switch (netconf_s.prefix.aid) {
case AID_INET: case AID_INET:
@ -544,12 +535,11 @@ badnet:
rde_filterstate_clean(&netconf_state); rde_filterstate_clean(&netconf_state);
break; break;
case IMSG_NETWORK_REMOVE: case IMSG_NETWORK_REMOVE:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &netconf_s,
sizeof(struct network_config)) { sizeof(netconf_s)) == -1) {
log_warnx("rde_dispatch: wrong imsg len"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&netconf_s, imsg.data, sizeof(netconf_s));
TAILQ_INIT(&netconf_s.attrset); TAILQ_INIT(&netconf_s.attrset);
switch (netconf_s.prefix.aid) { switch (netconf_s.prefix.aid) {
@ -570,32 +560,27 @@ badnetdel:
} }
break; break;
case IMSG_NETWORK_FLUSH: 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, if (rib_dump_new(RIB_ADJ_IN, AID_UNSPEC,
RDE_RUNNER_ROUNDS, NULL, network_flush_upcall, RDE_RUNNER_ROUNDS, NULL, network_flush_upcall,
NULL, NULL) == -1) NULL, NULL) == -1)
log_warn("rde_dispatch: IMSG_NETWORK_FLUSH"); log_warn("rde_dispatch: IMSG_NETWORK_FLUSH");
break; break;
case IMSG_FLOWSPEC_ADD: case IMSG_FLOWSPEC_ADD:
if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
break;
}
if (curflow != NULL) { if (curflow != NULL) {
log_warnx("rde_dispatch: " log_warnx("rde_dispatch: "
"unexpected flowspec add"); "unexpected flowspec add");
break; 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) if (curflow == NULL)
fatal(NULL); fatal(NULL);
memcpy(curflow, imsg.data, memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf));
imsg.hdr.len - IMSG_HEADER_SIZE); if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) {
if (curflow->len + FLOWSPEC_SIZE !=
imsg.hdr.len - IMSG_HEADER_SIZE) {
free(curflow); free(curflow);
curflow = NULL; curflow = NULL;
log_warnx("rde_dispatch: wrong flowspec len"); log_warnx("rde_dispatch: wrong flowspec len");
@ -630,22 +615,21 @@ badnetdel:
curflow = NULL; curflow = NULL;
break; break;
case IMSG_FLOWSPEC_REMOVE: case IMSG_FLOWSPEC_REMOVE:
if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
break;
}
if (curflow != NULL) { if (curflow != NULL) {
log_warnx("rde_dispatch: " log_warnx("rde_dispatch: "
"unexpected flowspec remove"); "unexpected flowspec remove");
break; 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) if (curflow == NULL)
fatal(NULL); fatal(NULL);
memcpy(curflow, imsg.data, memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf));
imsg.hdr.len - IMSG_HEADER_SIZE); if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) {
if (curflow->len + FLOWSPEC_SIZE !=
imsg.hdr.len - IMSG_HEADER_SIZE) {
free(curflow); free(curflow);
curflow = NULL; curflow = NULL;
log_warnx("rde_dispatch: wrong flowspec len"); log_warnx("rde_dispatch: wrong flowspec len");
@ -663,22 +647,18 @@ badnetdel:
curflow = NULL; curflow = NULL;
break; break;
case IMSG_FLOWSPEC_FLUSH: 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, prefix_flowspec_dump(AID_UNSPEC, NULL,
flowspec_flush_upcall, NULL); flowspec_flush_upcall, NULL);
break; break;
case IMSG_FILTER_SET: 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) if ((s = malloc(sizeof(struct filter_set))) == NULL)
fatal(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) { if (s->type == ACTION_SET_NEXTHOP) {
s->action.nh_ref = s->action.nh_ref =
nexthop_get(&s->action.nexthop); nexthop_get(&s->action.nexthop);
@ -689,39 +669,32 @@ badnetdel:
case IMSG_CTL_SHOW_NETWORK: case IMSG_CTL_SHOW_NETWORK:
case IMSG_CTL_SHOW_RIB: case IMSG_CTL_SHOW_RIB:
case IMSG_CTL_SHOW_RIB_PREFIX: 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"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&req, imsg.data, sizeof(req)); rde_dump_ctx_new(&req, pid, imsg_get_type(&imsg));
rde_dump_ctx_new(&req, imsg.hdr.pid, imsg.hdr.type);
break; break;
case IMSG_CTL_SHOW_FLOWSPEC: 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"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&req, imsg.data, sizeof(req)); prefix_flowspec_dump(req.aid, &pid,
prefix_flowspec_dump(req.aid, &imsg.hdr.pid,
flowspec_dump_upcall, flowspec_dump_done); flowspec_dump_upcall, flowspec_dump_done);
break; break;
case IMSG_CTL_SHOW_NEIGHBOR: case IMSG_CTL_SHOW_NEIGHBOR:
if (imsg.hdr.len - IMSG_HEADER_SIZE != 0) { peer = peer_get(peerid);
log_warnx("rde_dispatch: wrong imsg len");
break;
}
peer = peer_get(imsg.hdr.peerid);
if (peer != NULL) if (peer != NULL)
memcpy(&stats, &peer->stats, sizeof(stats)); memcpy(&stats, &peer->stats, sizeof(stats));
else else
memset(&stats, 0, sizeof(stats)); memset(&stats, 0, sizeof(stats));
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NEIGHBOR, imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NEIGHBOR,
imsg.hdr.peerid, imsg.hdr.pid, -1, peerid, pid, -1, &stats, sizeof(stats));
&stats, sizeof(stats));
break; break;
case IMSG_CTL_SHOW_RIB_MEM: case IMSG_CTL_SHOW_RIB_MEM:
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_RIB_MEM, 0, imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_RIB_MEM, 0,
imsg.hdr.pid, -1, &rdemem, sizeof(rdemem)); pid, -1, &rdemem, sizeof(rdemem));
break; break;
case IMSG_CTL_SHOW_SET: case IMSG_CTL_SHOW_SET:
/* first roa set */ /* first roa set */
@ -733,7 +706,7 @@ badnetdel:
cset.v4_cnt = pset->th.v4_cnt; cset.v4_cnt = pset->th.v4_cnt;
cset.v6_cnt = pset->th.v6_cnt; cset.v6_cnt = pset->th.v6_cnt;
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, 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 */ /* then aspa set */
memset(&cset, 0, sizeof(cset)); memset(&cset, 0, sizeof(cset));
@ -741,7 +714,7 @@ badnetdel:
strlcpy(cset.name, "RPKI ASPA", sizeof(cset.name)); strlcpy(cset.name, "RPKI ASPA", sizeof(cset.name));
aspa_table_stats(rde_aspa, &cset); aspa_table_stats(rde_aspa, &cset);
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, 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) { SIMPLEQ_FOREACH(aset, &conf->as_sets, entry) {
memset(&cset, 0, sizeof(cset)); memset(&cset, 0, sizeof(cset));
@ -751,7 +724,7 @@ badnetdel:
cset.lastchange = aset->lastchange; cset.lastchange = aset->lastchange;
cset.as_cnt = set_nmemb(aset->set); cset.as_cnt = set_nmemb(aset->set);
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, 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) { SIMPLEQ_FOREACH(pset, &conf->rde_prefixsets, entry) {
memset(&cset, 0, sizeof(cset)); memset(&cset, 0, sizeof(cset));
@ -762,7 +735,7 @@ badnetdel:
cset.v4_cnt = pset->th.v4_cnt; cset.v4_cnt = pset->th.v4_cnt;
cset.v6_cnt = pset->th.v6_cnt; cset.v6_cnt = pset->th.v6_cnt;
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, 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) { SIMPLEQ_FOREACH(pset, &conf->rde_originsets, entry) {
memset(&cset, 0, sizeof(cset)); memset(&cset, 0, sizeof(cset));
@ -773,39 +746,43 @@ badnetdel:
cset.v4_cnt = pset->th.v4_cnt; cset.v4_cnt = pset->th.v4_cnt;
cset.v6_cnt = pset->th.v6_cnt; cset.v6_cnt = pset->th.v6_cnt;
imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_SET, 0, 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); -1, NULL, 0);
break; break;
case IMSG_CTL_LOG_VERBOSE: case IMSG_CTL_LOG_VERBOSE:
/* already checked by SE */ /* 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); log_setverbose(verbose);
break; break;
case IMSG_CTL_END: 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); -1, NULL, 0);
break; break;
case IMSG_CTL_TERMINATE: case IMSG_CTL_TERMINATE:
rde_dump_ctx_terminate(imsg.hdr.pid); rde_dump_ctx_terminate(pid);
break; break;
case IMSG_XON: case IMSG_XON:
if (imsg.hdr.peerid) { if (peerid) {
peer = peer_get(imsg.hdr.peerid); peer = peer_get(peerid);
if (peer) if (peer)
peer->throttled = 0; peer->throttled = 0;
} else { } else {
rde_dump_ctx_throttle(imsg.hdr.pid, 0); rde_dump_ctx_throttle(pid, 0);
} }
break; break;
case IMSG_XOFF: case IMSG_XOFF:
if (imsg.hdr.peerid) { if (peerid) {
peer = peer_get(imsg.hdr.peerid); peer = peer_get(peerid);
if (peer) if (peer)
peer->throttled = 1; peer->throttled = 1;
} else { } else {
rde_dump_ctx_throttle(imsg.hdr.pid, 1); rde_dump_ctx_throttle(pid, 1);
} }
break; break;
case IMSG_RECONF_DRAIN: case IMSG_RECONF_DRAIN:
@ -827,10 +804,15 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
static struct l3vpn *vpn; static struct l3vpn *vpn;
static struct flowspec *curflow; static struct flowspec *curflow;
struct imsg imsg; struct imsg imsg;
struct mrt xmrt; struct ibuf ibuf;
struct roa roa; struct bgpd_config tconf;
struct rde_rib rr;
struct filterstate state; 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 imsgbuf *i;
struct filter_head *nr; struct filter_head *nr;
struct filter_rule *r; struct filter_rule *r;
@ -838,8 +820,6 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
struct rib *rib; struct rib *rib;
struct rde_prefixset *ps; struct rde_prefixset *ps;
struct rde_aspath *asp; struct rde_aspath *asp;
struct prefixset_item psi;
char *name;
size_t nmemb; size_t nmemb;
int n, fd, rv; int n, fd, rv;
uint16_t rid; uint16_t rid;
@ -850,7 +830,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
if (n == 0) if (n == 0)
break; break;
switch (imsg.hdr.type) { switch (imsg_get_type(&imsg)) {
case IMSG_SOCKET_CONN: case IMSG_SOCKET_CONN:
case IMSG_SOCKET_CONN_CTL: case IMSG_SOCKET_CONN_CTL:
case IMSG_SOCKET_CONN_RTR: case IMSG_SOCKET_CONN_RTR:
@ -862,7 +842,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
if ((i = malloc(sizeof(struct imsgbuf))) == NULL) if ((i = malloc(sizeof(struct imsgbuf))) == NULL)
fatal(NULL); fatal(NULL);
imsg_init(i, fd); imsg_init(i, fd);
switch (imsg.hdr.type) { switch (imsg_get_type(&imsg)) {
case IMSG_SOCKET_CONN: case IMSG_SOCKET_CONN:
if (ibuf_se) { if (ibuf_se) {
log_warnx("Unexpected imsg connection " log_warnx("Unexpected imsg connection "
@ -893,12 +873,11 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_NETWORK_ADD: case IMSG_NETWORK_ADD:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &netconf_p,
sizeof(struct network_config)) { sizeof(netconf_p)) == -1) {
log_warnx("rde_dispatch: wrong imsg len"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&netconf_p, imsg.data, sizeof(netconf_p));
TAILQ_INIT(&netconf_p.attrset); TAILQ_INIT(&netconf_p.attrset);
break; break;
case IMSG_NETWORK_DONE: case IMSG_NETWORK_DONE:
@ -915,32 +894,30 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
rde_filterstate_clean(&state); rde_filterstate_clean(&state);
break; break;
case IMSG_NETWORK_REMOVE: case IMSG_NETWORK_REMOVE:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &netconf_p,
sizeof(struct network_config)) { sizeof(netconf_p)) == -1) {
log_warnx("rde_dispatch: wrong imsg len"); log_warnx("rde_dispatch: wrong imsg len");
break; break;
} }
memcpy(&netconf_p, imsg.data, sizeof(netconf_p));
TAILQ_INIT(&netconf_p.attrset); TAILQ_INIT(&netconf_p.attrset);
network_delete(&netconf_p); network_delete(&netconf_p);
break; break;
case IMSG_FLOWSPEC_ADD: case IMSG_FLOWSPEC_ADD:
if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
break;
}
if (curflow != NULL) { if (curflow != NULL) {
log_warnx("rde_dispatch: " log_warnx("rde_dispatch: "
"unexpected flowspec add"); "unexpected flowspec add");
break; 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) if (curflow == NULL)
fatal(NULL); fatal(NULL);
memcpy(curflow, imsg.data, memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf));
imsg.hdr.len - IMSG_HEADER_SIZE); if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) {
if (curflow->len + FLOWSPEC_SIZE !=
imsg.hdr.len - IMSG_HEADER_SIZE) {
free(curflow); free(curflow);
curflow = NULL; curflow = NULL;
log_warnx("rde_dispatch: wrong flowspec len"); log_warnx("rde_dispatch: wrong flowspec len");
@ -974,22 +951,21 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
curflow = NULL; curflow = NULL;
break; break;
case IMSG_FLOWSPEC_REMOVE: case IMSG_FLOWSPEC_REMOVE:
if (imsg.hdr.len - IMSG_HEADER_SIZE <= FLOWSPEC_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
break;
}
if (curflow != NULL) { if (curflow != NULL) {
log_warnx("rde_dispatch: " log_warnx("rde_dispatch: "
"unexpected flowspec remove"); "unexpected flowspec remove");
break; 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) if (curflow == NULL)
fatal(NULL); fatal(NULL);
memcpy(curflow, imsg.data, memcpy(curflow, ibuf_data(&ibuf), ibuf_size(&ibuf));
imsg.hdr.len - IMSG_HEADER_SIZE); if (curflow->len + FLOWSPEC_SIZE != ibuf_size(&ibuf)) {
if (curflow->len + FLOWSPEC_SIZE !=
imsg.hdr.len - IMSG_HEADER_SIZE) {
free(curflow); free(curflow);
curflow = NULL; curflow = NULL;
log_warnx("rde_dispatch: wrong flowspec len"); log_warnx("rde_dispatch: wrong flowspec len");
@ -1007,15 +983,14 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
curflow = NULL; curflow = NULL;
break; break;
case IMSG_RECONF_CONF: case IMSG_RECONF_CONF:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &tconf, sizeof(tconf)) == -1)
sizeof(struct bgpd_config))
fatalx("IMSG_RECONF_CONF bad len"); fatalx("IMSG_RECONF_CONF bad len");
out_rules_tmp = calloc(1, sizeof(struct filter_head)); out_rules_tmp = calloc(1, sizeof(struct filter_head));
if (out_rules_tmp == NULL) if (out_rules_tmp == NULL)
fatal(NULL); fatal(NULL);
TAILQ_INIT(out_rules_tmp); TAILQ_INIT(out_rules_tmp);
nconf = new_config(); nconf = new_config();
copy_config(nconf, imsg.data); copy_config(nconf, &tconf);
for (rid = 0; rid < rib_size; rid++) { for (rid = 0; rid < rib_size; rid++) {
if ((rib = rib_byid(rid)) == NULL) if ((rib = rib_byid(rid)) == NULL)
@ -1025,10 +1000,8 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_RECONF_RIB: case IMSG_RECONF_RIB:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &rr, sizeof(rr)) == -1)
sizeof(struct rde_rib))
fatalx("IMSG_RECONF_RIB bad len"); fatalx("IMSG_RECONF_RIB bad len");
memcpy(&rr, imsg.data, sizeof(rr));
rib = rib_byid(rib_find(rr.name)); rib = rib_byid(rib_find(rr.name));
if (rib == NULL) { if (rib == NULL) {
rib = rib_new(rr.name, rr.rtableid, rr.flags); rib = rib_new(rr.name, rr.rtableid, rr.flags);
@ -1044,12 +1017,10 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_RECONF_FILTER: 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) if ((r = malloc(sizeof(struct filter_rule))) == NULL)
fatal(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') { if (r->match.prefixset.name[0] != '\0') {
r->match.prefixset.ps = r->match.prefixset.ps =
rde_find_prefixset(r->match.prefixset.name, rde_find_prefixset(r->match.prefixset.name,
@ -1106,14 +1077,13 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
break; break;
case IMSG_RECONF_PREFIX_SET: case IMSG_RECONF_PREFIX_SET:
case IMSG_RECONF_ORIGIN_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)); ps = calloc(1, sizeof(struct rde_prefixset));
if (ps == NULL) if (ps == NULL)
fatal(NULL); fatal(NULL);
memcpy(ps->name, imsg.data, sizeof(ps->name)); if (imsg_get_data(&imsg, ps->name, sizeof(ps->name)) ==
if (imsg.hdr.type == IMSG_RECONF_ORIGIN_SET) { -1)
fatalx("IMSG_RECONF_PREFIX_SET bad len");
if (imsg_get_type(&imsg) == IMSG_RECONF_ORIGIN_SET) {
SIMPLEQ_INSERT_TAIL(&nconf->rde_originsets, ps, SIMPLEQ_INSERT_TAIL(&nconf->rde_originsets, ps,
entry); entry);
} else { } else {
@ -1123,15 +1093,13 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
last_prefixset = ps; last_prefixset = ps;
break; break;
case IMSG_RECONF_ROA_ITEM: 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"); fatalx("IMSG_RECONF_ROA_ITEM bad len");
memcpy(&roa, imsg.data, sizeof(roa));
rv = trie_roa_add(&last_prefixset->th, &roa); rv = trie_roa_add(&last_prefixset->th, &roa);
break; break;
case IMSG_RECONF_PREFIX_SET_ITEM: 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"); fatalx("IMSG_RECONF_PREFIX_SET_ITEM bad len");
memcpy(&psi, imsg.data, sizeof(psi));
if (last_prefixset == NULL) if (last_prefixset == NULL)
fatalx("King Bula has no prefixset"); fatalx("King Bula has no prefixset");
rv = trie_add(&last_prefixset->th, rv = trie_add(&last_prefixset->th,
@ -1143,20 +1111,21 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
psi.p.len); psi.p.len);
break; break;
case IMSG_RECONF_AS_SET: case IMSG_RECONF_AS_SET:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_ibuf(&imsg, &ibuf) == -1 ||
sizeof(nmemb) + SET_NAME_LEN) ibuf_get(&ibuf, &nmemb, sizeof(nmemb)) == -1 ||
ibuf_get(&ibuf, name, sizeof(name)) == -1)
fatalx("IMSG_RECONF_AS_SET bad len"); 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) if (as_sets_lookup(&nconf->as_sets, name) != NULL)
fatalx("duplicate as-set %s", name); fatalx("duplicate as-set %s", name);
last_as_set = as_sets_new(&nconf->as_sets, name, nmemb, last_as_set = as_sets_new(&nconf->as_sets, name, nmemb,
sizeof(uint32_t)); sizeof(uint32_t));
break; break;
case IMSG_RECONF_AS_SET_ITEMS: case IMSG_RECONF_AS_SET_ITEMS:
nmemb = imsg.hdr.len - IMSG_HEADER_SIZE; if (imsg_get_ibuf(&imsg, &ibuf) == -1)
nmemb /= sizeof(uint32_t); fatalx("IMSG_RECONF_AS_SET_ITEMS bad len");
if (set_add(last_as_set->set, imsg.data, nmemb) != 0) nmemb = ibuf_size(&ibuf) / sizeof(uint32_t);
if (set_add(last_as_set->set, ibuf_data(&ibuf),
nmemb) != 0)
fatal(NULL); fatal(NULL);
break; break;
case IMSG_RECONF_AS_SET_DONE: case IMSG_RECONF_AS_SET_DONE:
@ -1164,12 +1133,10 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
last_as_set = NULL; last_as_set = NULL;
break; break;
case IMSG_RECONF_VPN: case IMSG_RECONF_VPN:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if ((vpn = malloc(sizeof(*vpn))) == NULL)
sizeof(struct l3vpn))
fatalx("IMSG_RECONF_VPN bad len");
if ((vpn = malloc(sizeof(struct l3vpn))) == NULL)
fatal(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->import);
TAILQ_INIT(&vpn->export); TAILQ_INIT(&vpn->export);
TAILQ_INIT(&vpn->net_l); TAILQ_INIT(&vpn->net_l);
@ -1205,15 +1172,15 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
rde_reload_done(); rde_reload_done();
break; break;
case IMSG_NEXTHOP_UPDATE: 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; break;
case IMSG_FILTER_SET: case IMSG_FILTER_SET:
if (imsg.hdr.len > IMSG_HEADER_SIZE + if ((s = malloc(sizeof(*s))) == NULL)
sizeof(struct filter_set))
fatalx("IMSG_FILTER_SET bad len");
if ((s = malloc(sizeof(struct filter_set))) == NULL)
fatal(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) { if (s->type == ACTION_SET_NEXTHOP) {
s->action.nh_ref = s->action.nh_ref =
nexthop_get(&s->action.nexthop); nexthop_get(&s->action.nexthop);
@ -1223,19 +1190,18 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
break; break;
case IMSG_MRT_OPEN: case IMSG_MRT_OPEN:
case IMSG_MRT_REOPEN: case IMSG_MRT_REOPEN:
if (imsg.hdr.len > IMSG_HEADER_SIZE + if (imsg_get_data(&imsg, &xmrt, sizeof(xmrt)) == -1) {
sizeof(struct mrt)) {
log_warnx("wrong imsg len"); log_warnx("wrong imsg len");
break; break;
} }
memcpy(&xmrt, imsg.data, sizeof(xmrt));
if ((fd = imsg_get_fd(&imsg)) == -1) if ((fd = imsg_get_fd(&imsg)) == -1)
log_warnx("expected to receive fd for mrt dump " log_warnx("expected to receive fd for mrt dump "
"but didn't receive any"); "but didn't receive any");
else if (xmrt.type == MRT_TABLE_DUMP || else if (xmrt.type == MRT_TABLE_DUMP ||
xmrt.type == MRT_TABLE_DUMP_MP || xmrt.type == MRT_TABLE_DUMP_MP ||
xmrt.type == MRT_TABLE_DUMP_V2) { 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 } else
close(fd); close(fd);
break; break;
@ -1243,7 +1209,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf)
/* ignore end message because a dump is atomic */ /* ignore end message because a dump is atomic */
break; break;
default: default:
fatalx("unhandled IMSG %u", imsg.hdr.type); fatalx("unhandled IMSG %u", imsg_get_type(&imsg));
} }
imsg_free(&imsg); imsg_free(&imsg);
} }
@ -1264,16 +1230,14 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf)
if (n == 0) if (n == 0)
break; break;
switch (imsg.hdr.type) { switch (imsg_get_type(&imsg)) {
case IMSG_RECONF_ROA_SET: case IMSG_RECONF_ROA_SET:
/* start of update */ /* start of update */
trie_free(&roa_new.th); /* clear new roa */ trie_free(&roa_new.th); /* clear new roa */
break; break;
case IMSG_RECONF_ROA_ITEM: case IMSG_RECONF_ROA_ITEM:
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_data(&imsg, &roa, sizeof(roa)) == -1)
sizeof(roa))
fatalx("IMSG_RECONF_ROA_ITEM bad len"); fatalx("IMSG_RECONF_ROA_ITEM bad len");
memcpy(&roa, imsg.data, sizeof(roa));
if (trie_roa_add(&roa_new.th, &roa) != 0) { if (trie_roa_add(&roa_new.th, &roa) != 0) {
struct bgpd_addr p = { struct bgpd_addr p = {
.aid = roa.aid, .aid = roa.aid,
@ -1284,11 +1248,10 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf)
} }
break; break;
case IMSG_RECONF_ASPA_PREP: 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"); fatalx("IMSG_RECONF_ASPA_PREP bad len");
if (aspa_new) if (aspa_new)
fatalx("unexpected IMSG_RECONF_ASPA_PREP"); fatalx("unexpected IMSG_RECONF_ASPA_PREP");
memcpy(&ap, imsg.data, sizeof(ap));
aspa_new = aspa_table_prep(ap.entries, ap.datasize); aspa_new = aspa_table_prep(ap.entries, ap.datasize);
break; break;
case IMSG_RECONF_ASPA: case IMSG_RECONF_ASPA:
@ -1296,28 +1259,24 @@ rde_dispatch_imsg_rtr(struct imsgbuf *imsgbuf)
fatalx("unexpected IMSG_RECONF_ASPA"); fatalx("unexpected IMSG_RECONF_ASPA");
if (aspa != NULL) if (aspa != NULL)
fatalx("IMSG_RECONF_ASPA already sent"); 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) if ((aspa = calloc(1, sizeof(*aspa))) == NULL)
fatal("IMSG_RECONF_ASPA"); fatal("IMSG_RECONF_ASPA");
memcpy(&aspa->as, imsg.data, sizeof(aspa->as)); if (imsg_get_data(&imsg, aspa,
memcpy(&aspa->num, (char *)imsg.data + sizeof(aspa->as), offsetof(struct aspa_set, tas)) == -1)
sizeof(aspa->num)); fatal("IMSG_RECONF_ASPA bad len");
break; break;
case IMSG_RECONF_ASPA_TAS: case IMSG_RECONF_ASPA_TAS:
if (aspa == NULL) if (aspa == NULL)
fatalx("unexpected IMSG_RECONF_ASPA_TAS"); fatalx("unexpected IMSG_RECONF_ASPA_TAS");
if (imsg.hdr.len - IMSG_HEADER_SIZE != if (imsg_get_len(&imsg) != aspa->num * sizeof(uint32_t))
aspa->num * sizeof(uint32_t))
fatalx("IMSG_RECONF_ASPA_TAS bad len"); fatalx("IMSG_RECONF_ASPA_TAS bad len");
aspa->tas = reallocarray(NULL, aspa->num, aspa->tas = reallocarray(NULL, aspa->num,
sizeof(uint32_t)); sizeof(uint32_t));
if (aspa->tas == NULL) if (aspa->tas == NULL)
fatal("IMSG_RECONF_ASPA_TAS"); fatal("IMSG_RECONF_ASPA_TAS");
memcpy(aspa->tas, imsg.data, if (imsg_get_data(&imsg, aspa->tas,
aspa->num * sizeof(uint32_t)); aspa->num * sizeof(uint32_t)) == -1)
fatal("IMSG_RECONF_ASPA_TAS bad len");
break; break;
case IMSG_RECONF_ASPA_DONE: case IMSG_RECONF_ASPA_DONE:
if (aspa_new == NULL) if (aspa_new == NULL)
@ -1346,18 +1305,17 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula)
if (!peer_imsg_pop(peer, &imsg)) if (!peer_imsg_pop(peer, &imsg))
return; return;
switch (imsg.hdr.type) { switch (imsg_get_type(&imsg)) {
case IMSG_UPDATE: case IMSG_UPDATE:
if (peer->state != PEER_UP) if (peer->state != PEER_UP)
break; break;
rde_update_dispatch(peer, &imsg); rde_update_dispatch(peer, &imsg);
break; break;
case IMSG_REFRESH: 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"); log_warnx("route refresh: wrong imsg len");
break; break;
} }
memcpy(&rr, imsg.data, sizeof(rr));
if (rr.aid >= AID_MAX) { if (rr.aid >= AID_MAX) {
log_peer_warnx(&peer->conf, log_peer_warnx(&peer->conf,
"route refresh: bad AID %d", rr.aid); "route refresh: bad AID %d", rr.aid);
@ -1401,7 +1359,7 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula)
break; break;
default: default:
log_warnx("%s: unhandled imsg type %d", __func__, log_warnx("%s: unhandled imsg type %d", __func__,
imsg.hdr.type); imsg_get_type(&imsg));
break; break;
} }
@ -2413,53 +2371,51 @@ bad_list:
return (plen); return (plen);
} }
#undef UPD_READ
#undef CHECK_FLAGS
int 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 attr_len;
uint16_t plen = 0;
uint8_t flags; uint8_t flags;
uint8_t type; uint8_t type;
uint8_t tmp8; uint8_t tmp8;
if (len < 3) if (ibuf_get_n8(buf, &flags) == -1 ||
ibuf_get_n8(buf, &type) == -1)
return (-1); return (-1);
UPD_READ(&flags, p, plen, 1);
UPD_READ(&type, p, plen, 1);
if (flags & ATTR_EXTLEN) { if (flags & ATTR_EXTLEN) {
if (len - plen < 2) if (ibuf_get_n16(buf, &attr_len) == -1)
return (-1); return (-1);
UPD_READ(&attr_len, p, plen, 2);
attr_len = ntohs(attr_len);
} else { } else {
UPD_READ(&tmp8, p, plen, 1); if (ibuf_get_n8(buf, &tmp8) == -1)
return (-1);
attr_len = tmp8; attr_len = tmp8;
} }
if (len - plen < attr_len) if (ibuf_size(buf) != attr_len)
return (-1); return (-1);
switch (type) { switch (type) {
case ATTR_COMMUNITIES: 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: case ATTR_LARGE_COMMUNITIES:
return community_large_add(&state->communities, flags, p, return community_large_add(&state->communities, flags,
attr_len); ibuf_data(buf), attr_len);
case ATTR_EXT_COMMUNITIES: case ATTR_EXT_COMMUNITIES:
return community_ext_add(&state->communities, flags, 0, 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 (-1);
return (0); return (0);
} }
#undef UPD_READ
#undef CHECK_FLAGS
uint8_t uint8_t
rde_attr_missing(struct rde_aspath *a, int ebgp, uint16_t nlrilen) rde_attr_missing(struct rde_aspath *a, int ebgp, uint16_t nlrilen)
{ {

View file

@ -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 <claudio@openbsd.org> * Copyright (c) 2020 Claudio Jeker <claudio@openbsd.org>
@ -419,6 +419,7 @@ rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr,
{ {
struct rtr_header rh; struct rtr_header rh;
size_t len; size_t len;
uint16_t errcode;
if (ibuf_get(hdr, &rh, sizeof(rh)) == -1) if (ibuf_get(hdr, &rh, sizeof(rh)) == -1)
fatal("%s: ibuf_get", __func__); 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); rtr_fsm(rs, RTR_EVNT_NEGOTIATION_DONE);
break; break;
case ERROR_REPORT: 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; break;
case SERIAL_NOTIFY: case SERIAL_NOTIFY:
/* ignore SERIAL_NOTIFY */ /* ignore SERIAL_NOTIFY */
@ -537,6 +545,10 @@ rtr_parse_notify(struct rtr_session *rs, struct ibuf *pdu)
if (ibuf_get(pdu, &notify, sizeof(notify)) == -1) if (ibuf_get(pdu, &notify, sizeof(notify)) == -1)
goto badlen; 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, &notify.hdr, pdu) == -1) if (rtr_check_session_id(rs, rs->session_id, &notify.hdr, pdu) == -1)
return -1; return -1;
@ -960,10 +972,6 @@ rtr_parse_error(struct rtr_session *rs, struct ibuf *pdu)
rtr_fsm(rs, RTR_EVNT_NO_DATA); rtr_fsm(rs, RTR_EVNT_NO_DATA);
rv = 0; rv = 0;
} else if (errcode == UNSUPP_PROTOCOL_VERS) { } 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); rtr_fsm(rs, RTR_EVNT_UNSUPP_PROTO_VERSION);
rv = 0; rv = 0;
} else } else
@ -1126,6 +1134,11 @@ rtr_fsm(struct rtr_session *rs, enum rtr_event event)
timer_set(&rs->timers, Timer_Rtr_Retry, rs->retry); timer_set(&rs->timers, Timer_Rtr_Retry, rs->retry);
rtr_imsg_compose(IMSG_SOCKET_CONN, rs->id, 0, NULL, 0); rtr_imsg_compose(IMSG_SOCKET_CONN, rs->id, 0, NULL, 0);
break; break;
case RTR_STATE_ESTABLISHED:
if (rs->session_id == -1)
rtr_send_reset_query(rs);
else
rtr_send_serial_query(rs);
default: default:
break; break;
} }

View file

@ -3503,7 +3503,7 @@ freebsd* | dragonfly*)
i*86 ) i*86 )
# Not sure whether the presence of OpenBSD here was a mistake. # Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up. # 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_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;; ;;

View file

@ -8071,7 +8071,7 @@ freebsd* | dragonfly*)
i*86 ) i*86 )
# Not sure whether the presence of OpenBSD here was a mistake. # Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up. # 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_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;; ;;