sync with OpenBSD -current
This commit is contained in:
parent
25aa71bc5f
commit
34a3d7e18a
32 changed files with 640 additions and 460 deletions
|
@ -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} }
|
||||
};
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
@ -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]);
|
||||
|
|
|
@ -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) 2023 Theo Buehler <tb@openbsd.org>
|
||||
|
@ -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;
|
||||
|
|
|
@ -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))"
|
||||
|
|
|
@ -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>
|
||||
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
|
@ -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 *);
|
||||
|
|
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
@ -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,
|
||||
|
|
|
@ -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,8 +2333,10 @@ pfctl_recurse(int dev, int opts, const char *anchorname,
|
|||
* so that failures on one anchor do not prevent clearing others.
|
||||
*/
|
||||
opts |= PF_OPT_IGNFAIL;
|
||||
if ((opts & PF_OPT_CALLSHOW) == 0)
|
||||
printf("Removing:\n");
|
||||
SLIST_FOREACH_SAFE(pfra, anchors, pfra_sle, pfra_save) {
|
||||
if ((opts & PF_OPT_CALLSHOW) == 0)
|
||||
printf(" %s\n", (*pfra->pfra_anchorname == '\0') ?
|
||||
"/" : pfra->pfra_anchorname);
|
||||
rv |= walkf(dev, opts, pfra);
|
||||
|
@ -2747,6 +2757,11 @@ main(int argc, char *argv[])
|
|||
pfctl_show_fingerprints(opts);
|
||||
break;
|
||||
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);
|
||||
break;
|
||||
case 'o':
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
@ -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,13 +948,13 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
|
|||
}
|
||||
|
||||
cpu_init();
|
||||
#ifdef MULTIPROCESSOR
|
||||
}
|
||||
#endif
|
||||
|
||||
#if NKSTAT > 0
|
||||
cpu_kstat_attach(ci);
|
||||
#endif
|
||||
#ifdef MULTIPROCESSOR
|
||||
}
|
||||
#endif
|
||||
|
||||
opp = OF_getpropint(ci->ci_node, "operating-points-v2", 0);
|
||||
if (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;
|
||||
|
|
|
@ -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) 2013-2014 joshua stein <jcs@openbsd.org>
|
||||
|
@ -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;
|
||||
|
@ -689,6 +767,7 @@ static struct wsmouse_param aplms_wsmousecfg[] = {
|
|||
|
||||
struct aplms_softc {
|
||||
struct device sc_dev;
|
||||
struct aplhidev_softc *sc_hidev;
|
||||
struct device *sc_wsmousedev;
|
||||
|
||||
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 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:
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -19,6 +19,7 @@
|
|||
#include <sys/systm.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/task.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/fdt.h>
|
||||
|
@ -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,6 +907,7 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
if (cold) {
|
||||
for (timo = 0; timo < 100000; timo++) {
|
||||
error = rtkit_poll(state);
|
||||
if (error == EWOULDBLOCK) {
|
||||
|
@ -844,19 +918,27 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
|
|||
return error;
|
||||
|
||||
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 0;
|
||||
}
|
||||
|
||||
int
|
||||
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,6 +946,7 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
if (cold) {
|
||||
for (timo = 0; timo < 100000; timo++) {
|
||||
error = rtkit_poll(state);
|
||||
if (error == EWOULDBLOCK) {
|
||||
|
@ -874,12 +957,20 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
|
|||
return error;
|
||||
|
||||
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 0;
|
||||
}
|
||||
|
||||
int
|
||||
rtkit_start_endpoint(struct rtkit_state *state, uint32_t endpoint,
|
||||
void (*callback)(void *, uint64_t), void *arg)
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -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;
|
||||
|
|
|
@ -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,12 +200,20 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
virtio_mmio_match(struct device *parent, void *cfdata, void *aux)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,17 +282,31 @@ 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);
|
||||
}
|
||||
} 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 {
|
||||
if (status != 0)
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
virtio_pci_match(struct device *parent, void *match, void *aux)
|
||||
|
|
|
@ -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) 2020 Mark Kettenis <kettenis@openbsd.org>
|
||||
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -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 *);
|
||||
|
|
|
@ -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 <sys/resource.h> /* For struct rusage */
|
||||
#include <sys/rwlock.h> /* For struct rwlock */
|
||||
#include <sys/sigio.h> /* For struct sigio */
|
||||
#include <sys/refcnt.h>
|
||||
|
||||
#ifdef _KERNEL
|
||||
#include <sys/atomic.h>
|
||||
|
@ -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 *);
|
||||
|
|
|
@ -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>
|
||||
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
2
usr.sbin/unbound/aclocal.m4
vendored
2
usr.sbin/unbound/aclocal.m4
vendored
|
@ -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.*`
|
||||
;;
|
||||
|
|
2
usr.sbin/unbound/configure
vendored
2
usr.sbin/unbound/configure
vendored
|
@ -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.*`
|
||||
;;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue