sync with OpenBSD -current
This commit is contained in:
parent
9fbd947ba3
commit
8873eac723
@ -1911,6 +1911,7 @@
|
|||||||
./usr/share/man/man3/EVP_BytesToKey.3
|
./usr/share/man/man3/EVP_BytesToKey.3
|
||||||
./usr/share/man/man3/EVP_CIPHER_CTX_ctrl.3
|
./usr/share/man/man3/EVP_CIPHER_CTX_ctrl.3
|
||||||
./usr/share/man/man3/EVP_CIPHER_CTX_get_cipher_data.3
|
./usr/share/man/man3/EVP_CIPHER_CTX_get_cipher_data.3
|
||||||
|
./usr/share/man/man3/EVP_CIPHER_CTX_init.3
|
||||||
./usr/share/man/man3/EVP_CIPHER_CTX_set_flags.3
|
./usr/share/man/man3/EVP_CIPHER_CTX_set_flags.3
|
||||||
./usr/share/man/man3/EVP_CIPHER_do_all.3
|
./usr/share/man/man3/EVP_CIPHER_do_all.3
|
||||||
./usr/share/man/man3/EVP_CIPHER_meth_new.3
|
./usr/share/man/man3/EVP_CIPHER_meth_new.3
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: evp_enc.c,v 1.56 2023/11/29 21:35:57 tb Exp $ */
|
/* $OpenBSD: evp_enc.c,v 1.57 2023/12/01 06:53:18 tb Exp $ */
|
||||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@ -198,7 +198,7 @@ EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|||||||
{
|
{
|
||||||
if (ctx->encrypt)
|
if (ctx->encrypt)
|
||||||
return EVP_EncryptUpdate(ctx, out, outl, in, inl);
|
return EVP_EncryptUpdate(ctx, out, outl, in, inl);
|
||||||
else
|
|
||||||
return EVP_DecryptUpdate(ctx, out, outl, in, inl);
|
return EVP_DecryptUpdate(ctx, out, outl, in, inl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
|||||||
{
|
{
|
||||||
if (ctx->encrypt)
|
if (ctx->encrypt)
|
||||||
return EVP_EncryptFinal_ex(ctx, out, outl);
|
return EVP_EncryptFinal_ex(ctx, out, outl);
|
||||||
else
|
|
||||||
return EVP_DecryptFinal_ex(ctx, out, outl);
|
return EVP_DecryptFinal_ex(ctx, out, outl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,12 +217,10 @@ __warn_references(EVP_CipherFinal,
|
|||||||
int
|
int
|
||||||
EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
if (ctx->encrypt)
|
if (ctx->encrypt)
|
||||||
ret = EVP_EncryptFinal_ex(ctx, out, outl);
|
return EVP_EncryptFinal_ex(ctx, out, outl);
|
||||||
else
|
|
||||||
ret = EVP_DecryptFinal_ex(ctx, out, outl);
|
return EVP_DecryptFinal_ex(ctx, out, outl);
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -341,10 +339,7 @@ __warn_references(EVP_EncryptFinal,
|
|||||||
int
|
int
|
||||||
EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
||||||
{
|
{
|
||||||
int ret;
|
return EVP_EncryptFinal_ex(ctx, out, outl);
|
||||||
|
|
||||||
ret = EVP_EncryptFinal_ex(ctx, out, outl);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -469,10 +464,7 @@ __warn_references(EVP_DecryptFinal,
|
|||||||
int
|
int
|
||||||
EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
|
||||||
{
|
{
|
||||||
int ret;
|
return EVP_DecryptFinal_ex(ctx, out, outl);
|
||||||
|
|
||||||
ret = EVP_DecryptFinal_ex(ctx, out, outl);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
150
lib/libcrypto/man/EVP_CIPHER_CTX_init.3
Normal file
150
lib/libcrypto/man/EVP_CIPHER_CTX_init.3
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
.\" $OpenBSD: EVP_CIPHER_CTX_init.3,v 1.1 2023/12/01 10:40:21 schwarze Exp $
|
||||||
|
.\" full merge up to:
|
||||||
|
.\" OpenSSL EVP_EncryptInit.pod 0874d7f2 Oct 11 13:13:47 2022 +0100
|
||||||
|
.\"
|
||||||
|
.\" This file is a derived work.
|
||||||
|
.\" The changes are covered by the following Copyright and license:
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
|
||||||
|
.\"
|
||||||
|
.\" Permission to use, copy, modify, and distribute this software for any
|
||||||
|
.\" purpose with or without fee is hereby granted, provided that the above
|
||||||
|
.\" copyright notice and this permission notice appear in all copies.
|
||||||
|
.\"
|
||||||
|
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
.\"
|
||||||
|
.\" The original file was written by Dr. Stephen Henson <steve@openssl.org>
|
||||||
|
.\" and Richard Levitte <levitte@openssl.org>.
|
||||||
|
.\" Copyright (c) 2000-2001, 2015 The OpenSSL Project.
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\"
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\"
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in
|
||||||
|
.\" the documentation and/or other materials provided with the
|
||||||
|
.\" distribution.
|
||||||
|
.\"
|
||||||
|
.\" 3. All advertising materials mentioning features or use of this
|
||||||
|
.\" software must display the following acknowledgment:
|
||||||
|
.\" "This product includes software developed by the OpenSSL Project
|
||||||
|
.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||||
|
.\"
|
||||||
|
.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||||
|
.\" endorse or promote products derived from this software without
|
||||||
|
.\" prior written permission. For written permission, please contact
|
||||||
|
.\" openssl-core@openssl.org.
|
||||||
|
.\"
|
||||||
|
.\" 5. Products derived from this software may not be called "OpenSSL"
|
||||||
|
.\" nor may "OpenSSL" appear in their names without prior written
|
||||||
|
.\" permission of the OpenSSL Project.
|
||||||
|
.\"
|
||||||
|
.\" 6. Redistributions of any form whatsoever must retain the following
|
||||||
|
.\" acknowledgment:
|
||||||
|
.\" "This product includes software developed by the OpenSSL Project
|
||||||
|
.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||||
|
.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||||
|
.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
.\" OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.Dd $Mdocdate: December 1 2023 $
|
||||||
|
.Dt EVP_CIPHER_CTX_INIT 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm EVP_CIPHER_CTX_init ,
|
||||||
|
.Nm EVP_CIPHER_CTX_cleanup ,
|
||||||
|
.Nm EVP_Cipher
|
||||||
|
.Nd obsolete EVP cipher functions
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In openssl/evp.h
|
||||||
|
.Ft void
|
||||||
|
.Fo EVP_CIPHER_CTX_init
|
||||||
|
.Fa "EVP_CIPHER_CTX *ctx"
|
||||||
|
.Fc
|
||||||
|
.Ft int
|
||||||
|
.Fo EVP_CIPHER_CTX_cleanup
|
||||||
|
.Fa "EVP_CIPHER_CTX *ctx"
|
||||||
|
.Fc
|
||||||
|
.Ft int
|
||||||
|
.Fo EVP_Cipher
|
||||||
|
.Fa "EVP_CIPHER_CTX *ctx"
|
||||||
|
.Fa "unsigned char *out"
|
||||||
|
.Fa "const unsigned char *in"
|
||||||
|
.Fa "unsigned int inl"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Fn EVP_CIPHER_CTX_init
|
||||||
|
is a deprecated function to clear a cipher context on the stack
|
||||||
|
before use.
|
||||||
|
Do not use it on a cipher context returned from
|
||||||
|
.Xr EVP_CIPHER_CTX_new 3
|
||||||
|
or one that was already used.
|
||||||
|
.Pp
|
||||||
|
.Fn EVP_CIPHER_CTX_cleanup
|
||||||
|
is a deprecated alias for
|
||||||
|
.Xr EVP_CIPHER_CTX_reset 3 .
|
||||||
|
It clears all information from
|
||||||
|
.Fa ctx
|
||||||
|
and frees all allocated memory associated with it, except the
|
||||||
|
.Fa ctx
|
||||||
|
object itself.
|
||||||
|
.Pp
|
||||||
|
.Fn EVP_Cipher
|
||||||
|
encrypts or decrypts aligned blocks of data
|
||||||
|
whose lengths match the cipher block size.
|
||||||
|
It requires that the previous encryption or decryption operation
|
||||||
|
using the same
|
||||||
|
.Fa ctx ,
|
||||||
|
if there was any, ended exactly on a block boundary and that
|
||||||
|
.Fa inl
|
||||||
|
is an integer multiple of the cipher block size.
|
||||||
|
If either of these conditions is violated,
|
||||||
|
.Fn EVP_Cipher
|
||||||
|
silently produces incorrect results.
|
||||||
|
For that reason, using the function
|
||||||
|
.Xr EVP_CipherUpdate 3
|
||||||
|
instead is strongly recommended.
|
||||||
|
The latter can safely handle partial blocks, and even if
|
||||||
|
.Fa inl
|
||||||
|
actually is a multiple of the cipher block size for all calls,
|
||||||
|
the overhead incurred by using
|
||||||
|
.Xr EVP_CipherUpdate 3
|
||||||
|
is minimal.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
.Fn EVP_CIPHER_CTX_cleanup
|
||||||
|
and
|
||||||
|
.Fn EVP_Cipher
|
||||||
|
return 1 for success or 0 for failure.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr evp 3 ,
|
||||||
|
.Xr EVP_EncryptInit 3
|
||||||
|
.Sh HISTORY
|
||||||
|
.Fn EVP_Cipher
|
||||||
|
first appeared in SSLeay 0.6.5.
|
||||||
|
.Fn EVP_CIPHER_CTX_cleanup
|
||||||
|
first appeared in SSLeay 0.8.0.
|
||||||
|
.Fn EVP_CIPHER_CTX_init
|
||||||
|
first appeared in SSLeay 0.9.0.
|
||||||
|
All these functions have been available since
|
||||||
|
.Ox 2.4 .
|
@ -1,4 +1,4 @@
|
|||||||
.\" $OpenBSD: EVP_EncryptInit.3,v 1.48 2023/08/31 17:27:41 schwarze Exp $
|
.\" $OpenBSD: EVP_EncryptInit.3,v 1.50 2023/12/01 13:43:37 schwarze Exp $
|
||||||
.\" full merge up to: OpenSSL 5211e094 Nov 11 14:39:11 2014 -0800
|
.\" full merge up to: OpenSSL 5211e094 Nov 11 14:39:11 2014 -0800
|
||||||
.\" EVP_bf_cbc.pod EVP_cast5_cbc.pod EVP_idea_cbc.pod EVP_rc2_cbc.pod
|
.\" EVP_bf_cbc.pod EVP_cast5_cbc.pod EVP_idea_cbc.pod EVP_rc2_cbc.pod
|
||||||
.\" 7c6d372a Nov 20 13:20:01 2018 +0000
|
.\" 7c6d372a Nov 20 13:20:01 2018 +0000
|
||||||
@ -69,14 +69,12 @@
|
|||||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
.\" OF THE POSSIBILITY OF SUCH DAMAGE.
|
.\" OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd $Mdocdate: August 31 2023 $
|
.Dd $Mdocdate: December 1 2023 $
|
||||||
.Dt EVP_ENCRYPTINIT 3
|
.Dt EVP_ENCRYPTINIT 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm EVP_CIPHER_CTX_new ,
|
.Nm EVP_CIPHER_CTX_new ,
|
||||||
.Nm EVP_CIPHER_CTX_reset ,
|
.Nm EVP_CIPHER_CTX_reset ,
|
||||||
.Nm EVP_CIPHER_CTX_cleanup ,
|
|
||||||
.Nm EVP_CIPHER_CTX_init ,
|
|
||||||
.Nm EVP_CIPHER_CTX_free ,
|
.Nm EVP_CIPHER_CTX_free ,
|
||||||
.Nm EVP_CIPHER_CTX_copy ,
|
.Nm EVP_CIPHER_CTX_copy ,
|
||||||
.Nm EVP_EncryptInit_ex ,
|
.Nm EVP_EncryptInit_ex ,
|
||||||
@ -94,7 +92,6 @@
|
|||||||
.Nm EVP_DecryptFinal ,
|
.Nm EVP_DecryptFinal ,
|
||||||
.Nm EVP_CipherInit ,
|
.Nm EVP_CipherInit ,
|
||||||
.Nm EVP_CipherFinal ,
|
.Nm EVP_CipherFinal ,
|
||||||
.Nm EVP_Cipher ,
|
|
||||||
.Nm EVP_CIPHER_CTX_encrypting ,
|
.Nm EVP_CIPHER_CTX_encrypting ,
|
||||||
.Nm EVP_get_cipherbyname ,
|
.Nm EVP_get_cipherbyname ,
|
||||||
.Nm EVP_get_cipherbynid ,
|
.Nm EVP_get_cipherbynid ,
|
||||||
@ -132,14 +129,6 @@
|
|||||||
.Fo EVP_CIPHER_CTX_reset
|
.Fo EVP_CIPHER_CTX_reset
|
||||||
.Fa "EVP_CIPHER_CTX *ctx"
|
.Fa "EVP_CIPHER_CTX *ctx"
|
||||||
.Fc
|
.Fc
|
||||||
.Ft int
|
|
||||||
.Fo EVP_CIPHER_CTX_cleanup
|
|
||||||
.Fa "EVP_CIPHER_CTX *ctx"
|
|
||||||
.Fc
|
|
||||||
.Ft void
|
|
||||||
.Fo EVP_CIPHER_CTX_init
|
|
||||||
.Fa "EVP_CIPHER_CTX *ctx"
|
|
||||||
.Fc
|
|
||||||
.Ft void
|
.Ft void
|
||||||
.Fo EVP_CIPHER_CTX_free
|
.Fo EVP_CIPHER_CTX_free
|
||||||
.Fa "EVP_CIPHER_CTX *ctx"
|
.Fa "EVP_CIPHER_CTX *ctx"
|
||||||
@ -257,13 +246,6 @@
|
|||||||
.Fa "int *outl"
|
.Fa "int *outl"
|
||||||
.Fc
|
.Fc
|
||||||
.Ft int
|
.Ft int
|
||||||
.Fo EVP_Cipher
|
|
||||||
.Fa "EVP_CIPHER_CTX *ctx"
|
|
||||||
.Fa "unsigned char *out"
|
|
||||||
.Fa "const unsigned char *in"
|
|
||||||
.Fa "unsigned int inl"
|
|
||||||
.Fc
|
|
||||||
.Ft int
|
|
||||||
.Fo EVP_CIPHER_CTX_encrypting
|
.Fo EVP_CIPHER_CTX_encrypting
|
||||||
.Fa "const EVP_CIPHER_CTX *ctx"
|
.Fa "const EVP_CIPHER_CTX *ctx"
|
||||||
.Fc
|
.Fc
|
||||||
@ -300,16 +282,6 @@ object itself, such that it can be reused for another series of calls to
|
|||||||
.Fn EVP_CipherUpdate ,
|
.Fn EVP_CipherUpdate ,
|
||||||
and
|
and
|
||||||
.Fn EVP_CipherFinal .
|
.Fn EVP_CipherFinal .
|
||||||
.Fn EVP_CIPHER_CTX_cleanup
|
|
||||||
is a deprecated alias for
|
|
||||||
.Fn EVP_CIPHER_CTX_reset .
|
|
||||||
.Pp
|
|
||||||
.Fn EVP_CIPHER_CTX_init
|
|
||||||
is a deprecated function to clear a cipher context on the stack
|
|
||||||
before use.
|
|
||||||
Do not use it on a cipher context returned from
|
|
||||||
.Fn EVP_CIPHER_CTX_new
|
|
||||||
or one that was already used.
|
|
||||||
.Pp
|
.Pp
|
||||||
.Fn EVP_CIPHER_CTX_free
|
.Fn EVP_CIPHER_CTX_free
|
||||||
clears all information from
|
clears all information from
|
||||||
@ -336,15 +308,13 @@ to
|
|||||||
.Fa out ,
|
.Fa out ,
|
||||||
except that the
|
except that the
|
||||||
.Vt EVP_CIPHER
|
.Vt EVP_CIPHER
|
||||||
and
|
object used by
|
||||||
.Vt ENGINE
|
|
||||||
objects used by
|
|
||||||
.Fa in
|
.Fa in
|
||||||
and any application specific data set with
|
and any application specific data set with
|
||||||
.Xr EVP_CIPHER_CTX_set_app_data 3
|
.Xr EVP_CIPHER_CTX_set_app_data 3
|
||||||
are not copied and
|
are not copied and
|
||||||
.Fa out
|
.Fa out
|
||||||
will point to the same three objects.
|
will point to the same two objects.
|
||||||
The algorithm- and implementation-specific cipher data described in
|
The algorithm- and implementation-specific cipher data described in
|
||||||
.Xr EVP_CIPHER_CTX_get_cipher_data 3
|
.Xr EVP_CIPHER_CTX_get_cipher_data 3
|
||||||
is copied with
|
is copied with
|
||||||
@ -374,28 +344,27 @@ are used by some of the ciphers documented in the
|
|||||||
.Xr EVP_aes_256_gcm 3
|
.Xr EVP_aes_256_gcm 3
|
||||||
manual page.
|
manual page.
|
||||||
.Pp
|
.Pp
|
||||||
|
.Fn EVP_EncryptInit
|
||||||
|
and
|
||||||
.Fn EVP_EncryptInit_ex
|
.Fn EVP_EncryptInit_ex
|
||||||
sets up the cipher context
|
set up the cipher context
|
||||||
.Fa ctx
|
.Fa ctx
|
||||||
for encryption with cipher
|
for encryption with cipher
|
||||||
.Fa type
|
.Fa type .
|
||||||
from
|
|
||||||
.Vt ENGINE
|
|
||||||
.Fa impl .
|
|
||||||
.Fa type
|
.Fa type
|
||||||
is normally supplied by a function such as
|
is normally supplied by a function such as
|
||||||
.Xr EVP_aes_256_cbc 3 .
|
.Xr EVP_aes_256_cbc 3 .
|
||||||
If
|
|
||||||
.Fa impl
|
|
||||||
is
|
|
||||||
.Dv NULL ,
|
|
||||||
then the default implementation is used.
|
|
||||||
.Fa key
|
.Fa key
|
||||||
is the symmetric key to use and
|
is the symmetric key to use and
|
||||||
.Fa iv
|
.Fa iv
|
||||||
is the IV to use (if necessary).
|
is the IV to use (if necessary).
|
||||||
The actual number of bytes used for the
|
The actual number of bytes used for the
|
||||||
key and IV depends on the cipher.
|
key and IV depends on the cipher.
|
||||||
|
The
|
||||||
|
.Fa ENGINE *impl
|
||||||
|
argument is always ignored and passing
|
||||||
|
.Dv NULL
|
||||||
|
is recommended.
|
||||||
It is possible to set all parameters to
|
It is possible to set all parameters to
|
||||||
.Dv NULL
|
.Dv NULL
|
||||||
except
|
except
|
||||||
@ -425,8 +394,11 @@ The actual number of bytes written is placed in
|
|||||||
.Fa outl .
|
.Fa outl .
|
||||||
.Pp
|
.Pp
|
||||||
If padding is enabled (the default) then
|
If padding is enabled (the default) then
|
||||||
.Fn EVP_EncryptFinal_ex
|
.Fn EVP_EncryptFinal
|
||||||
encrypts the "final" data, that is any data that remains in a partial
|
and
|
||||||
|
.Fn EVP_EncryptFinal_ex ,
|
||||||
|
which behave identically,
|
||||||
|
encrypt the "final" data, that is any data that remains in a partial
|
||||||
block.
|
block.
|
||||||
It uses NOTES (aka PKCS padding).
|
It uses NOTES (aka PKCS padding).
|
||||||
The encrypted final data is written to
|
The encrypted final data is written to
|
||||||
@ -440,18 +412,24 @@ no further calls to
|
|||||||
should be made.
|
should be made.
|
||||||
.Pp
|
.Pp
|
||||||
If padding is disabled then
|
If padding is disabled then
|
||||||
|
.Fn EVP_EncryptFinal
|
||||||
|
and
|
||||||
.Fn EVP_EncryptFinal_ex
|
.Fn EVP_EncryptFinal_ex
|
||||||
will not encrypt any more data and it will return an error if any data
|
do not encrypt any more data and return an error if any data
|
||||||
remains in a partial block: that is if the total data length is not a
|
remains in a partial block: that is if the total data length is not a
|
||||||
multiple of the block size.
|
multiple of the block size.
|
||||||
.Pp
|
.Pp
|
||||||
|
.Fn EVP_DecryptInit ,
|
||||||
.Fn EVP_DecryptInit_ex ,
|
.Fn EVP_DecryptInit_ex ,
|
||||||
.Fn EVP_DecryptUpdate ,
|
.Fn EVP_DecryptUpdate ,
|
||||||
|
.Fn EVP_DecryptFinal ,
|
||||||
and
|
and
|
||||||
.Fn EVP_DecryptFinal_ex
|
.Fn EVP_DecryptFinal_ex
|
||||||
are the corresponding decryption operations.
|
are the corresponding decryption operations.
|
||||||
.Fn EVP_DecryptFinal
|
.Fn EVP_DecryptFinal
|
||||||
will return an error code if padding is enabled and the final block is
|
and
|
||||||
|
.Fn EVP_DecryptFinal_ex
|
||||||
|
return an error code if padding is enabled and the final block is
|
||||||
not correctly formatted.
|
not correctly formatted.
|
||||||
The parameters and restrictions are identical to the encryption
|
The parameters and restrictions are identical to the encryption
|
||||||
operations except that if padding is enabled the decrypted data buffer
|
operations except that if padding is enabled the decrypted data buffer
|
||||||
@ -463,8 +441,10 @@ unless the cipher block size is 1 in which case
|
|||||||
.Fa inl
|
.Fa inl
|
||||||
bytes is sufficient.
|
bytes is sufficient.
|
||||||
.Pp
|
.Pp
|
||||||
|
.Fn EVP_CipherInit ,
|
||||||
.Fn EVP_CipherInit_ex ,
|
.Fn EVP_CipherInit_ex ,
|
||||||
.Fn EVP_CipherUpdate ,
|
.Fn EVP_CipherUpdate ,
|
||||||
|
.Fn EVP_CipherFinal ,
|
||||||
and
|
and
|
||||||
.Fn EVP_CipherFinal_ex
|
.Fn EVP_CipherFinal_ex
|
||||||
are functions that can be used for decryption or encryption.
|
are functions that can be used for decryption or encryption.
|
||||||
@ -476,59 +456,6 @@ the value unchanged (the actual value of
|
|||||||
.Fa enc
|
.Fa enc
|
||||||
being supplied in a previous call).
|
being supplied in a previous call).
|
||||||
.Pp
|
.Pp
|
||||||
.Fn EVP_EncryptInit ,
|
|
||||||
.Fn EVP_DecryptInit ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherInit
|
|
||||||
are deprecated functions behaving like
|
|
||||||
.Fn EVP_EncryptInit_ex ,
|
|
||||||
.Fn EVP_DecryptInit_ex ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherInit_ex
|
|
||||||
except that they always use the default cipher implementation
|
|
||||||
and that they require
|
|
||||||
.Fn EVP_CIPHER_CTX_reset
|
|
||||||
before they can be used on a context that was already used.
|
|
||||||
.Pp
|
|
||||||
.Fn EVP_EncryptFinal ,
|
|
||||||
.Fn EVP_DecryptFinal ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherFinal
|
|
||||||
are identical to
|
|
||||||
.Fn EVP_EncryptFinal_ex ,
|
|
||||||
.Fn EVP_DecryptFinal_ex ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherFinal_ex .
|
|
||||||
In previous releases of OpenSSL, they also used to clean up the
|
|
||||||
.Fa ctx ,
|
|
||||||
but this is no longer done and
|
|
||||||
.Fn EVP_CIPHER_CTX_reset
|
|
||||||
or
|
|
||||||
.Fn EVP_CIPHER_CTX_free
|
|
||||||
must be called to free any context resources.
|
|
||||||
.Pp
|
|
||||||
.Fn EVP_Cipher
|
|
||||||
encrypts or decrypts aligned blocks of data
|
|
||||||
whose lengths match the cipher block size.
|
|
||||||
It requires that the previous encryption or decryption operation
|
|
||||||
using the same
|
|
||||||
.Fa ctx ,
|
|
||||||
if there was any, ended exactly on a block boundary and that
|
|
||||||
.Fa inl
|
|
||||||
is an integer multiple of the cipher block size.
|
|
||||||
If either of these conditions is violated,
|
|
||||||
.Fn EVP_Cipher
|
|
||||||
silently produces incorrect results.
|
|
||||||
For that reason, using the function
|
|
||||||
.Fn EVP_CipherUpdate
|
|
||||||
instead is strongly recommended.
|
|
||||||
The latter can safely handle partial blocks, and even if
|
|
||||||
.Fa inl
|
|
||||||
actually is a multiple of the cipher block size for all calls,
|
|
||||||
the overhead incurred by using
|
|
||||||
.Fn EVP_CipherUpdate
|
|
||||||
is minimal.
|
|
||||||
.Pp
|
|
||||||
.Fn EVP_get_cipherbyname ,
|
.Fn EVP_get_cipherbyname ,
|
||||||
.Fn EVP_get_cipherbynid ,
|
.Fn EVP_get_cipherbynid ,
|
||||||
and
|
and
|
||||||
@ -570,25 +497,6 @@ final decrypt error.
|
|||||||
If padding is disabled then the decryption operation will always succeed
|
If padding is disabled then the decryption operation will always succeed
|
||||||
if the total amount of data decrypted is a multiple of the block size.
|
if the total amount of data decrypted is a multiple of the block size.
|
||||||
.Pp
|
.Pp
|
||||||
The functions
|
|
||||||
.Fn EVP_EncryptInit ,
|
|
||||||
.Fn EVP_EncryptFinal ,
|
|
||||||
.Fn EVP_DecryptInit ,
|
|
||||||
.Fn EVP_CipherInit ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherFinal
|
|
||||||
are obsolete but are retained for compatibility with existing code.
|
|
||||||
New code should use
|
|
||||||
.Fn EVP_EncryptInit_ex ,
|
|
||||||
.Fn EVP_EncryptFinal_ex ,
|
|
||||||
.Fn EVP_DecryptInit_ex ,
|
|
||||||
.Fn EVP_DecryptFinal_ex ,
|
|
||||||
.Fn EVP_CipherInit_ex ,
|
|
||||||
and
|
|
||||||
.Fn EVP_CipherFinal_ex
|
|
||||||
because they can reuse an existing context without allocating and
|
|
||||||
freeing it up on each call.
|
|
||||||
.Pp
|
|
||||||
.Fn EVP_get_cipherbynid
|
.Fn EVP_get_cipherbynid
|
||||||
and
|
and
|
||||||
.Fn EVP_get_cipherbyobj
|
.Fn EVP_get_cipherbyobj
|
||||||
@ -602,7 +510,6 @@ for success or
|
|||||||
for failure.
|
for failure.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn EVP_CIPHER_CTX_reset ,
|
.Fn EVP_CIPHER_CTX_reset ,
|
||||||
.Fn EVP_CIPHER_CTX_cleanup ,
|
|
||||||
.Fn EVP_CIPHER_CTX_copy ,
|
.Fn EVP_CIPHER_CTX_copy ,
|
||||||
.Fn EVP_EncryptInit_ex ,
|
.Fn EVP_EncryptInit_ex ,
|
||||||
.Fn EVP_EncryptUpdate ,
|
.Fn EVP_EncryptUpdate ,
|
||||||
@ -618,9 +525,8 @@ for failure.
|
|||||||
.Fn EVP_DecryptInit ,
|
.Fn EVP_DecryptInit ,
|
||||||
.Fn EVP_DecryptFinal ,
|
.Fn EVP_DecryptFinal ,
|
||||||
.Fn EVP_CipherInit ,
|
.Fn EVP_CipherInit ,
|
||||||
.Fn EVP_CipherFinal ,
|
|
||||||
and
|
and
|
||||||
.Fn EVP_Cipher
|
.Fn EVP_CipherFinal
|
||||||
return 1 for success or 0 for failure.
|
return 1 for success or 0 for failure.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn EVP_CIPHER_CTX_encrypting
|
.Fn EVP_CIPHER_CTX_encrypting
|
||||||
@ -729,13 +635,17 @@ To specify any additional authenticated data (AAD), a call to
|
|||||||
.Fn EVP_EncryptUpdate ,
|
.Fn EVP_EncryptUpdate ,
|
||||||
or
|
or
|
||||||
.Fn EVP_DecryptUpdate
|
.Fn EVP_DecryptUpdate
|
||||||
should be made with the output parameter out set to
|
should be made with the output parameter
|
||||||
|
.Fa out
|
||||||
|
set to
|
||||||
.Dv NULL .
|
.Dv NULL .
|
||||||
.Pp
|
.Pp
|
||||||
When decrypting, the return value of
|
When decrypting, the return value of
|
||||||
.Fn EVP_DecryptFinal
|
.Fn EVP_DecryptFinal ,
|
||||||
|
.Fn EVP_DecryptFinal_ex ,
|
||||||
|
.Fn EVP_CipherFinal ,
|
||||||
or
|
or
|
||||||
.Fn EVP_CipherFinal
|
.Fn EVP_CipherFinal_ex
|
||||||
indicates if the operation was successful.
|
indicates if the operation was successful.
|
||||||
If it does not indicate success, the authentication operation has
|
If it does not indicate success, the authentication operation has
|
||||||
failed and any output data MUST NOT be used as it is corrupted.
|
failed and any output data MUST NOT be used as it is corrupted.
|
||||||
@ -754,6 +664,8 @@ bytes of the tag value to the buffer indicated by
|
|||||||
This call can only be made when encrypting data and after all data has
|
This call can only be made when encrypting data and after all data has
|
||||||
been processed, e.g. after an
|
been processed, e.g. after an
|
||||||
.Fn EVP_EncryptFinal
|
.Fn EVP_EncryptFinal
|
||||||
|
or
|
||||||
|
.Fn EVP_EncryptFinal_ex
|
||||||
call.
|
call.
|
||||||
.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_GCM_SET_TAG taglen tag
|
.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_GCM_SET_TAG taglen tag
|
||||||
Sets the expected tag to
|
Sets the expected tag to
|
||||||
@ -775,7 +687,9 @@ by calling
|
|||||||
.Fn EVP_EncryptUpdate ,
|
.Fn EVP_EncryptUpdate ,
|
||||||
or
|
or
|
||||||
.Fn EVP_DecryptUpdate
|
.Fn EVP_DecryptUpdate
|
||||||
with the output parameter out set to
|
with the output parameter
|
||||||
|
.Fa out
|
||||||
|
set to
|
||||||
.Dv NULL .
|
.Dv NULL .
|
||||||
Additionally, the total
|
Additionally, the total
|
||||||
plaintext or ciphertext length MUST be passed to
|
plaintext or ciphertext length MUST be passed to
|
||||||
@ -929,6 +843,7 @@ do_crypt(FILE *in, FILE *out, int do_encrypt)
|
|||||||
.Xr EVP_chacha20 3 ,
|
.Xr EVP_chacha20 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_ctrl 3 ,
|
.Xr EVP_CIPHER_CTX_ctrl 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_get_cipher_data 3 ,
|
.Xr EVP_CIPHER_CTX_get_cipher_data 3 ,
|
||||||
|
.Xr EVP_CIPHER_CTX_init 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_set_flags 3 ,
|
.Xr EVP_CIPHER_CTX_set_flags 3 ,
|
||||||
.Xr EVP_CIPHER_nid 3 ,
|
.Xr EVP_CIPHER_nid 3 ,
|
||||||
.Xr EVP_des_cbc 3 ,
|
.Xr EVP_des_cbc 3 ,
|
||||||
@ -959,15 +874,12 @@ first appeared in SSLeay 0.5.1.
|
|||||||
and
|
and
|
||||||
.Fn EVP_rc2_ofb
|
.Fn EVP_rc2_ofb
|
||||||
first appeared in SSLeay 0.5.2.
|
first appeared in SSLeay 0.5.2.
|
||||||
.Fn EVP_Cipher
|
|
||||||
first appeared in SSLeay 0.6.5.
|
|
||||||
.Fn EVP_bf_cbc ,
|
.Fn EVP_bf_cbc ,
|
||||||
.Fn EVP_bf_ecb ,
|
.Fn EVP_bf_ecb ,
|
||||||
.Fn EVP_bf_cfb ,
|
.Fn EVP_bf_cfb ,
|
||||||
and
|
and
|
||||||
.Fn EVP_bf_ofb
|
.Fn EVP_bf_ofb
|
||||||
first appeared in SSLeay 0.6.6.
|
first appeared in SSLeay 0.6.6.
|
||||||
.Fn EVP_CIPHER_CTX_cleanup ,
|
|
||||||
.Fn EVP_get_cipherbyobj ,
|
.Fn EVP_get_cipherbyobj ,
|
||||||
.Fn EVP_CIPHER_CTX_cipher ,
|
.Fn EVP_CIPHER_CTX_cipher ,
|
||||||
and
|
and
|
||||||
@ -975,8 +887,6 @@ and
|
|||||||
first appeared in SSLeay 0.8.0.
|
first appeared in SSLeay 0.8.0.
|
||||||
.Fn EVP_get_cipherbynid
|
.Fn EVP_get_cipherbynid
|
||||||
first appeared in SSLeay 0.8.1.
|
first appeared in SSLeay 0.8.1.
|
||||||
.Fn EVP_CIPHER_CTX_init
|
|
||||||
first appeared in SSLeay 0.9.0.
|
|
||||||
All these functions have been available since
|
All these functions have been available since
|
||||||
.Ox 2.4 .
|
.Ox 2.4 .
|
||||||
.Pp
|
.Pp
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $OpenBSD: Makefile,v 1.277 2023/11/19 10:36:14 tb Exp $
|
# $OpenBSD: Makefile,v 1.278 2023/12/01 10:40:21 schwarze Exp $
|
||||||
|
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
@ -158,6 +158,7 @@ MAN= \
|
|||||||
EVP_BytesToKey.3 \
|
EVP_BytesToKey.3 \
|
||||||
EVP_CIPHER_CTX_ctrl.3 \
|
EVP_CIPHER_CTX_ctrl.3 \
|
||||||
EVP_CIPHER_CTX_get_cipher_data.3 \
|
EVP_CIPHER_CTX_get_cipher_data.3 \
|
||||||
|
EVP_CIPHER_CTX_init.3 \
|
||||||
EVP_CIPHER_CTX_set_flags.3 \
|
EVP_CIPHER_CTX_set_flags.3 \
|
||||||
EVP_CIPHER_do_all.3 \
|
EVP_CIPHER_do_all.3 \
|
||||||
EVP_CIPHER_meth_new.3 \
|
EVP_CIPHER_meth_new.3 \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.\" $OpenBSD: evp.3,v 1.25 2023/11/19 10:25:28 tb Exp $
|
.\" $OpenBSD: evp.3,v 1.26 2023/12/01 10:40:21 schwarze Exp $
|
||||||
.\" full merge up to: OpenSSL man7/evp 24a535ea Sep 22 13:14:20 2020 +0100
|
.\" full merge up to: OpenSSL man7/evp 24a535ea Sep 22 13:14:20 2020 +0100
|
||||||
.\"
|
.\"
|
||||||
.\" This file was written by Ulf Moeller <ulf@openssl.org>,
|
.\" This file was written by Ulf Moeller <ulf@openssl.org>,
|
||||||
@ -51,7 +51,7 @@
|
|||||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
.\" OF THE POSSIBILITY OF SUCH DAMAGE.
|
.\" OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd $Mdocdate: November 19 2023 $
|
.Dd $Mdocdate: December 1 2023 $
|
||||||
.Dt EVP 3
|
.Dt EVP 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -175,6 +175,7 @@ family of functions provides base64 encoding and decoding.
|
|||||||
.Xr EVP_chacha20 3 ,
|
.Xr EVP_chacha20 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_ctrl 3 ,
|
.Xr EVP_CIPHER_CTX_ctrl 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_get_cipher_data 3 ,
|
.Xr EVP_CIPHER_CTX_get_cipher_data 3 ,
|
||||||
|
.Xr EVP_CIPHER_CTX_init 3 ,
|
||||||
.Xr EVP_CIPHER_CTX_set_flags 3 ,
|
.Xr EVP_CIPHER_CTX_set_flags 3 ,
|
||||||
.Xr EVP_CIPHER_do_all 3 ,
|
.Xr EVP_CIPHER_do_all 3 ,
|
||||||
.Xr EVP_CIPHER_meth_new 3 ,
|
.Xr EVP_CIPHER_meth_new 3 ,
|
||||||
|
52
regress/usr.sbin/relayd/args-http-chunked-invalid.pl
Normal file
52
regress/usr.sbin/relayd/args-http-chunked-invalid.pl
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Test parsing of invalid chunk length values
|
||||||
|
# We force multiple connections since relayd will abort the connection
|
||||||
|
# when it encounters a bogus chunk size.
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my @lengths = (7, 6, 5, 4, 3, 2);
|
||||||
|
my @chunks = ("0x4", "+3", "-0", "foo", "dead beef", "Ff0");
|
||||||
|
our %args = (
|
||||||
|
client => {
|
||||||
|
func => sub {
|
||||||
|
my $self = shift;
|
||||||
|
my $chunk = shift(@chunks);
|
||||||
|
$self->{redo} = int(@chunks);
|
||||||
|
print <<"EOF";
|
||||||
|
PUT /4/3 HTTP/1.1
|
||||||
|
Host: foo.bar
|
||||||
|
Transfer-Encoding: chunked
|
||||||
|
|
||||||
|
$chunk
|
||||||
|
|
||||||
|
EOF
|
||||||
|
foreach (@lengths) {
|
||||||
|
print STDERR "LEN: $_\n";
|
||||||
|
}
|
||||||
|
# relayd does not forward the first chunk if the second one
|
||||||
|
# is invalid. So do not expect any response.
|
||||||
|
#http_response($self, "without len");
|
||||||
|
},
|
||||||
|
http_vers => ["1.1"],
|
||||||
|
lengths => \@lengths,
|
||||||
|
method => "PUT",
|
||||||
|
},
|
||||||
|
relayd => {
|
||||||
|
protocol => [ "http",
|
||||||
|
"match request header log foo",
|
||||||
|
"match response header log bar",
|
||||||
|
],
|
||||||
|
loggrep => {
|
||||||
|
qr/, invalid chunk size, PUT/ => 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server => {
|
||||||
|
func => \&http_server,
|
||||||
|
nocheck => 1,
|
||||||
|
},
|
||||||
|
lengths => \@lengths,
|
||||||
|
);
|
||||||
|
|
||||||
|
1;
|
50
regress/usr.sbin/relayd/args-http-contentlength-get.pl
Normal file
50
regress/usr.sbin/relayd/args-http-contentlength-get.pl
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Test to verify that relayd strips Content-Length and body
|
||||||
|
# from GET requests.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my $payload_len = 64;
|
||||||
|
our %args = (
|
||||||
|
client => {
|
||||||
|
func => sub {
|
||||||
|
my $self = shift;
|
||||||
|
my @request_stream = split("\n", <<"EOF", -1);
|
||||||
|
GET http://foo.bar/$payload_len HTTP/1.1
|
||||||
|
Content-Length: $payload_len
|
||||||
|
|
||||||
|
foo=bar
|
||||||
|
|
||||||
|
EOF
|
||||||
|
pop @request_stream;
|
||||||
|
print map { "$_\r\n" } @request_stream;
|
||||||
|
print STDERR map { ">>> $_\n" } @request_stream;
|
||||||
|
$self->{method} = 'GET';
|
||||||
|
http_response($self, $payload_len);
|
||||||
|
},
|
||||||
|
loggrep => {
|
||||||
|
qr/Content-Length: $payload_len/ => 2,
|
||||||
|
qr/foo=bar/ => 1,
|
||||||
|
},
|
||||||
|
http_vers => ["1.1"],
|
||||||
|
nocheck => 1,
|
||||||
|
},
|
||||||
|
relayd => {
|
||||||
|
protocol => [ "http",
|
||||||
|
"match request path log \"*\"",
|
||||||
|
],
|
||||||
|
loggrep => {
|
||||||
|
qr/, done, \[http:\/\/foo.bar\/$payload_len\] GET/ => 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server => {
|
||||||
|
func => \&http_server,
|
||||||
|
loggrep => {
|
||||||
|
qr/Content-Length: $payload_len/ => 1,
|
||||||
|
qr/foo=bar/ => 0,
|
||||||
|
},
|
||||||
|
nocheck => 1,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
1;
|
40
regress/usr.sbin/relayd/args-http-contentlength-invalid.pl
Normal file
40
regress/usr.sbin/relayd/args-http-contentlength-invalid.pl
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Test that relayd aborts the connection if Content-Length is invalid
|
||||||
|
# We test "+0" because it is accepted by strtol(), sscanf(), etc
|
||||||
|
# but is not legal according to the RFC.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our %args = (
|
||||||
|
client => {
|
||||||
|
func => sub {
|
||||||
|
my $self = shift;
|
||||||
|
print <<"EOF";
|
||||||
|
PUT /1 HTTP/1.1
|
||||||
|
Host: www.foo.com
|
||||||
|
Content-Length: +0
|
||||||
|
|
||||||
|
EOF
|
||||||
|
# no http_response($self, 1);
|
||||||
|
},
|
||||||
|
http_vers => ["1.1"],
|
||||||
|
nocheck => 1,
|
||||||
|
method => "PUT",
|
||||||
|
},
|
||||||
|
relayd => {
|
||||||
|
protocol => [ "http",
|
||||||
|
"match request header log Host",
|
||||||
|
],
|
||||||
|
loggrep => {
|
||||||
|
qr/, invalid$/ => 1,
|
||||||
|
qr/\[Host: www.foo.com\] PUT/ => 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server => {
|
||||||
|
func => \&http_server,
|
||||||
|
nocheck => 1,
|
||||||
|
noserver => 1,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
1;
|
38
regress/usr.sbin/relayd/args-http-invalid-header1.pl
Normal file
38
regress/usr.sbin/relayd/args-http-invalid-header1.pl
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Test that relayd aborts the connection if a header name has invalid chars
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our %args = (
|
||||||
|
client => {
|
||||||
|
func => sub {
|
||||||
|
my $self = shift;
|
||||||
|
print <<"EOF";
|
||||||
|
GET /1 HTTP/1.1
|
||||||
|
Host: www.foo.com
|
||||||
|
X-Header Client: ABC
|
||||||
|
|
||||||
|
EOF
|
||||||
|
# no http_response($self, 1);
|
||||||
|
},
|
||||||
|
http_vers => ["1.1"],
|
||||||
|
nocheck => 1,
|
||||||
|
method => "GET",
|
||||||
|
},
|
||||||
|
relayd => {
|
||||||
|
protocol => [ "http",
|
||||||
|
"match request header log Host",
|
||||||
|
],
|
||||||
|
loggrep => {
|
||||||
|
qr/, malformed$/ => 1,
|
||||||
|
qr/\[Host: www.foo.com\] GET/ => 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server => {
|
||||||
|
func => \&http_server,
|
||||||
|
nocheck => 1,
|
||||||
|
noserver => 1,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
1;
|
38
regress/usr.sbin/relayd/args-http-invalid-header2.pl
Normal file
38
regress/usr.sbin/relayd/args-http-invalid-header2.pl
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Test that relayd aborts the connection if a header include a NUL byte
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
our %args = (
|
||||||
|
client => {
|
||||||
|
func => sub {
|
||||||
|
my $self = shift;
|
||||||
|
print <<"EOF";
|
||||||
|
GET /1 HTTP/1.1
|
||||||
|
Host: www.foo.com
|
||||||
|
X-Header-Client: ABC\0D
|
||||||
|
|
||||||
|
EOF
|
||||||
|
# no http_response($self, 1);
|
||||||
|
},
|
||||||
|
http_vers => ["1.1"],
|
||||||
|
nocheck => 1,
|
||||||
|
method => "GET",
|
||||||
|
},
|
||||||
|
relayd => {
|
||||||
|
protocol => [ "http",
|
||||||
|
"match request header log Host",
|
||||||
|
],
|
||||||
|
loggrep => {
|
||||||
|
qr/, malformed$/ => 1,
|
||||||
|
qr/\[Host: www.foo.com\] GET/ => 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server => {
|
||||||
|
func => \&http_server,
|
||||||
|
nocheck => 1,
|
||||||
|
noserver => 1,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
1;
|
@ -1,4 +1,4 @@
|
|||||||
.\" $OpenBSD: ugold.4,v 1.7 2023/04/02 17:03:14 miod Exp $
|
.\" $OpenBSD: ugold.4,v 1.8 2023/11/30 20:08:23 miod Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 2013 Takayoshi SASANO <sasano@openbsd.org>
|
.\" Copyright (c) 2013 Takayoshi SASANO <sasano@openbsd.org>
|
||||||
.\" Copyright (c) 2013 Martin Pieuchot <mpi@openbsd.org>
|
.\" Copyright (c) 2013 Martin Pieuchot <mpi@openbsd.org>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
.\"
|
.\"
|
||||||
.Dd $Mdocdate: April 2 2023 $
|
.Dd $Mdocdate: November 30 2023 $
|
||||||
.Dt UGOLD 4
|
.Dt UGOLD 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -35,10 +35,13 @@ driver:
|
|||||||
.It Em "Device" Ta Em "Sensors"
|
.It Em "Device" Ta Em "Sensors"
|
||||||
.It Li "RDing TEMPer1V1.2" Ta "1 Temperature"
|
.It Li "RDing TEMPer1V1.2" Ta "1 Temperature"
|
||||||
.It Li "RDing TEMPerV1.4" Ta "1 Temperature"
|
.It Li "RDing TEMPerV1.4" Ta "1 Temperature"
|
||||||
|
.It Li "RDing TEMPer1F_V4.1" Ta "1 Temperature (external)"
|
||||||
|
.It Li "RDing TEMPer2_V4.1" Ta "2 Temperature (internal/external)"
|
||||||
.It Li "RDing TEMPerGold_V3.1" Ta "1 Temperature"
|
.It Li "RDing TEMPerGold_V3.1" Ta "1 Temperature"
|
||||||
.It Li "RDing TEMPerGold_V3.4" Ta "1 Temperature"
|
.It Li "RDing TEMPerGold_V3.4" Ta "1 Temperature"
|
||||||
.It Li "RDing TEMPerHUM1V1.0" Ta "1 Temperature and 1 Humidity"
|
.It Li "RDing TEMPerHum1V1.0" Ta "1 Temperature and 1 Humidity"
|
||||||
.It Li "RDing TEMPerHUM1V1.2" Ta "1 Temperature and 1 Humidity"
|
.It Li "RDing TEMPerHum1V1.2" Ta "1 Temperature and 1 Humidity"
|
||||||
|
.It Li "RDing TEMPerHUM_V4.0" Ta "1 Temperature and 1 Humidity"
|
||||||
.It Li "RDing TEMPer1F_H1V1.5F" Ta "1 Temperature and 1 Humidity"
|
.It Li "RDing TEMPer1F_H1V1.5F" Ta "1 Temperature and 1 Humidity"
|
||||||
.It Li "RDing TEMPerX_V3.1" Ta "1 Temperature and 1 Humidity"
|
.It Li "RDing TEMPerX_V3.1" Ta "1 Temperature and 1 Humidity"
|
||||||
.It Li "RDing TEMPerX_V3.3" Ta "1 Temperature and 1 Humidity"
|
.It Li "RDing TEMPerX_V3.3" Ta "1 Temperature and 1 Humidity"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
$OpenBSD: pcidevs,v 1.2058 2023/11/29 06:46:29 jmatthew Exp $
|
$OpenBSD: pcidevs,v 1.2059 2023/12/01 05:48:39 jsg Exp $
|
||||||
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -818,6 +818,22 @@ product AMD 19_6X_DF_5 0x14e4 19h/6xh Data Fabric
|
|||||||
product AMD 19_6X_DF_6 0x14e5 19h/6xh Data Fabric
|
product AMD 19_6X_DF_6 0x14e5 19h/6xh Data Fabric
|
||||||
product AMD 19_6X_DF_7 0x14e6 19h/6xh Data Fabric
|
product AMD 19_6X_DF_7 0x14e6 19h/6xh Data Fabric
|
||||||
product AMD 19_6X_DF_8 0x14e7 19h/6xh Data Fabric
|
product AMD 19_6X_DF_8 0x14e7 19h/6xh Data Fabric
|
||||||
|
product AMD 19_7X_RC 0x14e8 19h/7xh Root Complex
|
||||||
|
product AMD 19_7X_IOMMU 0x14e9 19h/7xh IOMMU
|
||||||
|
product AMD 19_7X_HB 0x14ea 19h/7xh Host
|
||||||
|
product AMD 19_7X_PCIE_1 0x14eb 19h/7xh PCIE
|
||||||
|
product AMD 19_7X_PCIE_2 0x14ed 19h/7xh PCIE
|
||||||
|
product AMD 19_7X_PCIE_3 0x14ee 19h/7xh PCIE
|
||||||
|
product AMD 19_7X_PCIE_4 0x14ef 19h/7xh PCIE
|
||||||
|
product AMD 19_7X_DF_1 0x14f0 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_2 0x14f1 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_3 0x14f2 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_4 0x14f3 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_5 0x14f4 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_6 0x14f5 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_7 0x14f6 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_DF_8 0x14f7 19h/7xh Data Fabric
|
||||||
|
product AMD 19_7X_IPU 0x1502 19h/7xh IPU
|
||||||
product AMD 14_HB 0x1510 14h Host
|
product AMD 14_HB 0x1510 14h Host
|
||||||
product AMD 14_PCIE_1 0x1512 14h PCIE
|
product AMD 14_PCIE_1 0x1512 14h PCIE
|
||||||
product AMD 14_PCIE_2 0x1513 14h PCIE
|
product AMD 14_PCIE_2 0x1513 14h PCIE
|
||||||
@ -855,6 +871,11 @@ product AMD 16_3X_MISC_2 0x1585 16h Misc Cfg
|
|||||||
product AMD 19_6X_XHCI_1 0x15b6 19h/6xh xHCI
|
product AMD 19_6X_XHCI_1 0x15b6 19h/6xh xHCI
|
||||||
product AMD 19_6X_XHCI_2 0x15b7 19h/6xh xHCI
|
product AMD 19_6X_XHCI_2 0x15b7 19h/6xh xHCI
|
||||||
product AMD 19_6X_XHCI_3 0x15b8 19h/6xh xHCI
|
product AMD 19_6X_XHCI_3 0x15b8 19h/6xh xHCI
|
||||||
|
product AMD 19_7X_XHCI_1 0x15b9 19h/7xh xHCI
|
||||||
|
product AMD 19_7X_XHCI_2 0x15ba 19h/7xh xHCI
|
||||||
|
product AMD 19_7X_XHCI_3 0x15c0 19h/7xh xHCI
|
||||||
|
product AMD 19_7X_XHCI_4 0x15c1 19h/7xh xHCI
|
||||||
|
product AMD 19_7X_PSP 0x15c7 19h/7xh PSP
|
||||||
product AMD 17_1X_RC 0x15d0 17h/1xh Root Complex
|
product AMD 17_1X_RC 0x15d0 17h/1xh Root Complex
|
||||||
product AMD 17_1X_IOMMU 0x15d1 17h/1xh IOMMU
|
product AMD 17_1X_IOMMU 0x15d1 17h/1xh IOMMU
|
||||||
product AMD 17_1X_PCIE_1 0x15d3 17h/1xh PCIE
|
product AMD 17_1X_PCIE_1 0x15d3 17h/1xh PCIE
|
||||||
@ -906,6 +927,8 @@ product AMD 17_90_DF_4 0x1664 17h/90h Data Fabric
|
|||||||
product AMD 17_90_DF_5 0x1665 17h/90h Data Fabric
|
product AMD 17_90_DF_5 0x1665 17h/90h Data Fabric
|
||||||
product AMD 17_90_DF_6 0x1666 17h/90h Data Fabric
|
product AMD 17_90_DF_6 0x1666 17h/90h Data Fabric
|
||||||
product AMD 17_90_DF_7 0x1667 17h/90h Data Fabric
|
product AMD 17_90_DF_7 0x1667 17h/90h Data Fabric
|
||||||
|
product AMD 19_7X_USB4_1 0x1668 19h/7xh USB4
|
||||||
|
product AMD 19_7X_USB4_2 0x1669 19h/7xh USB4
|
||||||
product AMD 19_5X_DF_0 0x166a 19h/5xh Data Fabric
|
product AMD 19_5X_DF_0 0x166a 19h/5xh Data Fabric
|
||||||
product AMD 19_5X_DF_1 0x166b 19h/5xh Data Fabric
|
product AMD 19_5X_DF_1 0x166b 19h/5xh Data Fabric
|
||||||
product AMD 19_5X_DF_2 0x166c 19h/5xh Data Fabric
|
product AMD 19_5X_DF_2 0x166c 19h/5xh Data Fabric
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
|
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
|
||||||
*
|
*
|
||||||
* generated from:
|
* generated from:
|
||||||
* OpenBSD: pcidevs,v 1.2058 2023/11/29 06:46:29 jmatthew Exp
|
* OpenBSD: pcidevs,v 1.2059 2023/12/01 05:48:39 jsg Exp
|
||||||
*/
|
*/
|
||||||
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
||||||
|
|
||||||
@ -823,6 +823,22 @@
|
|||||||
#define PCI_PRODUCT_AMD_19_6X_DF_6 0x14e5 /* 19h/6xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_6X_DF_6 0x14e5 /* 19h/6xh Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_19_6X_DF_7 0x14e6 /* 19h/6xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_6X_DF_7 0x14e6 /* 19h/6xh Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_19_6X_DF_8 0x14e7 /* 19h/6xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_6X_DF_8 0x14e7 /* 19h/6xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_RC 0x14e8 /* 19h/7xh Root Complex */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_IOMMU 0x14e9 /* 19h/7xh IOMMU */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_HB 0x14ea /* 19h/7xh Host */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_PCIE_1 0x14eb /* 19h/7xh PCIE */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_PCIE_2 0x14ed /* 19h/7xh PCIE */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_PCIE_3 0x14ee /* 19h/7xh PCIE */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_PCIE_4 0x14ef /* 19h/7xh PCIE */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_1 0x14f0 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_2 0x14f1 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_3 0x14f2 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_4 0x14f3 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_5 0x14f4 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_6 0x14f5 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_7 0x14f6 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_DF_8 0x14f7 /* 19h/7xh Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_IPU 0x1502 /* 19h/7xh IPU */
|
||||||
#define PCI_PRODUCT_AMD_14_HB 0x1510 /* 14h Host */
|
#define PCI_PRODUCT_AMD_14_HB 0x1510 /* 14h Host */
|
||||||
#define PCI_PRODUCT_AMD_14_PCIE_1 0x1512 /* 14h PCIE */
|
#define PCI_PRODUCT_AMD_14_PCIE_1 0x1512 /* 14h PCIE */
|
||||||
#define PCI_PRODUCT_AMD_14_PCIE_2 0x1513 /* 14h PCIE */
|
#define PCI_PRODUCT_AMD_14_PCIE_2 0x1513 /* 14h PCIE */
|
||||||
@ -860,6 +876,11 @@
|
|||||||
#define PCI_PRODUCT_AMD_19_6X_XHCI_1 0x15b6 /* 19h/6xh xHCI */
|
#define PCI_PRODUCT_AMD_19_6X_XHCI_1 0x15b6 /* 19h/6xh xHCI */
|
||||||
#define PCI_PRODUCT_AMD_19_6X_XHCI_2 0x15b7 /* 19h/6xh xHCI */
|
#define PCI_PRODUCT_AMD_19_6X_XHCI_2 0x15b7 /* 19h/6xh xHCI */
|
||||||
#define PCI_PRODUCT_AMD_19_6X_XHCI_3 0x15b8 /* 19h/6xh xHCI */
|
#define PCI_PRODUCT_AMD_19_6X_XHCI_3 0x15b8 /* 19h/6xh xHCI */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_XHCI_1 0x15b9 /* 19h/7xh xHCI */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_XHCI_2 0x15ba /* 19h/7xh xHCI */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_XHCI_3 0x15c0 /* 19h/7xh xHCI */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_XHCI_4 0x15c1 /* 19h/7xh xHCI */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_PSP 0x15c7 /* 19h/7xh PSP */
|
||||||
#define PCI_PRODUCT_AMD_17_1X_RC 0x15d0 /* 17h/1xh Root Complex */
|
#define PCI_PRODUCT_AMD_17_1X_RC 0x15d0 /* 17h/1xh Root Complex */
|
||||||
#define PCI_PRODUCT_AMD_17_1X_IOMMU 0x15d1 /* 17h/1xh IOMMU */
|
#define PCI_PRODUCT_AMD_17_1X_IOMMU 0x15d1 /* 17h/1xh IOMMU */
|
||||||
#define PCI_PRODUCT_AMD_17_1X_PCIE_1 0x15d3 /* 17h/1xh PCIE */
|
#define PCI_PRODUCT_AMD_17_1X_PCIE_1 0x15d3 /* 17h/1xh PCIE */
|
||||||
@ -911,6 +932,8 @@
|
|||||||
#define PCI_PRODUCT_AMD_17_90_DF_5 0x1665 /* 17h/90h Data Fabric */
|
#define PCI_PRODUCT_AMD_17_90_DF_5 0x1665 /* 17h/90h Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_17_90_DF_6 0x1666 /* 17h/90h Data Fabric */
|
#define PCI_PRODUCT_AMD_17_90_DF_6 0x1666 /* 17h/90h Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_17_90_DF_7 0x1667 /* 17h/90h Data Fabric */
|
#define PCI_PRODUCT_AMD_17_90_DF_7 0x1667 /* 17h/90h Data Fabric */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_USB4_1 0x1668 /* 19h/7xh USB4 */
|
||||||
|
#define PCI_PRODUCT_AMD_19_7X_USB4_2 0x1669 /* 19h/7xh USB4 */
|
||||||
#define PCI_PRODUCT_AMD_19_5X_DF_0 0x166a /* 19h/5xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_5X_DF_0 0x166a /* 19h/5xh Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_19_5X_DF_1 0x166b /* 19h/5xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_5X_DF_1 0x166b /* 19h/5xh Data Fabric */
|
||||||
#define PCI_PRODUCT_AMD_19_5X_DF_2 0x166c /* 19h/5xh Data Fabric */
|
#define PCI_PRODUCT_AMD_19_5X_DF_2 0x166c /* 19h/5xh Data Fabric */
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
|
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
|
||||||
*
|
*
|
||||||
* generated from:
|
* generated from:
|
||||||
* OpenBSD: pcidevs,v 1.2058 2023/11/29 06:46:29 jmatthew Exp
|
* OpenBSD: pcidevs,v 1.2059 2023/12/01 05:48:39 jsg Exp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
|
||||||
@ -1535,6 +1535,70 @@ static const struct pci_known_product pci_known_products[] = {
|
|||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_6X_DF_8,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_6X_DF_8,
|
||||||
"19h/6xh Data Fabric",
|
"19h/6xh Data Fabric",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_RC,
|
||||||
|
"19h/7xh Root Complex",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_IOMMU,
|
||||||
|
"19h/7xh IOMMU",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_HB,
|
||||||
|
"19h/7xh Host",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_PCIE_1,
|
||||||
|
"19h/7xh PCIE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_PCIE_2,
|
||||||
|
"19h/7xh PCIE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_PCIE_3,
|
||||||
|
"19h/7xh PCIE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_PCIE_4,
|
||||||
|
"19h/7xh PCIE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_1,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_2,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_3,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_4,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_5,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_6,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_7,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_DF_8,
|
||||||
|
"19h/7xh Data Fabric",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_IPU,
|
||||||
|
"19h/7xh IPU",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_14_HB,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_14_HB,
|
||||||
"14h Host",
|
"14h Host",
|
||||||
@ -1683,6 +1747,26 @@ static const struct pci_known_product pci_known_products[] = {
|
|||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_6X_XHCI_3,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_6X_XHCI_3,
|
||||||
"19h/6xh xHCI",
|
"19h/6xh xHCI",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_XHCI_1,
|
||||||
|
"19h/7xh xHCI",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_XHCI_2,
|
||||||
|
"19h/7xh xHCI",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_XHCI_3,
|
||||||
|
"19h/7xh xHCI",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_XHCI_4,
|
||||||
|
"19h/7xh xHCI",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_PSP,
|
||||||
|
"19h/7xh PSP",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_1X_RC,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_1X_RC,
|
||||||
"17h/1xh Root Complex",
|
"17h/1xh Root Complex",
|
||||||
@ -1887,6 +1971,14 @@ static const struct pci_known_product pci_known_products[] = {
|
|||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_90_DF_7,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_90_DF_7,
|
||||||
"17h/90h Data Fabric",
|
"17h/90h Data Fabric",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_USB4_1,
|
||||||
|
"19h/7xh USB4",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_7X_USB4_2,
|
||||||
|
"19h/7xh USB4",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_5X_DF_0,
|
PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_5X_DF_0,
|
||||||
"19h/5xh Data Fabric",
|
"19h/5xh Data Fabric",
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
/* $OpenBSD: ugold.c,v 1.23 2023/04/19 04:51:53 miod Exp $ */
|
/* $OpenBSD: ugold.c,v 1.24 2023/11/30 20:08:23 miod Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Takayoshi SASANO <uaa@openbsd.org>
|
* Copyright (c) 2013 Takayoshi SASANO <uaa@openbsd.org>
|
||||||
* Copyright (c) 2013 Martin Pieuchot <mpi@openbsd.org>
|
* Copyright (c) 2013 Martin Pieuchot <mpi@openbsd.org>
|
||||||
* Copyright (c) 2015 Joerg Jung <jung@openbsd.org>
|
* Copyright (c) 2015 Joerg Jung <jung@openbsd.org>
|
||||||
|
* Copyright (c) 2023 Miodrag Vallat.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@ -44,11 +45,13 @@
|
|||||||
#define UGOLD_CMD_DATA 0x80
|
#define UGOLD_CMD_DATA 0x80
|
||||||
#define UGOLD_CMD_INIT 0x82
|
#define UGOLD_CMD_INIT 0x82
|
||||||
|
|
||||||
|
#define UGOLD_TYPE_INVALID -1
|
||||||
#define UGOLD_TYPE_SI7005 1
|
#define UGOLD_TYPE_SI7005 1
|
||||||
#define UGOLD_TYPE_SI7006 2
|
#define UGOLD_TYPE_SI7006 2
|
||||||
#define UGOLD_TYPE_SHT1X 3
|
#define UGOLD_TYPE_SHT1X 3
|
||||||
#define UGOLD_TYPE_GOLD 4
|
#define UGOLD_TYPE_GOLD 4
|
||||||
#define UGOLD_TYPE_TEMPERX 5
|
#define UGOLD_TYPE_TEMPERX 5
|
||||||
|
#define UGOLD_TYPE_DS75 6
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This driver uses three known commands for the TEMPer and TEMPerHUM
|
* This driver uses three known commands for the TEMPer and TEMPerHUM
|
||||||
@ -69,6 +72,13 @@
|
|||||||
static uint8_t cmd_data[8] = { 0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
static uint8_t cmd_data[8] = { 0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
||||||
static uint8_t cmd_init[8] = { 0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
static uint8_t cmd_init[8] = { 0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
||||||
static uint8_t cmd_type[8] = { 0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
static uint8_t cmd_type[8] = { 0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
/*
|
||||||
|
* The following command is also recognized and reports some kind of status
|
||||||
|
* byte (i.e. 87 xx 00 00 00 00 00 00).
|
||||||
|
{ 0x01, 0x87, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct ugold_softc;
|
||||||
|
|
||||||
struct ugold_softc {
|
struct ugold_softc {
|
||||||
struct uhidev sc_hdev;
|
struct uhidev sc_hdev;
|
||||||
@ -77,15 +87,21 @@ struct ugold_softc {
|
|||||||
int sc_num_sensors;
|
int sc_num_sensors;
|
||||||
int sc_type;
|
int sc_type;
|
||||||
|
|
||||||
|
char sc_model[16 + 1];
|
||||||
|
unsigned int sc_model_len;
|
||||||
|
|
||||||
struct ksensor sc_sensor[UGOLD_MAX_SENSORS];
|
struct ksensor sc_sensor[UGOLD_MAX_SENSORS];
|
||||||
struct ksensordev sc_sensordev;
|
struct ksensordev sc_sensordev;
|
||||||
struct sensor_task *sc_sensortask;
|
struct sensor_task *sc_sensortask;
|
||||||
|
|
||||||
|
void (*sc_intr)(struct ugold_softc *, uint8_t *, u_int);
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct usb_devno ugold_devs[] = {
|
const struct usb_devno ugold_devs[] = {
|
||||||
{ USB_VENDOR_MICRODIA, USB_PRODUCT_MICRODIA_TEMPER },
|
{ USB_VENDOR_MICRODIA, USB_PRODUCT_MICRODIA_TEMPER },
|
||||||
{ USB_VENDOR_MICRODIA, USB_PRODUCT_MICRODIA_TEMPERHUM },
|
{ USB_VENDOR_MICRODIA, USB_PRODUCT_MICRODIA_TEMPERHUM },
|
||||||
{ USB_VENDOR_PCSENSORS, USB_PRODUCT_PCSENSORS_TEMPER },
|
{ USB_VENDOR_PCSENSORS, USB_PRODUCT_PCSENSORS_TEMPER },
|
||||||
|
{ USB_VENDOR_RDING, USB_PRODUCT_RDING_TEMPER },
|
||||||
{ USB_VENDOR_WCH2, USB_PRODUCT_WCH2_TEMPER },
|
{ USB_VENDOR_WCH2, USB_PRODUCT_WCH2_TEMPER },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,8 +109,10 @@ int ugold_match(struct device *, void *, void *);
|
|||||||
void ugold_attach(struct device *, struct device *, void *);
|
void ugold_attach(struct device *, struct device *, void *);
|
||||||
int ugold_detach(struct device *, int);
|
int ugold_detach(struct device *, int);
|
||||||
|
|
||||||
void ugold_ds75_intr(struct uhidev *, void *, u_int);
|
void ugold_setup_sensors(struct ugold_softc *);
|
||||||
void ugold_si700x_intr(struct uhidev *, void *, u_int);
|
void ugold_intr(struct uhidev *, void *, u_int);
|
||||||
|
void ugold_ds75_intr(struct ugold_softc *, uint8_t *, u_int);
|
||||||
|
void ugold_si700x_intr(struct ugold_softc *, uint8_t *, u_int);
|
||||||
void ugold_refresh(void *);
|
void ugold_refresh(void *);
|
||||||
|
|
||||||
int ugold_issue_cmd(struct ugold_softc *, uint8_t *, int);
|
int ugold_issue_cmd(struct ugold_softc *, uint8_t *, int);
|
||||||
@ -146,14 +164,16 @@ ugold_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
sc->sc_udev = uha->parent->sc_udev;
|
sc->sc_udev = uha->parent->sc_udev;
|
||||||
sc->sc_hdev.sc_parent = uha->parent;
|
sc->sc_hdev.sc_parent = uha->parent;
|
||||||
sc->sc_hdev.sc_report_id = uha->reportid;
|
sc->sc_hdev.sc_report_id = uha->reportid;
|
||||||
|
sc->sc_hdev.sc_intr = ugold_intr;
|
||||||
switch (uha->uaa->product) {
|
switch (uha->uaa->product) {
|
||||||
case USB_PRODUCT_MICRODIA_TEMPER:
|
case USB_PRODUCT_MICRODIA_TEMPER:
|
||||||
sc->sc_hdev.sc_intr = ugold_ds75_intr;
|
sc->sc_intr = ugold_ds75_intr;
|
||||||
break;
|
break;
|
||||||
case USB_PRODUCT_MICRODIA_TEMPERHUM:
|
case USB_PRODUCT_MICRODIA_TEMPERHUM:
|
||||||
case USB_PRODUCT_PCSENSORS_TEMPER:
|
case USB_PRODUCT_PCSENSORS_TEMPER:
|
||||||
|
case USB_PRODUCT_RDING_TEMPER:
|
||||||
case USB_PRODUCT_WCH2_TEMPER:
|
case USB_PRODUCT_WCH2_TEMPER:
|
||||||
sc->sc_hdev.sc_intr = ugold_si700x_intr;
|
sc->sc_intr = ugold_si700x_intr;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf(", unknown product\n");
|
printf(", unknown product\n");
|
||||||
@ -174,33 +194,7 @@ ugold_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
strlcpy(sc->sc_sensordev.xname, sc->sc_hdev.sc_dev.dv_xname,
|
strlcpy(sc->sc_sensordev.xname, sc->sc_hdev.sc_dev.dv_xname,
|
||||||
sizeof(sc->sc_sensordev.xname));
|
sizeof(sc->sc_sensordev.xname));
|
||||||
|
|
||||||
switch (uha->uaa->product) {
|
/* 0.166Hz */
|
||||||
case USB_PRODUCT_MICRODIA_TEMPER:
|
|
||||||
/* 2 temperature sensors */
|
|
||||||
sc->sc_sensor[UGOLD_INNER].type = SENSOR_TEMP;
|
|
||||||
strlcpy(sc->sc_sensor[UGOLD_INNER].desc, "inner",
|
|
||||||
sizeof(sc->sc_sensor[UGOLD_INNER].desc));
|
|
||||||
sc->sc_sensor[UGOLD_OUTER].type = SENSOR_TEMP;
|
|
||||||
strlcpy(sc->sc_sensor[UGOLD_OUTER].desc, "outer",
|
|
||||||
sizeof(sc->sc_sensor[UGOLD_OUTER].desc));
|
|
||||||
break;
|
|
||||||
case USB_PRODUCT_MICRODIA_TEMPERHUM:
|
|
||||||
case USB_PRODUCT_PCSENSORS_TEMPER:
|
|
||||||
case USB_PRODUCT_WCH2_TEMPER:
|
|
||||||
/* 1 temperature and 1 humidity sensor */
|
|
||||||
sc->sc_sensor[UGOLD_INNER].type = SENSOR_TEMP;
|
|
||||||
strlcpy(sc->sc_sensor[UGOLD_INNER].desc, "inner",
|
|
||||||
sizeof(sc->sc_sensor[UGOLD_INNER].desc));
|
|
||||||
sc->sc_sensor[UGOLD_HUM].type = SENSOR_HUMIDITY;
|
|
||||||
strlcpy(sc->sc_sensor[UGOLD_HUM].desc, "RH",
|
|
||||||
sizeof(sc->sc_sensor[UGOLD_HUM].desc));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf(", unknown product\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 0.1Hz */
|
|
||||||
sc->sc_sensortask = sensor_task_register(sc, ugold_refresh, 6);
|
sc->sc_sensortask = sensor_task_register(sc, ugold_refresh, 6);
|
||||||
if (sc->sc_sensortask == NULL) {
|
if (sc->sc_sensortask == NULL) {
|
||||||
printf(", unable to register update task\n");
|
printf(", unable to register update task\n");
|
||||||
@ -208,6 +202,9 @@ ugold_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
/* speed up sensor identification */
|
||||||
|
ugold_refresh(sc);
|
||||||
|
|
||||||
sensordev_install(&sc->sc_sensordev);
|
sensordev_install(&sc->sc_sensordev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,8 +219,10 @@ ugold_detach(struct device *self, int flags)
|
|||||||
sensordev_deinstall(&sc->sc_sensordev);
|
sensordev_deinstall(&sc->sc_sensordev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sc->sc_type != UGOLD_TYPE_INVALID) {
|
||||||
for (i = 0; i < sc->sc_num_sensors; i++)
|
for (i = 0; i < sc->sc_num_sensors; i++)
|
||||||
sensor_detach(&sc->sc_sensordev, &sc->sc_sensor[i]);
|
sensor_detach(&sc->sc_sensordev, &sc->sc_sensor[i]);
|
||||||
|
}
|
||||||
|
|
||||||
if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
|
if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
|
||||||
uhidev_close(&sc->sc_hdev);
|
uhidev_close(&sc->sc_hdev);
|
||||||
@ -231,6 +230,72 @@ ugold_detach(struct device *self, int flags)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ugold_setup_sensors(struct ugold_softc *sc)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch (sc->sc_type) {
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
case UGOLD_TYPE_SI7005:
|
||||||
|
case UGOLD_TYPE_SI7006:
|
||||||
|
case UGOLD_TYPE_SHT1X:
|
||||||
|
case UGOLD_TYPE_TEMPERX:
|
||||||
|
/* 1 temperature and 1 humidity sensor */
|
||||||
|
sc->sc_sensor[UGOLD_INNER].type = SENSOR_TEMP;
|
||||||
|
strlcpy(sc->sc_sensor[UGOLD_INNER].desc, "inner",
|
||||||
|
sizeof(sc->sc_sensor[UGOLD_INNER].desc));
|
||||||
|
sc->sc_sensor[UGOLD_HUM].type = SENSOR_HUMIDITY;
|
||||||
|
strlcpy(sc->sc_sensor[UGOLD_HUM].desc, "RH",
|
||||||
|
sizeof(sc->sc_sensor[UGOLD_HUM].desc));
|
||||||
|
break;
|
||||||
|
case UGOLD_TYPE_GOLD:
|
||||||
|
case UGOLD_TYPE_DS75:
|
||||||
|
/* up to 2 temperature sensors */
|
||||||
|
sc->sc_sensor[UGOLD_INNER].type = SENSOR_TEMP;
|
||||||
|
strlcpy(sc->sc_sensor[UGOLD_INNER].desc, "inner",
|
||||||
|
sizeof(sc->sc_sensor[UGOLD_INNER].desc));
|
||||||
|
sc->sc_sensor[UGOLD_OUTER].type = SENSOR_TEMP;
|
||||||
|
strlcpy(sc->sc_sensor[UGOLD_OUTER].desc, "outer",
|
||||||
|
sizeof(sc->sc_sensor[UGOLD_OUTER].desc));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (i = 0; i < sc->sc_num_sensors; i++) {
|
||||||
|
sc->sc_sensor[i].flags |= SENSOR_FINVALID;
|
||||||
|
sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
strnvis(char *dst, const char *src, size_t siz)
|
||||||
|
{
|
||||||
|
char *start, *end;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (start = dst, end = start + siz - 1; (c = *src) && dst < end; ) {
|
||||||
|
if (c >= 0x20 && c <= 0x7f) {
|
||||||
|
if (c == '\\') {
|
||||||
|
/* need space for the extra '\\' */
|
||||||
|
if (dst + 2 > end)
|
||||||
|
break;
|
||||||
|
*dst++ = '\\';
|
||||||
|
}
|
||||||
|
*dst++ = c;
|
||||||
|
} else {
|
||||||
|
if (dst + 4 > end)
|
||||||
|
break;
|
||||||
|
*dst++ = '\\';
|
||||||
|
*dst++ = ((u_char)c >> 6 & 07) + '0';
|
||||||
|
*dst++ = ((u_char)c >> 3 & 07) + '0';
|
||||||
|
*dst++ = ((u_char)c & 07) + '0';
|
||||||
|
}
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
if (siz > 0)
|
||||||
|
*dst = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ugold_ds75_temp(uint8_t msb, uint8_t lsb)
|
ugold_ds75_temp(uint8_t msb, uint8_t lsb)
|
||||||
{
|
{
|
||||||
@ -239,39 +304,42 @@ ugold_ds75_temp(uint8_t msb, uint8_t lsb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ugold_ds75_type(struct ugold_softc *sc, uint8_t *buf, u_int len)
|
ugold_ds75_type(struct ugold_softc *sc)
|
||||||
{
|
{
|
||||||
if (memcmp(buf, "TEMPer1F", len) == 0 ||
|
char model[4 * sizeof(sc->sc_model) + 1];
|
||||||
memcmp(buf, "TEMPer2F", len) == 0 ||
|
|
||||||
memcmp(buf, "TEMPerF1", len) == 0)
|
|
||||||
return; /* skip first half of the answer */
|
|
||||||
|
|
||||||
printf("%s: %d sensor%s type ds75/12bit (temperature)\n",
|
strnvis(model, sc->sc_model, sizeof model);
|
||||||
sc->sc_hdev.sc_dev.dv_xname, sc->sc_num_sensors,
|
|
||||||
|
if (memcmp(sc->sc_model, "TEMPer1F", 8) == 0 ||
|
||||||
|
memcmp(sc->sc_model, "TEMPer2F", 8) == 0 ||
|
||||||
|
memcmp(sc->sc_model, "TEMPerF1", 8) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_DS75;
|
||||||
|
ugold_setup_sensors(sc);
|
||||||
|
printf("%s: \"%s\", %d sensor%s"
|
||||||
|
" type ds75/12bit (temperature)\n",
|
||||||
|
sc->sc_hdev.sc_dev.dv_xname, model, sc->sc_num_sensors,
|
||||||
(sc->sc_num_sensors == 1) ? "" : "s");
|
(sc->sc_num_sensors == 1) ? "" : "s");
|
||||||
|
ugold_refresh(sc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sc->sc_type = -1; /* ignore type */
|
printf("%s: unknown model \"%s\"\n",
|
||||||
|
sc->sc_hdev.sc_dev.dv_xname, model);
|
||||||
|
sc->sc_num_sensors = 0;
|
||||||
|
sc->sc_type = UGOLD_TYPE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ugold_ds75_intr(struct uhidev *addr, void *ibuf, u_int len)
|
ugold_ds75_intr(struct ugold_softc *sc, uint8_t *buf, u_int len)
|
||||||
{
|
{
|
||||||
struct ugold_softc *sc = (struct ugold_softc *)addr;
|
int temp;
|
||||||
uint8_t *buf = ibuf;
|
|
||||||
int i, temp;
|
|
||||||
|
|
||||||
switch (buf[0]) {
|
switch (buf[0]) {
|
||||||
case UGOLD_CMD_INIT:
|
case UGOLD_CMD_INIT:
|
||||||
if (sc->sc_num_sensors)
|
if (sc->sc_num_sensors != 0)
|
||||||
break;
|
break;
|
||||||
|
sc->sc_num_sensors = imin(buf[1], UGOLD_MAX_SENSORS) /* XXX */;
|
||||||
sc->sc_num_sensors = min(buf[1], UGOLD_MAX_SENSORS) /* XXX */;
|
ugold_refresh(sc);
|
||||||
|
|
||||||
for (i = 0; i < sc->sc_num_sensors; i++) {
|
|
||||||
sc->sc_sensor[i].flags |= SENSOR_FINVALID;
|
|
||||||
sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case UGOLD_CMD_DATA:
|
case UGOLD_CMD_DATA:
|
||||||
switch (buf[1]) {
|
switch (buf[1]) {
|
||||||
@ -286,18 +354,17 @@ ugold_ds75_intr(struct uhidev *addr, void *ibuf, u_int len)
|
|||||||
sc->sc_sensor[UGOLD_INNER].flags &= ~SENSOR_FINVALID;
|
sc->sc_sensor[UGOLD_INNER].flags &= ~SENSOR_FINVALID;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
#ifdef UGOLD_DEBUG
|
||||||
printf("%s: invalid data length (%d bytes)\n",
|
printf("%s: invalid data length (%d bytes)\n",
|
||||||
sc->sc_hdev.sc_dev.dv_xname, buf[1]);
|
sc->sc_hdev.sc_dev.dv_xname, buf[1]);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!sc->sc_type) { /* type command returns arbitrary string */
|
ugold_ds75_type(sc);
|
||||||
ugold_ds75_type(sc, buf, len);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf("%s: unknown command 0x%02x\n",
|
|
||||||
sc->sc_hdev.sc_dev.dv_xname, buf[0]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -362,74 +429,146 @@ ugold_si700x_rhum(int type, uint8_t msb, uint8_t lsb, int temp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ugold_si700x_type(struct ugold_softc *sc, uint8_t *buf, u_int len)
|
ugold_si700x_type(struct ugold_softc *sc)
|
||||||
{
|
{
|
||||||
if (memcmp(buf, "TEMPerHu", len) == 0 ||
|
char model[4 * sizeof(sc->sc_model) + 1];
|
||||||
memcmp(buf, "TEMPer1F", len) == 0 ||
|
const char *descr;
|
||||||
memcmp(buf, "TEMPerX_", len) == 0 ||
|
int nsensors = 0;
|
||||||
memcmp(buf, "TEMPerGo", len) == 0)
|
|
||||||
return; /* skip equal first half of the answer */
|
|
||||||
|
|
||||||
printf("%s: %d sensor%s type ", sc->sc_hdev.sc_dev.dv_xname,
|
strnvis(model, sc->sc_model, sizeof model);
|
||||||
sc->sc_num_sensors, (sc->sc_num_sensors == 1) ? "" : "s");
|
|
||||||
|
|
||||||
if (memcmp(buf, "mM12V1.0", len) == 0) {
|
/* TEMPerHUM prefix */
|
||||||
|
if (sc->sc_model_len >= 9 &&
|
||||||
|
memcmp(sc->sc_model, "TEMPerHum", 9) == 0) {
|
||||||
|
if (memcmp(sc->sc_model + 9, "M12V1.0", 16 - 9) == 0) {
|
||||||
sc->sc_type = UGOLD_TYPE_SI7005;
|
sc->sc_type = UGOLD_TYPE_SI7005;
|
||||||
printf("si7005 (temperature and humidity)\n");
|
descr = "si7005 (temperature and humidity)";
|
||||||
} else if (memcmp(buf, "mM12V1.2", len) == 0) {
|
goto identified;
|
||||||
sc->sc_type = UGOLD_TYPE_SI7006;
|
|
||||||
printf("si7006 (temperature and humidity)\n");
|
|
||||||
} else if (memcmp(buf, "_H1V1.5F", len) == 0) {
|
|
||||||
sc->sc_type = UGOLD_TYPE_SHT1X;
|
|
||||||
printf("sht1x (temperature and humidity)\n");
|
|
||||||
} else if (memcmp(buf, "V3.1 ", len) == 0) {
|
|
||||||
sc->sc_type = UGOLD_TYPE_TEMPERX;
|
|
||||||
printf("temperx (temperature and humidity)\n");
|
|
||||||
} else if (memcmp(buf, "V3.3 ", len) == 0) {
|
|
||||||
sc->sc_type = UGOLD_TYPE_TEMPERX;
|
|
||||||
printf("temperx (temperature and humidity)\n");
|
|
||||||
} else if (memcmp(buf, "ld_V3.1 ", len) == 0) {
|
|
||||||
sc->sc_type = UGOLD_TYPE_GOLD;
|
|
||||||
printf("gold (temperature only)\n");
|
|
||||||
} else if (memcmp(buf, "ld_V3.4 ", len) == 0) {
|
|
||||||
sc->sc_type = UGOLD_TYPE_GOLD;
|
|
||||||
printf("gold (temperature only)\n");
|
|
||||||
} else {
|
|
||||||
sc->sc_type = -1;
|
|
||||||
printf("unknown\n");
|
|
||||||
}
|
}
|
||||||
|
if (memcmp(sc->sc_model + 9, "M12V1.2", 16 - 9) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_SI7006;
|
||||||
|
descr = "si7006 (temperature and humidity)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sc->sc_model_len >= 9 &&
|
||||||
|
memcmp(sc->sc_model, "TEMPerHUM", 9) == 0) {
|
||||||
|
if (memcmp(sc->sc_model + 9, "_V4.0 ", 16 - 9) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_TEMPERX;
|
||||||
|
descr = "temperx (temperature and humidity)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TEMPerX prefix */
|
||||||
|
if (sc->sc_model_len >= 8 &&
|
||||||
|
memcmp(sc->sc_model, "TEMPerX_", 8) == 0) {
|
||||||
|
if (memcmp(sc->sc_model + 8, "V3.1 ", 16 - 8) == 0 ||
|
||||||
|
memcmp(sc->sc_model + 8, "V3.3 ", 16 - 8) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_TEMPERX;
|
||||||
|
descr = "temperx (temperature and humidity)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TEMPer1F or TEMPer2_ prefixes */
|
||||||
|
if (sc->sc_model_len >= 16 &&
|
||||||
|
memcmp(sc->sc_model, "TEMPer1F_H1V1.5F", 16) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_SHT1X;
|
||||||
|
descr = "sht1x (temperature and humidity)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
if (sc->sc_model_len >= 16 &&
|
||||||
|
(memcmp(sc->sc_model, "TEMPer1F_V4.1\0\0\0", 16) == 0 ||
|
||||||
|
memcmp(sc->sc_model, "TEMPer2_V4.1\0\0\0\0", 16) == 0)) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_GOLD;
|
||||||
|
/*
|
||||||
|
* TEMPer1F devices lack the internal sensor, but will never
|
||||||
|
* report data for it, so it will never gets marked as valid.
|
||||||
|
* We thus keep the value of sc_num_sensors unchanged at 2,
|
||||||
|
* and make sure we will only report one single sensor below.
|
||||||
|
*/
|
||||||
|
if (sc->sc_model[6] == '1')
|
||||||
|
nsensors = 1;
|
||||||
|
descr = "gold (temperature only)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TEMPerGold prefix */
|
||||||
|
if (sc->sc_model_len >= 11 &&
|
||||||
|
memcmp(sc->sc_model, "TEMPerGold_", 11) == 0) {
|
||||||
|
if (memcmp(sc->sc_model + 11, "V3.1 ", 16 - 11) == 0 ||
|
||||||
|
memcmp(sc->sc_model + 11, "V3.4 ", 16 - 11) == 0) {
|
||||||
|
sc->sc_type = UGOLD_TYPE_GOLD;
|
||||||
|
sc->sc_num_sensors = 1;
|
||||||
|
descr = "gold (temperature only)";
|
||||||
|
goto identified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s: unknown model \"%s\"\n",
|
||||||
|
sc->sc_hdev.sc_dev.dv_xname, model);
|
||||||
|
sc->sc_num_sensors = 0;
|
||||||
|
sc->sc_type = UGOLD_TYPE_INVALID;
|
||||||
|
return;
|
||||||
|
|
||||||
|
identified:
|
||||||
|
ugold_setup_sensors(sc);
|
||||||
|
if (nsensors == 0)
|
||||||
|
nsensors = sc->sc_num_sensors;
|
||||||
|
printf("%s: \"%s\", %d sensor%s type %s\n", sc->sc_hdev.sc_dev.dv_xname,
|
||||||
|
model, nsensors, (nsensors == 1) ? "" : "s", descr);
|
||||||
|
ugold_refresh(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ugold_si700x_intr(struct uhidev *addr, void *ibuf, u_int len)
|
ugold_si700x_intr(struct ugold_softc *sc, uint8_t *buf, u_int len)
|
||||||
{
|
{
|
||||||
struct ugold_softc *sc = (struct ugold_softc *)addr;
|
int temp, sensor, rhum;
|
||||||
uint8_t *buf = ibuf;
|
|
||||||
int i, temp, rhum;
|
|
||||||
|
|
||||||
switch (buf[0]) {
|
switch (buf[0]) {
|
||||||
case UGOLD_CMD_INIT:
|
case UGOLD_CMD_INIT:
|
||||||
if (sc->sc_num_sensors)
|
if (sc->sc_num_sensors != 0)
|
||||||
break;
|
break;
|
||||||
|
/* XXX some devices report 0x04 here */
|
||||||
if (sc->sc_type == UGOLD_TYPE_GOLD)
|
sc->sc_num_sensors = imin(buf[1], UGOLD_MAX_SENSORS);
|
||||||
sc->sc_num_sensors = 1;
|
ugold_refresh(sc);
|
||||||
else
|
|
||||||
sc->sc_num_sensors = min(buf[1],
|
|
||||||
UGOLD_MAX_SENSORS) /* XXX */;
|
|
||||||
|
|
||||||
for (i = 0; i < sc->sc_num_sensors; i++) {
|
|
||||||
sc->sc_sensor[i].flags |= SENSOR_FINVALID;
|
|
||||||
sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case UGOLD_CMD_DATA:
|
case UGOLD_CMD_DATA:
|
||||||
if (buf[1] != 4 && buf[1] != 64 && buf[1] != 128)
|
if (sc->sc_type == UGOLD_TYPE_GOLD) {
|
||||||
printf("%s: invalid data length (%d bytes)\n",
|
if (buf[1] == 0x80)
|
||||||
|
sensor = UGOLD_INNER;
|
||||||
|
else if (buf[1] == 0x01)
|
||||||
|
sensor = UGOLD_OUTER;
|
||||||
|
else
|
||||||
|
sensor = -1;
|
||||||
|
} else {
|
||||||
|
if (buf[1] == 0x04 || buf[1] == 0x20 ||
|
||||||
|
buf[1] == 0x40 || buf[1] == 0x80)
|
||||||
|
sensor = UGOLD_INNER;
|
||||||
|
else
|
||||||
|
sensor = -1;
|
||||||
|
}
|
||||||
|
if (sensor < 0) {
|
||||||
|
/* unexpected data, ignore */
|
||||||
|
#ifdef UGOLD_DEBUG
|
||||||
|
printf("%s: unexpected sensor id %02x\n",
|
||||||
sc->sc_hdev.sc_dev.dv_xname, buf[1]);
|
sc->sc_hdev.sc_dev.dv_xname, buf[1]);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
temp = ugold_si700x_temp(sc->sc_type, buf[2], buf[3]);
|
temp = ugold_si700x_temp(sc->sc_type, buf[2], buf[3]);
|
||||||
sc->sc_sensor[UGOLD_INNER].value = (temp * 1000) + 273150000;
|
sc->sc_sensor[sensor].value = (temp * 1000) + 273150000;
|
||||||
sc->sc_sensor[UGOLD_INNER].flags &= ~SENSOR_FINVALID;
|
/*
|
||||||
|
* TEMPer1F and TEMPer2 report 200C when the sensor probe is
|
||||||
|
* missing or not plugged correctly.
|
||||||
|
*/
|
||||||
|
if (sc->sc_type == UGOLD_TYPE_GOLD && temp == 200000)
|
||||||
|
sc->sc_sensor[sensor].flags |= SENSOR_FINVALID;
|
||||||
|
else
|
||||||
|
sc->sc_sensor[sensor].flags &= ~SENSOR_FINVALID;
|
||||||
|
|
||||||
if (sc->sc_type != UGOLD_TYPE_GOLD) {
|
if (sc->sc_type != UGOLD_TYPE_GOLD) {
|
||||||
rhum = ugold_si700x_rhum(sc->sc_type, buf[4], buf[5], temp);
|
rhum = ugold_si700x_rhum(sc->sc_type, buf[4], buf[5], temp);
|
||||||
sc->sc_sensor[UGOLD_HUM].value = rhum;
|
sc->sc_sensor[UGOLD_HUM].value = rhum;
|
||||||
@ -437,12 +576,58 @@ ugold_si700x_intr(struct uhidev *addr, void *ibuf, u_int len)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!sc->sc_type) { /* type command returns arbitrary string */
|
ugold_si700x_type(sc);
|
||||||
ugold_si700x_type(sc, buf, len);
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ugold_intr(struct uhidev *addr, void *ibuf, u_int len)
|
||||||
|
{
|
||||||
|
struct ugold_softc *sc = (struct ugold_softc *)addr;
|
||||||
|
uint8_t *buf = ibuf;
|
||||||
|
unsigned long chunk;
|
||||||
|
|
||||||
|
#ifdef UGOLD_DEBUG
|
||||||
|
{
|
||||||
|
printf("%s: %u bytes\n", sc->sc_hdev.sc_dev.dv_xname, len);
|
||||||
|
u_int i;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (i != 0 && (i % 8) == 0)
|
||||||
|
printf("\n");
|
||||||
|
printf("%02x ", buf[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (buf[0]) {
|
||||||
|
case UGOLD_CMD_INIT:
|
||||||
|
case UGOLD_CMD_DATA:
|
||||||
|
(*sc->sc_intr)(sc, buf, len);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!sc->sc_type) {
|
||||||
|
/*
|
||||||
|
* Exact sensor type is not known yet, type command
|
||||||
|
* returns arbitrary string.
|
||||||
|
*/
|
||||||
|
chunk = ulmin(len,
|
||||||
|
sizeof(sc->sc_model) - 1 - sc->sc_model_len);
|
||||||
|
if (chunk != 0) {
|
||||||
|
memcpy(sc->sc_model + sc->sc_model_len, buf,
|
||||||
|
chunk);
|
||||||
|
sc->sc_model_len += chunk;
|
||||||
|
}
|
||||||
|
if (sc->sc_model_len > 8) {
|
||||||
|
/* should have enough data now */
|
||||||
|
(*sc->sc_intr)(sc, buf, len);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf("%s: unknown command 0x%02x\n",
|
printf("%s: unknown command 0x%02x\n",
|
||||||
sc->sc_hdev.sc_dev.dv_xname, buf[0]);
|
sc->sc_hdev.sc_dev.dv_xname, buf[0]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,6 +637,13 @@ ugold_refresh(void *arg)
|
|||||||
struct ugold_softc *sc = arg;
|
struct ugold_softc *sc = arg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't waste time talking to the device if we don't understand
|
||||||
|
* its language.
|
||||||
|
*/
|
||||||
|
if (sc->sc_type == UGOLD_TYPE_INVALID)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!sc->sc_num_sensors) {
|
if (!sc->sc_num_sensors) {
|
||||||
ugold_issue_cmd(sc, cmd_init, sizeof(cmd_init));
|
ugold_issue_cmd(sc, cmd_init, sizeof(cmd_init));
|
||||||
return;
|
return;
|
||||||
|
57
sys/net/pf.c
57
sys/net/pf.c
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: pf.c,v 1.1188 2023/10/10 16:26:06 bluhm Exp $ */
|
/* $OpenBSD: pf.c,v 1.1189 2023/12/01 10:28:32 sashan Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Daniel Hartmeier
|
* Copyright (c) 2001 Daniel Hartmeier
|
||||||
@ -469,6 +469,15 @@ pf_state_list_remove(struct pf_state_list *pfs, struct pf_state *st)
|
|||||||
pf_state_unref(st); /* list no longer references the state */
|
pf_state_unref(st); /* list no longer references the state */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pf_update_state_timeout(struct pf_state *st, int to)
|
||||||
|
{
|
||||||
|
mtx_enter(&st->mtx);
|
||||||
|
if (st->timeout != PFTM_UNLINKED)
|
||||||
|
st->timeout = to;
|
||||||
|
mtx_leave(&st->mtx);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
pf_src_connlimit(struct pf_state **stp)
|
pf_src_connlimit(struct pf_state **stp)
|
||||||
{
|
{
|
||||||
@ -549,7 +558,7 @@ pf_src_connlimit(struct pf_state **stp)
|
|||||||
((*stp)->rule.ptr->flush &
|
((*stp)->rule.ptr->flush &
|
||||||
PF_FLUSH_GLOBAL ||
|
PF_FLUSH_GLOBAL ||
|
||||||
(*stp)->rule.ptr == st->rule.ptr)) {
|
(*stp)->rule.ptr == st->rule.ptr)) {
|
||||||
st->timeout = PFTM_PURGE;
|
pf_update_state_timeout(st, PFTM_PURGE);
|
||||||
pf_set_protostate(st, PF_PEER_BOTH,
|
pf_set_protostate(st, PF_PEER_BOTH,
|
||||||
TCPS_CLOSED);
|
TCPS_CLOSED);
|
||||||
killed++;
|
killed++;
|
||||||
@ -563,7 +572,7 @@ pf_src_connlimit(struct pf_state **stp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* kill this state */
|
/* kill this state */
|
||||||
(*stp)->timeout = PFTM_PURGE;
|
pf_update_state_timeout(*stp, PFTM_PURGE);
|
||||||
pf_set_protostate(*stp, PF_PEER_BOTH, TCPS_CLOSED);
|
pf_set_protostate(*stp, PF_PEER_BOTH, TCPS_CLOSED);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -1758,10 +1767,13 @@ pf_remove_state(struct pf_state *st)
|
|||||||
{
|
{
|
||||||
PF_ASSERT_LOCKED();
|
PF_ASSERT_LOCKED();
|
||||||
|
|
||||||
if (st->timeout == PFTM_UNLINKED)
|
mtx_enter(&st->mtx);
|
||||||
|
if (st->timeout == PFTM_UNLINKED) {
|
||||||
|
mtx_leave(&st->mtx);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
st->timeout = PFTM_UNLINKED;
|
st->timeout = PFTM_UNLINKED;
|
||||||
|
mtx_leave(&st->mtx);
|
||||||
|
|
||||||
/* handle load balancing related tasks */
|
/* handle load balancing related tasks */
|
||||||
pf_postprocess_addr(st);
|
pf_postprocess_addr(st);
|
||||||
@ -1816,7 +1828,8 @@ pf_remove_divert_state(struct pf_state_key *sk)
|
|||||||
sist->dst.state < TCPS_FIN_WAIT_2) {
|
sist->dst.state < TCPS_FIN_WAIT_2) {
|
||||||
pf_set_protostate(sist, PF_PEER_BOTH,
|
pf_set_protostate(sist, PF_PEER_BOTH,
|
||||||
TCPS_TIME_WAIT);
|
TCPS_TIME_WAIT);
|
||||||
sist->timeout = PFTM_TCP_CLOSED;
|
pf_update_state_timeout(sist,
|
||||||
|
PFTM_TCP_CLOSED);
|
||||||
sist->expire = getuptime();
|
sist->expire = getuptime();
|
||||||
}
|
}
|
||||||
sist->state_flags |= PFSTATE_INP_UNLINKED;
|
sist->state_flags |= PFSTATE_INP_UNLINKED;
|
||||||
@ -5036,18 +5049,18 @@ pf_tcp_track_full(struct pf_pdesc *pd, struct pf_state **stp, u_short *reason,
|
|||||||
(*stp)->expire = getuptime();
|
(*stp)->expire = getuptime();
|
||||||
if (src->state >= TCPS_FIN_WAIT_2 &&
|
if (src->state >= TCPS_FIN_WAIT_2 &&
|
||||||
dst->state >= TCPS_FIN_WAIT_2)
|
dst->state >= TCPS_FIN_WAIT_2)
|
||||||
(*stp)->timeout = PFTM_TCP_CLOSED;
|
pf_update_state_timeout(*stp, PFTM_TCP_CLOSED);
|
||||||
else if (src->state >= TCPS_CLOSING &&
|
else if (src->state >= TCPS_CLOSING &&
|
||||||
dst->state >= TCPS_CLOSING)
|
dst->state >= TCPS_CLOSING)
|
||||||
(*stp)->timeout = PFTM_TCP_FIN_WAIT;
|
pf_update_state_timeout(*stp, PFTM_TCP_FIN_WAIT);
|
||||||
else if (src->state < TCPS_ESTABLISHED ||
|
else if (src->state < TCPS_ESTABLISHED ||
|
||||||
dst->state < TCPS_ESTABLISHED)
|
dst->state < TCPS_ESTABLISHED)
|
||||||
(*stp)->timeout = PFTM_TCP_OPENING;
|
pf_update_state_timeout(*stp, PFTM_TCP_OPENING);
|
||||||
else if (src->state >= TCPS_CLOSING ||
|
else if (src->state >= TCPS_CLOSING ||
|
||||||
dst->state >= TCPS_CLOSING)
|
dst->state >= TCPS_CLOSING)
|
||||||
(*stp)->timeout = PFTM_TCP_CLOSING;
|
pf_update_state_timeout(*stp, PFTM_TCP_CLOSING);
|
||||||
else
|
else
|
||||||
(*stp)->timeout = PFTM_TCP_ESTABLISHED;
|
pf_update_state_timeout(*stp, PFTM_TCP_ESTABLISHED);
|
||||||
|
|
||||||
/* Fall through to PASS packet */
|
/* Fall through to PASS packet */
|
||||||
} else if ((dst->state < TCPS_SYN_SENT ||
|
} else if ((dst->state < TCPS_SYN_SENT ||
|
||||||
@ -5229,18 +5242,18 @@ pf_tcp_track_sloppy(struct pf_pdesc *pd, struct pf_state **stp,
|
|||||||
(*stp)->expire = getuptime();
|
(*stp)->expire = getuptime();
|
||||||
if (src->state >= TCPS_FIN_WAIT_2 &&
|
if (src->state >= TCPS_FIN_WAIT_2 &&
|
||||||
dst->state >= TCPS_FIN_WAIT_2)
|
dst->state >= TCPS_FIN_WAIT_2)
|
||||||
(*stp)->timeout = PFTM_TCP_CLOSED;
|
pf_update_state_timeout(*stp, PFTM_TCP_CLOSED);
|
||||||
else if (src->state >= TCPS_CLOSING &&
|
else if (src->state >= TCPS_CLOSING &&
|
||||||
dst->state >= TCPS_CLOSING)
|
dst->state >= TCPS_CLOSING)
|
||||||
(*stp)->timeout = PFTM_TCP_FIN_WAIT;
|
pf_update_state_timeout(*stp, PFTM_TCP_FIN_WAIT);
|
||||||
else if (src->state < TCPS_ESTABLISHED ||
|
else if (src->state < TCPS_ESTABLISHED ||
|
||||||
dst->state < TCPS_ESTABLISHED)
|
dst->state < TCPS_ESTABLISHED)
|
||||||
(*stp)->timeout = PFTM_TCP_OPENING;
|
pf_update_state_timeout(*stp, PFTM_TCP_OPENING);
|
||||||
else if (src->state >= TCPS_CLOSING ||
|
else if (src->state >= TCPS_CLOSING ||
|
||||||
dst->state >= TCPS_CLOSING)
|
dst->state >= TCPS_CLOSING)
|
||||||
(*stp)->timeout = PFTM_TCP_CLOSING;
|
pf_update_state_timeout(*stp, PFTM_TCP_CLOSING);
|
||||||
else
|
else
|
||||||
(*stp)->timeout = PFTM_TCP_ESTABLISHED;
|
pf_update_state_timeout(*stp, PFTM_TCP_ESTABLISHED);
|
||||||
|
|
||||||
return (PF_PASS);
|
return (PF_PASS);
|
||||||
}
|
}
|
||||||
@ -5377,7 +5390,7 @@ pf_test_state(struct pf_pdesc *pd, struct pf_state **stp, u_short *reason)
|
|||||||
addlog("\n");
|
addlog("\n");
|
||||||
}
|
}
|
||||||
/* XXX make sure it's the same direction ?? */
|
/* XXX make sure it's the same direction ?? */
|
||||||
(*stp)->timeout = PFTM_PURGE;
|
pf_update_state_timeout(*stp, PFTM_PURGE);
|
||||||
pf_state_unref(*stp);
|
pf_state_unref(*stp);
|
||||||
*stp = NULL;
|
*stp = NULL;
|
||||||
pf_mbuf_link_inpcb(pd->m, inp);
|
pf_mbuf_link_inpcb(pd->m, inp);
|
||||||
@ -5417,9 +5430,9 @@ pf_test_state(struct pf_pdesc *pd, struct pf_state **stp, u_short *reason)
|
|||||||
(*stp)->expire = getuptime();
|
(*stp)->expire = getuptime();
|
||||||
if (src->state == PFUDPS_MULTIPLE &&
|
if (src->state == PFUDPS_MULTIPLE &&
|
||||||
dst->state == PFUDPS_MULTIPLE)
|
dst->state == PFUDPS_MULTIPLE)
|
||||||
(*stp)->timeout = PFTM_UDP_MULTIPLE;
|
pf_update_state_timeout(*stp, PFTM_UDP_MULTIPLE);
|
||||||
else
|
else
|
||||||
(*stp)->timeout = PFTM_UDP_SINGLE;
|
pf_update_state_timeout(*stp, PFTM_UDP_SINGLE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* update states */
|
/* update states */
|
||||||
@ -5432,9 +5445,9 @@ pf_test_state(struct pf_pdesc *pd, struct pf_state **stp, u_short *reason)
|
|||||||
(*stp)->expire = getuptime();
|
(*stp)->expire = getuptime();
|
||||||
if (src->state == PFOTHERS_MULTIPLE &&
|
if (src->state == PFOTHERS_MULTIPLE &&
|
||||||
dst->state == PFOTHERS_MULTIPLE)
|
dst->state == PFOTHERS_MULTIPLE)
|
||||||
(*stp)->timeout = PFTM_OTHER_MULTIPLE;
|
pf_update_state_timeout(*stp, PFTM_OTHER_MULTIPLE);
|
||||||
else
|
else
|
||||||
(*stp)->timeout = PFTM_OTHER_SINGLE;
|
pf_update_state_timeout(*stp, PFTM_OTHER_SINGLE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5585,7 +5598,7 @@ pf_test_state_icmp(struct pf_pdesc *pd, struct pf_state **stp,
|
|||||||
return (ret);
|
return (ret);
|
||||||
|
|
||||||
(*stp)->expire = getuptime();
|
(*stp)->expire = getuptime();
|
||||||
(*stp)->timeout = PFTM_ICMP_ERROR_REPLY;
|
pf_update_state_timeout(*stp, PFTM_ICMP_ERROR_REPLY);
|
||||||
|
|
||||||
/* translate source/destination address, if necessary */
|
/* translate source/destination address, if necessary */
|
||||||
if ((*stp)->key[PF_SK_WIRE] != (*stp)->key[PF_SK_STACK]) {
|
if ((*stp)->key[PF_SK_WIRE] != (*stp)->key[PF_SK_STACK]) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: in_pcb.c,v 1.279 2023/11/29 18:30:48 bluhm Exp $ */
|
/* $OpenBSD: in_pcb.c,v 1.280 2023/12/01 15:30:46 bluhm Exp $ */
|
||||||
/* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */
|
/* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -268,6 +268,7 @@ in_pcballoc(struct socket *so, struct inpcbtable *table, int wait)
|
|||||||
int
|
int
|
||||||
in_pcbbind(struct inpcb *inp, struct mbuf *nam, struct proc *p)
|
in_pcbbind(struct inpcb *inp, struct mbuf *nam, struct proc *p)
|
||||||
{
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
struct socket *so = inp->inp_socket;
|
struct socket *so = inp->inp_socket;
|
||||||
u_int16_t lport = 0;
|
u_int16_t lport = 0;
|
||||||
int wild = 0;
|
int wild = 0;
|
||||||
@ -341,7 +342,10 @@ in_pcbbind(struct inpcb *inp, struct mbuf *nam, struct proc *p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
inp->inp_lport = lport;
|
inp->inp_lport = lport;
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
in_pcbrehash(inp);
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,6 +484,7 @@ in_pcbpickport(u_int16_t *lport, const void *laddr, int wild,
|
|||||||
int
|
int
|
||||||
in_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
in_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
||||||
{
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
struct in_addr ina;
|
struct in_addr ina;
|
||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
struct inpcb *t;
|
struct inpcb *t;
|
||||||
@ -526,7 +531,10 @@ in_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
|||||||
}
|
}
|
||||||
inp->inp_faddr = sin->sin_addr;
|
inp->inp_faddr = sin->sin_addr;
|
||||||
inp->inp_fport = sin->sin_port;
|
inp->inp_fport = sin->sin_port;
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
in_pcbrehash(inp);
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
|
||||||
#if NSTOEPLITZ > 0
|
#if NSTOEPLITZ > 0
|
||||||
inp->inp_flowid = stoeplitz_ip4port(inp->inp_faddr.s_addr,
|
inp->inp_flowid = stoeplitz_ip4port(inp->inp_faddr.s_addr,
|
||||||
inp->inp_laddr.s_addr, inp->inp_fport, inp->inp_lport);
|
inp->inp_laddr.s_addr, inp->inp_fport, inp->inp_lport);
|
||||||
@ -544,20 +552,7 @@ in_pcbdisconnect(struct inpcb *inp)
|
|||||||
pf_inp_unlink(inp);
|
pf_inp_unlink(inp);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
switch (sotopf(inp->inp_socket)) {
|
|
||||||
#ifdef INET6
|
|
||||||
case PF_INET6:
|
|
||||||
inp->inp_faddr6 = in6addr_any;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case PF_INET:
|
|
||||||
inp->inp_faddr.s_addr = INADDR_ANY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inp->inp_fport = 0;
|
|
||||||
inp->inp_flowid = 0;
|
inp->inp_flowid = 0;
|
||||||
in_pcbrehash(inp);
|
|
||||||
if (inp->inp_socket->so_state & SS_NOFDREF)
|
if (inp->inp_socket->so_state & SS_NOFDREF)
|
||||||
in_pcbdetach(inp);
|
in_pcbdetach(inp);
|
||||||
}
|
}
|
||||||
@ -1044,11 +1039,11 @@ in_pcbrehash(struct inpcb *inp)
|
|||||||
{
|
{
|
||||||
struct inpcbtable *table = inp->inp_table;
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
|
||||||
mtx_enter(&table->inpt_mtx);
|
MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
|
||||||
|
|
||||||
LIST_REMOVE(inp, inp_lhash);
|
LIST_REMOVE(inp, inp_lhash);
|
||||||
LIST_REMOVE(inp, inp_hash);
|
LIST_REMOVE(inp, inp_hash);
|
||||||
in_pcbhash_insert(inp);
|
in_pcbhash_insert(inp);
|
||||||
mtx_leave(&table->inpt_mtx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1266,3 +1261,87 @@ in_pcblookup_listen(struct inpcbtable *table, struct in_addr laddr,
|
|||||||
#endif
|
#endif
|
||||||
return (inp);
|
return (inp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
in_pcbset_rtableid(struct inpcb *inp, u_int rtableid)
|
||||||
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
|
if (inp->inp_lport) {
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
return (EBUSY);
|
||||||
|
}
|
||||||
|
inp->inp_rtableid = rtableid;
|
||||||
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
in_pcbset_laddr(struct inpcb *inp, const struct sockaddr *sa, u_int rtableid)
|
||||||
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
|
inp->inp_rtableid = rtableid;
|
||||||
|
#ifdef INET6
|
||||||
|
if (ISSET(inp->inp_flags, INP_IPV6)) {
|
||||||
|
const struct sockaddr_in6 *sin6;
|
||||||
|
|
||||||
|
KASSERT(sa->sa_family == AF_INET6);
|
||||||
|
sin6 = satosin6_const(sa);
|
||||||
|
inp->inp_lport = sin6->sin6_port;
|
||||||
|
inp->inp_laddr6 = sin6->sin6_addr;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
const struct sockaddr_in *sin;
|
||||||
|
|
||||||
|
KASSERT(sa->sa_family == AF_INET);
|
||||||
|
sin = satosin_const(sa);
|
||||||
|
inp->inp_lport = sin->sin_port;
|
||||||
|
inp->inp_laddr = sin->sin_addr;
|
||||||
|
}
|
||||||
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
in_pcbunset_faddr(struct inpcb *inp)
|
||||||
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
|
#ifdef INET6
|
||||||
|
if (ISSET(inp->inp_flags, INP_IPV6))
|
||||||
|
inp->inp_faddr6 = in6addr_any;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
inp->inp_faddr.s_addr = INADDR_ANY;
|
||||||
|
inp->inp_fport = 0;
|
||||||
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
in_pcbunset_laddr(struct inpcb *inp)
|
||||||
|
{
|
||||||
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
|
#ifdef INET6
|
||||||
|
if (ISSET(inp->inp_flags, INP_IPV6)) {
|
||||||
|
inp->inp_faddr6 = in6addr_any;
|
||||||
|
inp->inp_laddr6 = in6addr_any;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
inp->inp_faddr.s_addr = INADDR_ANY;
|
||||||
|
inp->inp_laddr.s_addr = INADDR_ANY;
|
||||||
|
}
|
||||||
|
inp->inp_fport = 0;
|
||||||
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: in_pcb.h,v 1.140 2023/11/29 18:30:48 bluhm Exp $ */
|
/* $OpenBSD: in_pcb.h,v 1.141 2023/12/01 15:30:46 bluhm Exp $ */
|
||||||
/* $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $ */
|
/* $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -335,5 +335,10 @@ void in6_pcbnotify(struct inpcbtable *, struct sockaddr_in6 *,
|
|||||||
int in6_selecthlim(struct inpcb *);
|
int in6_selecthlim(struct inpcb *);
|
||||||
int in_pcbpickport(u_int16_t *, const void *, int, const struct inpcb *,
|
int in_pcbpickport(u_int16_t *, const void *, int, const struct inpcb *,
|
||||||
struct proc *);
|
struct proc *);
|
||||||
|
int in_pcbset_rtableid(struct inpcb *, u_int);
|
||||||
|
void in_pcbset_laddr(struct inpcb *, const struct sockaddr *, u_int);
|
||||||
|
void in_pcbunset_faddr(struct inpcb *);
|
||||||
|
void in_pcbunset_laddr(struct inpcb *);
|
||||||
|
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
#endif /* _NETINET_IN_PCB_H_ */
|
#endif /* _NETINET_IN_PCB_H_ */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: ip_output.c,v 1.391 2023/11/26 22:08:10 bluhm Exp $ */
|
/* $OpenBSD: ip_output.c,v 1.392 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
/* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */
|
/* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1082,12 +1082,7 @@ ip_ctloutput(int op, struct socket *so, int level, int optname,
|
|||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (inp->inp_lport) {
|
error = in_pcbset_rtableid(inp, rtid);
|
||||||
error = EBUSY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
inp->inp_rtableid = rtid;
|
|
||||||
in_pcbrehash(inp);
|
|
||||||
break;
|
break;
|
||||||
case IP_PIPEX:
|
case IP_PIPEX:
|
||||||
if (m != NULL && m->m_len == sizeof(int))
|
if (m != NULL && m->m_len == sizeof(int))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: tcp_input.c,v 1.396 2023/11/30 10:21:56 bluhm Exp $ */
|
/* $OpenBSD: tcp_input.c,v 1.397 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
/* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */
|
/* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3489,6 +3489,7 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th,
|
|||||||
struct tcpcb *tp = NULL;
|
struct tcpcb *tp = NULL;
|
||||||
struct mbuf *am;
|
struct mbuf *am;
|
||||||
struct socket *oso;
|
struct socket *oso;
|
||||||
|
u_int rtableid;
|
||||||
|
|
||||||
NET_ASSERT_LOCKED();
|
NET_ASSERT_LOCKED();
|
||||||
|
|
||||||
@ -3553,37 +3554,25 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th,
|
|||||||
#endif /* INET6 */
|
#endif /* INET6 */
|
||||||
{
|
{
|
||||||
inp->inp_ip.ip_ttl = oldinp->inp_ip.ip_ttl;
|
inp->inp_ip.ip_ttl = oldinp->inp_ip.ip_ttl;
|
||||||
|
inp->inp_options = ip_srcroute(m);
|
||||||
|
if (inp->inp_options == NULL) {
|
||||||
|
inp->inp_options = sc->sc_ipopts;
|
||||||
|
sc->sc_ipopts = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* inherit rtable from listening socket */
|
||||||
|
rtableid = sc->sc_rtableid;
|
||||||
#if NPF > 0
|
#if NPF > 0
|
||||||
if (m->m_pkthdr.pf.flags & PF_TAG_DIVERTED) {
|
if (m->m_pkthdr.pf.flags & PF_TAG_DIVERTED) {
|
||||||
struct pf_divert *divert;
|
struct pf_divert *divert;
|
||||||
|
|
||||||
divert = pf_find_divert(m);
|
divert = pf_find_divert(m);
|
||||||
KASSERT(divert != NULL);
|
KASSERT(divert != NULL);
|
||||||
inp->inp_rtableid = divert->rdomain;
|
rtableid = divert->rdomain;
|
||||||
} else
|
}
|
||||||
#endif
|
#endif
|
||||||
/* inherit rtable from listening socket */
|
in_pcbset_laddr(inp, dst, rtableid);
|
||||||
inp->inp_rtableid = sc->sc_rtableid;
|
|
||||||
|
|
||||||
inp->inp_lport = th->th_dport;
|
|
||||||
switch (src->sa_family) {
|
|
||||||
#ifdef INET6
|
|
||||||
case AF_INET6:
|
|
||||||
inp->inp_laddr6 = satosin6(dst)->sin6_addr;
|
|
||||||
break;
|
|
||||||
#endif /* INET6 */
|
|
||||||
case AF_INET:
|
|
||||||
inp->inp_laddr = satosin(dst)->sin_addr;
|
|
||||||
inp->inp_options = ip_srcroute(m);
|
|
||||||
if (inp->inp_options == NULL) {
|
|
||||||
inp->inp_options = sc->sc_ipopts;
|
|
||||||
sc->sc_ipopts = NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
in_pcbrehash(inp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Give the new socket our cached route reference.
|
* Give the new socket our cached route reference.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: tcp_usrreq.c,v 1.224 2023/11/28 13:23:20 bluhm Exp $ */
|
/* $OpenBSD: tcp_usrreq.c,v 1.226 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
/* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */
|
/* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -635,7 +635,6 @@ tcp_connect(struct socket *so, struct mbuf *nam)
|
|||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
error = in6_pcbconnect(inp, nam);
|
|
||||||
} else
|
} else
|
||||||
#endif /* INET6 */
|
#endif /* INET6 */
|
||||||
{
|
{
|
||||||
@ -650,13 +649,14 @@ tcp_connect(struct socket *so, struct mbuf *nam)
|
|||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
error = in_pcbconnect(inp, nam);
|
|
||||||
}
|
}
|
||||||
|
error = in_pcbconnect(inp, nam);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
tp->t_template = tcp_template(tp);
|
tp->t_template = tcp_template(tp);
|
||||||
if (tp->t_template == 0) {
|
if (tp->t_template == 0) {
|
||||||
|
in_pcbunset_faddr(inp);
|
||||||
in_pcbdisconnect(inp);
|
in_pcbdisconnect(inp);
|
||||||
error = ENOBUFS;
|
error = ENOBUFS;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: udp_usrreq.c,v 1.310 2023/11/29 18:30:48 bluhm Exp $ */
|
/* $OpenBSD: udp_usrreq.c,v 1.312 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
/* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */
|
/* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1153,15 +1153,13 @@ udp_connect(struct socket *so, struct mbuf *addr)
|
|||||||
if (inp->inp_flags & INP_IPV6) {
|
if (inp->inp_flags & INP_IPV6) {
|
||||||
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
|
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
|
||||||
return (EISCONN);
|
return (EISCONN);
|
||||||
error = in6_pcbconnect(inp, addr);
|
|
||||||
} else
|
} else
|
||||||
#endif /* INET6 */
|
#endif /* INET6 */
|
||||||
{
|
{
|
||||||
if (inp->inp_faddr.s_addr != INADDR_ANY)
|
if (inp->inp_faddr.s_addr != INADDR_ANY)
|
||||||
return (EISCONN);
|
return (EISCONN);
|
||||||
error = in_pcbconnect(inp, addr);
|
|
||||||
}
|
}
|
||||||
|
error = in_pcbconnect(inp, addr);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
@ -1186,14 +1184,7 @@ udp_disconnect(struct socket *so)
|
|||||||
if (inp->inp_faddr.s_addr == INADDR_ANY)
|
if (inp->inp_faddr.s_addr == INADDR_ANY)
|
||||||
return (ENOTCONN);
|
return (ENOTCONN);
|
||||||
}
|
}
|
||||||
|
in_pcbunset_laddr(inp);
|
||||||
#ifdef INET6
|
|
||||||
if (inp->inp_flags & INP_IPV6)
|
|
||||||
inp->inp_laddr6 = in6addr_any;
|
|
||||||
else
|
|
||||||
#endif /* INET6 */
|
|
||||||
inp->inp_laddr.s_addr = INADDR_ANY;
|
|
||||||
|
|
||||||
in_pcbdisconnect(inp);
|
in_pcbdisconnect(inp);
|
||||||
so->so_state &= ~SS_ISCONNECTED; /* XXX */
|
so->so_state &= ~SS_ISCONNECTED; /* XXX */
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: in6_pcb.c,v 1.126 2023/11/29 18:30:48 bluhm Exp $ */
|
/* $OpenBSD: in6_pcb.c,v 1.128 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||||
@ -245,7 +245,8 @@ in6_pcbaddrisavail(struct inpcb *inp, struct sockaddr_in6 *sin6, int wild,
|
|||||||
int
|
int
|
||||||
in6_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
in6_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
||||||
{
|
{
|
||||||
struct in6_addr *in6a = NULL;
|
struct inpcbtable *table = inp->inp_table;
|
||||||
|
const struct in6_addr *in6a;
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
struct inpcb *t;
|
struct inpcb *t;
|
||||||
int error;
|
int error;
|
||||||
@ -312,6 +313,10 @@ in6_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
|||||||
}
|
}
|
||||||
inp->inp_faddr6 = sin6->sin6_addr;
|
inp->inp_faddr6 = sin6->sin6_addr;
|
||||||
inp->inp_fport = sin6->sin6_port;
|
inp->inp_fport = sin6->sin6_port;
|
||||||
|
mtx_enter(&table->inpt_mtx);
|
||||||
|
in_pcbrehash(inp);
|
||||||
|
mtx_leave(&table->inpt_mtx);
|
||||||
|
|
||||||
inp->inp_flowinfo &= ~IPV6_FLOWLABEL_MASK;
|
inp->inp_flowinfo &= ~IPV6_FLOWLABEL_MASK;
|
||||||
if (ip6_auto_flowlabel)
|
if (ip6_auto_flowlabel)
|
||||||
inp->inp_flowinfo |=
|
inp->inp_flowinfo |=
|
||||||
@ -320,7 +325,6 @@ in6_pcbconnect(struct inpcb *inp, struct mbuf *nam)
|
|||||||
inp->inp_flowid = stoeplitz_ip6port(&inp->inp_faddr6,
|
inp->inp_flowid = stoeplitz_ip6port(&inp->inp_faddr6,
|
||||||
&inp->inp_laddr6, inp->inp_fport, inp->inp_lport);
|
&inp->inp_laddr6, inp->inp_fport, inp->inp_lport);
|
||||||
#endif
|
#endif
|
||||||
in_pcbrehash(inp);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: in6_src.c,v 1.87 2023/11/28 13:23:20 bluhm Exp $ */
|
/* $OpenBSD: in6_src.c,v 1.88 2023/12/01 14:08:04 bluhm Exp $ */
|
||||||
/* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */
|
/* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -91,7 +91,7 @@ int in6_selectif(struct sockaddr_in6 *, struct ip6_pktopts *,
|
|||||||
* the values set at pcb level can be overridden via cmsg.
|
* the values set at pcb level can be overridden via cmsg.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
in6_pcbselsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
|
in6_pcbselsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
|
||||||
struct inpcb *inp, struct ip6_pktopts *opts)
|
struct inpcb *inp, struct ip6_pktopts *opts)
|
||||||
{
|
{
|
||||||
struct ip6_moptions *mopts = inp->inp_moptions6;
|
struct ip6_moptions *mopts = inp->inp_moptions6;
|
||||||
@ -249,7 +249,7 @@ in6_pcbselsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
|
|||||||
* an entry to the caller for later use.
|
* an entry to the caller for later use.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
in6_selectsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
|
in6_selectsrc(const struct in6_addr **in6src, struct sockaddr_in6 *dstsock,
|
||||||
struct ip6_moptions *mopts, unsigned int rtableid)
|
struct ip6_moptions *mopts, unsigned int rtableid)
|
||||||
{
|
{
|
||||||
struct ifnet *ifp = NULL;
|
struct ifnet *ifp = NULL;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: ip6_output.c,v 1.281 2023/11/28 13:23:20 bluhm Exp $ */
|
/* $OpenBSD: ip6_output.c,v 1.282 2023/12/01 15:30:47 bluhm Exp $ */
|
||||||
/* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */
|
/* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1381,12 +1381,7 @@ do { \
|
|||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (inp->inp_lport) {
|
error = in_pcbset_rtableid(inp, rtid);
|
||||||
error = EBUSY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
inp->inp_rtableid = rtid;
|
|
||||||
in_pcbrehash(inp);
|
|
||||||
break;
|
break;
|
||||||
case IPV6_PIPEX:
|
case IPV6_PIPEX:
|
||||||
if (m != NULL && m->m_len == sizeof(int))
|
if (m != NULL && m->m_len == sizeof(int))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: ip6_var.h,v 1.107 2023/11/26 22:08:10 bluhm Exp $ */
|
/* $OpenBSD: ip6_var.h,v 1.108 2023/12/01 14:08:04 bluhm Exp $ */
|
||||||
/* $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $ */
|
/* $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -365,9 +365,9 @@ int rip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
|
|||||||
int dest6_input(struct mbuf **, int *, int, int);
|
int dest6_input(struct mbuf **, int *, int, int);
|
||||||
int none_input(struct mbuf **, int *, int);
|
int none_input(struct mbuf **, int *, int);
|
||||||
|
|
||||||
int in6_pcbselsrc(struct in6_addr **, struct sockaddr_in6 *,
|
int in6_pcbselsrc(const struct in6_addr **, struct sockaddr_in6 *,
|
||||||
struct inpcb *, struct ip6_pktopts *);
|
struct inpcb *, struct ip6_pktopts *);
|
||||||
int in6_selectsrc(struct in6_addr **, struct sockaddr_in6 *,
|
int in6_selectsrc(const struct in6_addr **, struct sockaddr_in6 *,
|
||||||
struct ip6_moptions *, unsigned int);
|
struct ip6_moptions *, unsigned int);
|
||||||
struct rtentry *in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
|
struct rtentry *in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
|
||||||
struct route_in6 *, unsigned int rtableid);
|
struct route_in6 *, unsigned int rtableid);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: raw_ip6.c,v 1.175 2023/11/28 13:23:20 bluhm Exp $ */
|
/* $OpenBSD: raw_ip6.c,v 1.176 2023/12/01 14:08:04 bluhm Exp $ */
|
||||||
/* $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $ */
|
/* $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -451,7 +451,7 @@ rip6_output(struct mbuf *m, struct socket *so, struct sockaddr *dstaddr,
|
|||||||
* Source address selection.
|
* Source address selection.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
struct in6_addr *in6a;
|
const struct in6_addr *in6a;
|
||||||
|
|
||||||
error = in6_pcbselsrc(&in6a, satosin6(dstaddr), in6p, optp);
|
error = in6_pcbselsrc(&in6a, satosin6(dstaddr), in6p, optp);
|
||||||
if (error)
|
if (error)
|
||||||
@ -683,7 +683,7 @@ rip6_connect(struct socket *so, struct mbuf *nam)
|
|||||||
{
|
{
|
||||||
struct inpcb *in6p = sotoinpcb(so);
|
struct inpcb *in6p = sotoinpcb(so);
|
||||||
struct sockaddr_in6 *addr;
|
struct sockaddr_in6 *addr;
|
||||||
struct in6_addr *in6a = NULL;
|
const struct in6_addr *in6a;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
soassertlocked(so);
|
soassertlocked(so);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: udp6_output.c,v 1.61 2023/11/28 13:23:20 bluhm Exp $ */
|
/* $OpenBSD: udp6_output.c,v 1.62 2023/12/01 14:08:04 bluhm Exp $ */
|
||||||
/* $KAME: udp6_output.c,v 1.21 2001/02/07 11:51:54 itojun Exp $ */
|
/* $KAME: udp6_output.c,v 1.21 2001/02/07 11:51:54 itojun Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -101,7 +101,7 @@ udp6_output(struct inpcb *in6p, struct mbuf *m, struct mbuf *addr6,
|
|||||||
int error = 0, priv = 0, hlen, flags;
|
int error = 0, priv = 0, hlen, flags;
|
||||||
struct ip6_hdr *ip6;
|
struct ip6_hdr *ip6;
|
||||||
struct udphdr *udp6;
|
struct udphdr *udp6;
|
||||||
struct in6_addr *laddr, *faddr;
|
const struct in6_addr *laddr, *faddr;
|
||||||
struct ip6_pktopts *optp, opt;
|
struct ip6_pktopts *optp, opt;
|
||||||
struct sockaddr_in6 tmp, valid;
|
struct sockaddr_in6 tmp, valid;
|
||||||
struct proc *p = curproc; /* XXX */
|
struct proc *p = curproc; /* XXX */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: mutex.h,v 1.18 2019/04/23 13:35:12 visa Exp $ */
|
/* $OpenBSD: mutex.h,v 1.19 2023/12/01 14:37:22 bluhm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004 Artur Grabowski <art@openbsd.org>
|
* Copyright (c) 2004 Artur Grabowski <art@openbsd.org>
|
||||||
@ -84,8 +84,8 @@ void __mtx_init(struct mutex *, int);
|
|||||||
panic("mutex %p held in %s", (mtx), __func__); \
|
panic("mutex %p held in %s", (mtx), __func__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define MUTEX_ASSERT_LOCKED(mtx) do { } while (0)
|
#define MUTEX_ASSERT_LOCKED(mtx) do { (void)(mtx); } while (0)
|
||||||
#define MUTEX_ASSERT_UNLOCKED(mtx) do { } while (0)
|
#define MUTEX_ASSERT_UNLOCKED(mtx) do { (void)(mtx); } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MUTEX_LOCK_OBJECT(mtx) (&(mtx)->mtx_lock_obj)
|
#define MUTEX_LOCK_OBJECT(mtx) (&(mtx)->mtx_lock_obj)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: msdosfs_vfsops.c,v 1.13 2021/10/06 00:40:41 deraadt Exp $ */
|
/* $OpenBSD: msdosfs_vfsops.c,v 1.14 2023/12/01 16:23:03 miod Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
|
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
|
||||||
@ -278,7 +278,8 @@ msdosfs_mount(struct mkfsvnode *devvp, int flags)
|
|||||||
DPRINTF(("%s(bread %lu)\n", __func__,
|
DPRINTF(("%s(bread %lu)\n", __func__,
|
||||||
(unsigned long)de_bn2kb(pmp, pmp->pm_fsinfo)));
|
(unsigned long)de_bn2kb(pmp, pmp->pm_fsinfo)));
|
||||||
if ((error = bread(devvp, de_bn2kb(pmp, pmp->pm_fsinfo),
|
if ((error = bread(devvp, de_bn2kb(pmp, pmp->pm_fsinfo),
|
||||||
pmp->pm_BytesPerSec, 0, &bp)) != 0)
|
roundup(sizeof(struct fsinfo), pmp->pm_BytesPerSec),
|
||||||
|
0, &bp)) != 0)
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
fp = (struct fsinfo *)bp->b_data;
|
fp = (struct fsinfo *)bp->b_data;
|
||||||
if (!memcmp(fp->fsisig1, "RRaA", 4)
|
if (!memcmp(fp->fsisig1, "RRaA", 4)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: relay_http.c,v 1.86 2023/11/29 15:35:07 millert Exp $ */
|
/* $OpenBSD: relay_http.c,v 1.87 2023/12/01 16:48:40 millert Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
|
* Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
|
||||||
@ -413,24 +413,41 @@ relay_read_http(struct bufferevent *bev, void *arg)
|
|||||||
|
|
||||||
if (desc->http_method != HTTP_METHOD_NONE &&
|
if (desc->http_method != HTTP_METHOD_NONE &&
|
||||||
strcasecmp("Content-Length", key) == 0) {
|
strcasecmp("Content-Length", key) == 0) {
|
||||||
|
switch (desc->http_method) {
|
||||||
|
case HTTP_METHOD_TRACE:
|
||||||
|
case HTTP_METHOD_CONNECT:
|
||||||
/*
|
/*
|
||||||
* These methods should not have a body
|
* These methods should not have a body
|
||||||
* and thus no Content-Length header.
|
* and thus no Content-Length header.
|
||||||
*/
|
*/
|
||||||
if (desc->http_method == HTTP_METHOD_TRACE ||
|
|
||||||
desc->http_method == HTTP_METHOD_CONNECT) {
|
|
||||||
relay_abort_http(con, 400, "malformed",
|
relay_abort_http(con, 400, "malformed",
|
||||||
0);
|
0);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
case HTTP_METHOD_GET:
|
||||||
|
case HTTP_METHOD_HEAD:
|
||||||
|
case HTTP_METHOD_COPY:
|
||||||
|
case HTTP_METHOD_MOVE:
|
||||||
/*
|
/*
|
||||||
* HEAD responses may provide a Content-Length
|
* We strip the body (if present) from
|
||||||
* header, but if so it should just be ignored,
|
* the GET, HEAD, COPY and MOVE methods
|
||||||
* since there is no actual payload in the
|
* so strip Content-Length too.
|
||||||
* response.
|
|
||||||
*/
|
*/
|
||||||
if (desc->http_method != HTTP_METHOD_RESPONSE
|
kv_delete(&desc->http_headers,
|
||||||
|| request_method != HTTP_METHOD_HEAD) {
|
desc->http_lastheader);
|
||||||
|
break;
|
||||||
|
case HTTP_METHOD_RESPONSE:
|
||||||
|
/*
|
||||||
|
* Strip Content-Length header from
|
||||||
|
* HEAD responses since there is no
|
||||||
|
* actual payload in the response.
|
||||||
|
*/
|
||||||
|
if (request_method == HTTP_METHOD_HEAD) {
|
||||||
|
kv_delete(&desc->http_headers,
|
||||||
|
desc->http_lastheader);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
default:
|
||||||
/*
|
/*
|
||||||
* Need to read data from the client
|
* Need to read data from the client
|
||||||
* after the HTTP header.
|
* after the HTTP header.
|
||||||
@ -450,6 +467,7 @@ relay_read_http(struct bufferevent *bev, void *arg)
|
|||||||
errstr, 0);
|
errstr, 0);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Response with a status code of 1xx
|
* Response with a status code of 1xx
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: parse.y,v 1.292 2023/05/10 07:19:49 op Exp $ */
|
/* $OpenBSD: parse.y,v 1.293 2023/12/01 09:25:49 op Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
|
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
|
||||||
@ -251,7 +251,7 @@ varset : STRING '=' STRING {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
comma : ','
|
comma : ',' optnl
|
||||||
| nl
|
| nl
|
||||||
| /* empty */
|
| /* empty */
|
||||||
;
|
;
|
||||||
@ -277,7 +277,7 @@ keyval : STRING assign STRING {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
keyval_list : keyval
|
keyval_list : keyval optnl
|
||||||
| keyval comma keyval_list
|
| keyval comma keyval_list
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -287,7 +287,7 @@ stringel : STRING {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
string_list : stringel
|
string_list : stringel optnl
|
||||||
| stringel comma string_list
|
| stringel comma string_list
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -936,7 +936,7 @@ HELO STRING {
|
|||||||
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_OUT;
|
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_OUT;
|
||||||
dict_init(&filter_config->chain_procs);
|
dict_init(&filter_config->chain_procs);
|
||||||
dsp->u.remote.filtername = filtername;
|
dsp->u.remote.filtername = filtername;
|
||||||
} '{' filter_list '}' {
|
} '{' optnl filter_list '}' {
|
||||||
dict_set(conf->sc_filters_dict, dsp->u.remote.filtername, filter_config);
|
dict_set(conf->sc_filters_dict, dsp->u.remote.filtername, filter_config);
|
||||||
filter_config = NULL;
|
filter_config = NULL;
|
||||||
}
|
}
|
||||||
@ -1887,7 +1887,7 @@ STRING {
|
|||||||
;
|
;
|
||||||
|
|
||||||
filter_list:
|
filter_list:
|
||||||
filterel
|
filterel optnl
|
||||||
| filterel comma filter_list
|
| filterel comma filter_list
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -1959,7 +1959,7 @@ FILTER STRING CHAIN {
|
|||||||
filter_config = xcalloc(1, sizeof *filter_config);
|
filter_config = xcalloc(1, sizeof *filter_config);
|
||||||
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
||||||
dict_init(&filter_config->chain_procs);
|
dict_init(&filter_config->chain_procs);
|
||||||
} '{' filter_list '}' {
|
} '{' optnl filter_list '}' {
|
||||||
dict_set(conf->sc_filters_dict, $2, filter_config);
|
dict_set(conf->sc_filters_dict, $2, filter_config);
|
||||||
filter_config = NULL;
|
filter_config = NULL;
|
||||||
}
|
}
|
||||||
@ -2140,7 +2140,7 @@ opt_sock_listen : FILTER STRING {
|
|||||||
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
||||||
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_IN;
|
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_IN;
|
||||||
dict_init(&filter_config->chain_procs);
|
dict_init(&filter_config->chain_procs);
|
||||||
} '{' filter_list '}' {
|
} '{' optnl filter_list '}' {
|
||||||
dict_set(conf->sc_filters_dict, listen_opts.filtername, filter_config);
|
dict_set(conf->sc_filters_dict, listen_opts.filtername, filter_config);
|
||||||
filter_config = NULL;
|
filter_config = NULL;
|
||||||
}
|
}
|
||||||
@ -2278,7 +2278,7 @@ opt_if_listen : INET4 {
|
|||||||
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
filter_config->filter_type = FILTER_TYPE_CHAIN;
|
||||||
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_IN;
|
filter_config->filter_subsystem |= FILTER_SUBSYSTEM_SMTP_IN;
|
||||||
dict_init(&filter_config->chain_procs);
|
dict_init(&filter_config->chain_procs);
|
||||||
} '{' filter_list '}' {
|
} '{' optnl filter_list '}' {
|
||||||
dict_set(conf->sc_filters_dict, listen_opts.filtername, filter_config);
|
dict_set(conf->sc_filters_dict, listen_opts.filtername, filter_config);
|
||||||
filter_config = NULL;
|
filter_config = NULL;
|
||||||
}
|
}
|
||||||
@ -2567,7 +2567,7 @@ table : TABLE STRING STRING {
|
|||||||
| TABLE STRING {
|
| TABLE STRING {
|
||||||
table = table_create(conf, "static", $2, NULL);
|
table = table_create(conf, "static", $2, NULL);
|
||||||
free($2);
|
free($2);
|
||||||
} '{' tableval_list '}' {
|
} '{' optnl tableval_list '}' {
|
||||||
table = NULL;
|
table = NULL;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -2580,7 +2580,7 @@ tablenew : STRING {
|
|||||||
free($1);
|
free($1);
|
||||||
$$ = t;
|
$$ = t;
|
||||||
}
|
}
|
||||||
| '{' {
|
| '{' optnl {
|
||||||
table = table_create(conf, "static", NULL, NULL);
|
table = table_create(conf, "static", NULL, NULL);
|
||||||
} tableval_list '}' {
|
} tableval_list '}' {
|
||||||
$$ = table;
|
$$ = table;
|
||||||
|
Loading…
Reference in New Issue
Block a user