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|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} }
};

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>
*
@ -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;
}

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>
@ -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]);

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) 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;

View File

@ -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))"

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>
@ -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);

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>
@ -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)
{

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>
@ -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 {

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>
@ -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 *);

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>
@ -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;
}

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>
@ -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,

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

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
@ -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

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
@ -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

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>
@ -275,6 +275,7 @@ cpu_identify(struct cpu_info *ci)
midr = READ_SPECIALREG(midr_el1);
impl = CPU_IMPL(midr);
part = CPU_PART(midr);
ci->ci_midr = midr;
for (i = 0; cpu_implementers[i].name; i++) {
if (impl == cpu_implementers[i].id) {
@ -947,14 +948,14 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
}
cpu_init();
#if NKSTAT > 0
cpu_kstat_attach(ci);
#endif
#ifdef MULTIPROCESSOR
}
#endif
#if NKSTAT > 0
cpu_kstat_attach(ci);
#endif
opp = OF_getpropint(ci->ci_node, "operating-points-v2", 0);
if (opp)
cpu_opp_init(ci, opp);
@ -1204,10 +1205,6 @@ cpu_init_secondary(struct cpu_info *ci)
spllower(IPL_NONE);
#if NKSTAT > 0
cpu_kstat_attach(ci);
#endif
sched_toidle();
}
@ -1862,25 +1859,22 @@ cpu_kstat_attach(struct cpu_info *ci)
{
struct kstat *ks;
struct cpu_kstats *ck;
uint64_t midr, impl, part;
uint64_t impl, part;
const char *impl_name = NULL, *part_name = NULL;
const struct cpu_cores *coreselecter = cpu_cores_none;
size_t i;
int i;
ks = kstat_create(ci->ci_dev->dv_xname, 0, "mach", 0, KSTAT_T_KV, 0);
if (ks == NULL) {
printf("%s: unable to create cpu kstats\n",
ci->ci_dev->dv_xname);
/* printf? */
return;
}
ck = malloc(sizeof(*ck), M_DEVBUF, M_WAITOK);
midr = READ_SPECIALREG(midr_el1);
impl = CPU_IMPL(midr);
part = CPU_PART(midr);
impl = CPU_IMPL(ci->ci_midr);
part = CPU_PART(ci->ci_midr);
for (i = 0; cpu_implementers[i].name; i++) {
if (impl == cpu_implementers[i].id) {
@ -1913,7 +1907,7 @@ cpu_kstat_attach(struct cpu_info *ci)
kstat_kv_init(&ck->ck_rev, "rev", KSTAT_KV_T_ISTR);
snprintf(kstat_kv_istr(&ck->ck_rev), sizeof(kstat_kv_istr(&ck->ck_rev)),
"r%llup%llu", CPU_VAR(midr), CPU_REV(midr));
"r%llup%llu", CPU_VAR(ci->ci_midr), CPU_REV(ci->ci_midr));
ks->ks_softc = ci;
ks->ks_data = ck;

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) 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;
@ -688,17 +766,18 @@ static struct wsmouse_param aplms_wsmousecfg[] = {
};
struct aplms_softc {
struct device sc_dev;
struct device *sc_wsmousedev;
struct device sc_dev;
struct aplhidev_softc *sc_hidev;
struct device *sc_wsmousedev;
int sc_enabled;
int sc_enabled;
int tp_offset;
int tp_fingerpad;
int tp_offset;
int tp_fingerpad;
struct mtpoint frame[UBCMTP_MAX_FINGERS];
int contacts;
int btn;
struct mtpoint frame[UBCMTP_MAX_FINGERS];
int contacts;
int btn;
};
int aplms_enable(void *);
@ -738,6 +817,8 @@ aplms_attach(struct device *parent, struct device *self, void *aux)
struct aplms_softc *sc = (struct aplms_softc *)self;
struct wsmousedev_attach_args aa;
sc->sc_hidev = (struct aplhidev_softc *)parent;
printf("\n");
sc->tp_offset = UBCMTP_TYPE4_TPOFF;
@ -756,13 +837,14 @@ aplms_configure(struct aplms_softc *sc)
{
struct wsmousehw *hw = wsmouse_get_hw(sc->sc_wsmousedev);
/* The values below are for the MacBookPro17,1 */
hw->type = WSMOUSE_TYPE_TOUCHPAD;
hw->hw_type = WSMOUSEHW_CLICKPAD;
hw->x_min = -6046;
hw->x_max = 6536;
hw->y_min = -164;
hw->y_max = 7439;
hw->x_min = sc->sc_hidev->sc_x_min;
hw->x_max = sc->sc_hidev->sc_x_max;
hw->y_min = sc->sc_hidev->sc_y_min;
hw->y_max = sc->sc_hidev->sc_y_max;
hw->h_res = sc->sc_hidev->sc_h_res;
hw->v_res = sc->sc_hidev->sc_v_res;
hw->mt_slots = UBCMTP_MAX_FINGERS;
hw->flags = WSMOUSEHW_MT_TRACKING;
@ -846,8 +928,8 @@ aplms_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
wsmc->miny = hw->y_min;
wsmc->maxy = hw->y_max;
wsmc->swapxy = 0;
wsmc->resx = 0;
wsmc->resy = 0;
wsmc->resx = hw->h_res;
wsmc->resy = hw->v_res;
break;
case WSMOUSEIO_SETMODE:

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>
*
@ -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,20 +907,29 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
if (error)
return error;
for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state);
if (error == EWOULDBLOCK) {
delay(10);
continue;
}
if (error)
return error;
if (cold) {
for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state);
if (error == EWOULDBLOCK) {
delay(10);
continue;
}
if (error)
return error;
if (state->ap_pwrstate == pwrstate)
break;
if (state->ap_pwrstate == pwrstate)
return 0;
}
}
return error;
while (state->ap_pwrstate != pwrstate) {
error = tsleep_nsec(&state->ap_pwrstate, PWAIT, "appwr",
SEC_TO_NSEC(1));
if (error)
return error;
}
return 0;
}
int
@ -856,7 +938,7 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
struct mbox_channel *mc = state->mc;
int error, timo;
if (state->iop_pwrstate == pwrstate)
if (state->iop_pwrstate == (pwrstate & 0xff))
return 0;
error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
@ -864,20 +946,29 @@ rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
if (error)
return error;
for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state);
if (error == EWOULDBLOCK) {
delay(10);
continue;
}
if (error)
return error;
if (cold) {
for (timo = 0; timo < 100000; timo++) {
error = rtkit_poll(state);
if (error == EWOULDBLOCK) {
delay(10);
continue;
}
if (error)
return error;
if (state->iop_pwrstate == (pwrstate & 0xff))
break;
if (state->iop_pwrstate == (pwrstate & 0xff))
return 0;
}
}
return error;
while (state->iop_pwrstate != (pwrstate & 0xff)) {
error = tsleep_nsec(&state->iop_pwrstate, PWAIT, "ioppwr",
SEC_TO_NSEC(1));
if (error)
return error;
}
return 0;
}
int

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>
*
@ -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;

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 $ */
/*
@ -200,11 +200,19 @@ virtio_mmio_set_status(struct virtio_softc *vsc, int status)
struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc;
int old = 0;
if (status != 0)
if (status == 0) {
bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
0);
while (bus_space_read_4(sc->sc_iot, sc->sc_ioh,
VIRTIO_MMIO_STATUS) != 0) {
CPU_BUSY_CYCLE();
}
} else {
old = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
VIRTIO_MMIO_STATUS);
bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
status|old);
VIRTIO_MMIO_STATUS);
bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
status|old);
}
}
int

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.
*
@ -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);

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 $ */
/*
@ -282,15 +282,29 @@ virtio_pci_set_status(struct virtio_softc *vsc, int status)
int old = 0;
if (sc->sc_sc.sc_version_1) {
if (status != 0)
if (status == 0) {
CWRITE(sc, device_status, 0);
while (CREAD(sc, device_status) != 0) {
CPU_BUSY_CYCLE();
}
} else {
old = CREAD(sc, device_status);
CWRITE(sc, device_status, status|old);
CWRITE(sc, device_status, status|old);
}
} else {
if (status != 0)
if (status == 0) {
bus_space_write_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS, status|old);
while (bus_space_read_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS) != 0) {
CPU_BUSY_CYCLE();
}
} else {
old = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS);
bus_space_write_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS, status|old);
bus_space_write_1(sc->sc_iot, sc->sc_ioh,
VIRTIO_CONFIG_DEVICE_STATUS, status|old);
}
}
}

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) 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

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 $ */
/*
@ -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);

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 $ */
/*
@ -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);

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 $ */
/*
@ -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
*/

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 $ */
/*-
@ -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

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>
*
@ -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 *);

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 $ */
/*-
@ -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 *);

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>
@ -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)
{

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>
@ -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, &notify, 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, &notify.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;
}

View File

@ -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.*`
;;

View File

@ -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.*`
;;