[M] Change in openvpn[master]: Split multi_get_create_instance_udp into data and control parts
"plaisthos \(Code Review\) via Openvpn-devel" <[email protected]> Thu, 30 Jul 2026 12:03:44 +0000
| Newsgroups | gmane.network.openvpn.devel |
|---|---|
| Message-ID | <cb7c51057fa26c8d008de6b1867d489495283bc8-EmailReplacePatchSet-HTML@gerrit.openvpn.net> |
--===============7731073159917752974==
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
Content-Type: multipart/alternative; boundary="i/Koy45Sn0E="; charset=UTF-8
--i/Koy45Sn0E=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Attention is currently required from: plaisthos=2E
Hello flichtenheld,
I=
'd like you to reexamine a change=2E Please visit
http://gerrit=2Eopen=
vpn=2Enet/c/openvpn/+/1726?usp=3Demail
to look at the new patch set (#16)=
=2E
The change is no longer submittable: checks~ChecksSubmitRule is unsati=
sfied now=2E
Change subject: Split multi_get_create_instance_udp into dat=
a and control parts
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=
=2E=2E
Split multi_get_create_instance_udp into data and control parts
Th=
is currently leads to a bit of code duplication but this refactoring
will m=
ake the follow up patches cleaner and better to understand when
the control=
channel lookup will be changed to use session ids instead of
IP addresses=
=2E
Change-Id: I8e9923b51b77f184c7d49d697004cb02d2b5cfc3
Signed-off-by: Ar=
ne Schwabe <arne@rfc2549=2Eorg>
---
M src/openvpn/mudp=2Ec
1 file changed, =
97 insertions(+), 54 deletions(-)
git pull ssh://gerrit=2Eopenvpn=2Enet=
:29418/openvpn refs/changes/26/1726/16
diff --git a/src/openvpn/mudp=2Ec b=
/src/openvpn/mudp=2Ec
index 596a458=2E=2Ef176655 100644
--- a/src/openvpn/m=
udp=2Ec
+++ b/src/openvpn/mudp=2Ec
@@ -204,8 +204,7 @@
static struct multi=
_instance *
handle_connection_attempt(struct multi_context *m,
=
struct link_socket *sock,
- struct=
mroute_addr *real,
- struct hash_bucket *bucket)
=
+ struct mroute_addr *real)
{
struct hash *h=
ash =3D m->hash;
struct tls_pre_decrypt_state state =3D { 0 };
@@ -236=
,7 +235,9 @@
if (mi)
{
const uin=
t64_t hv =3D hash_value(hash, real);
+ struct hash_bucket *b=
ucket =3D hash_bucket(hash, hv);
hash_add_fast(hash, bucke=
t, &mi->real, hv, mi);
+
mi->did_real_hash =3D true;
=
multi_assign_peer_id(m, mi);
@@ -285,6 +286,19 @@
return=
NULL;
}
+struct multi_instance *
+multi_get_instance_udp_control(struct=
multi_context *m, struct link_socket *sock)
+{
+ struct mroute_addr rea=
l =3D { 0 };
+ real=2Eproto =3D sock->info=2Eproto;
+
+ if (mroute_ex=
tract_openvpn_sockaddr(&real, &m->top=2Ec2=2Efrom=2Edest, true) && m->top=
=2Ec2=2Ebuf=2Elen > 0)
+ {
+ return multi_get_instance_udp_real(m=
, &real);
+ }
+
+ return NULL;
+}
/**
* Get a client instance ba=
sed on real address=2E If
@@ -292,72 +306,101 @@
* maintaining real addr=
ess hash table atomicity=2E
*/
struct multi_instance *
-multi_get_create=
_instance_udp(struct multi_context *m, bool *floated, struct link_socket *s=
ock)
+multi_get_instance_udp_data(struct multi_context *m, bool *floated, s=
truct mroute_addr *real, struct link_socket *sock)
{
- struct gc_arena =
gc =3D gc_new();
- struct mroute_addr real =3D { 0 };
struct multi_=
instance *mi =3D NULL;
- struct hash *hash =3D m->hash;
- real=2Eprot=
o =3D sock->info=2Eproto;
- if (mroute_extract_openvpn_sockaddr(&real,=
&m->top=2Ec2=2Efrom=2Edest, true) && m->top=2Ec2=2Ebuf=2Elen > 0)
+ uin=
t8_t *ptr =3D BPTR(&m->top=2Ec2=2Ebuf);
+ uint8_t op =3D ptr[0] >> P_OPC=
ODE_SHIFT;
+ bool v2 =3D (op =3D=3D P_DATA_V2) && (m->top=2Ec2=2Ebuf=2El=
en >=3D (1 + 3));
+ bool peer_id_disabled =3D false;
+
+ /* make sure=
buffer has enough length to read opcode (1 byte) and peer-id (3 bytes) */
=
+ if (v2)
{
- const uint64_t hv =3D hash_value(hash, &real);=
- struct hash_bucket *bucket =3D hash_bucket(hash, hv);
- ui=
nt8_t *ptr =3D BPTR(&m->top=2Ec2=2Ebuf);
- uint8_t op =3D ptr[0] >> =
P_OPCODE_SHIFT;
- bool v2 =3D (op =3D=3D P_DATA_V2) && (m->top=2Ec2=
=2Ebuf=2Elen >=3D (1 + 3));
- bool peer_id_disabled =3D false;
+ =
uint32_t peer_id =3D ((uint32_t)ptr[1] << 16) | ((uint32_t)ptr[2] << 8)=
| ((uint32_t)ptr[3]);
+ peer_id_disabled =3D (peer_id =3D=3D MAX_PE=
ER_ID);
- /* make sure buffer has enough length to read opcode (1 =
byte) and peer-id (3 bytes) */
- if (v2)
+ if (!peer_id_disab=
led && (peer_id < m->max_clients) && (m->instances[peer_id]))
{
- =
uint32_t peer_id =3D ((uint32_t)ptr[1] << 16) | ((uint32_t)ptr[2=
] << 8) | ((uint32_t)ptr[3]);
- peer_id_disabled =3D (peer_id =
=3D=3D MAX_PEER_ID);
-
- if (!peer_id_disabled && (peer_id < m->=
max_clients) && m->instances[peer_id])
+ /* Floating on TCP will=
never be possible, so ensure we only process
+ * UDP clients *=
/
+ if (m->instances[peer_id]->context=2Ec2=2Elink_sockets[0]->i=
nfo=2Eproto
+ =3D=3D sock->info=2Eproto)
{
- =
/* Floating on TCP will never be possible, so ensure we only p=
rocess
- * UDP clients */
- if (m->instances=
[peer_id]->context=2Ec2=2Elink_sockets[0]->info=2Eproto
- =
=3D=3D sock->info=2Eproto)
- {
- mi =3D=
m->instances[peer_id];
- *floated =3D !link_socket_actu=
al_match(&mi->context=2Ec2=2Efrom, &m->top=2Ec2=2Efrom);
+ m=
i =3D m->instances[peer_id];
+ *floated =3D !link_socket_act=
ual_match(&mi->context=2Ec2=2Efrom, &m->top=2Ec2=2Efrom);
- =
if (*floated)
- {
- /* rese=
t prefix, since here we are not sure peer is the one it claims to be
- =
*/
- ungenerate_prefix(mi);
- =
msg(D_MULTI_MEDIUM, "Float requested for peer %" PRIu3=
2 " to %s", peer_id,
- mroute_addr_print(&real, =
&gc));
- }
+ if (*floated)
+ =
{
+ /* reset prefix, since here we are not sure peer =
is the one it claims to be
+ */
+ un=
generate_prefix(mi);
+ struct gc_arena gc =3D gc_new();
=
+ msg(D_MULTI_MEDIUM, "Float requested for peer %" PRIu3=
2 " to %s", peer_id,
+ mroute_addr_print(real, &gc))=
;
+ gc_free(&gc);
}
+ re=
turn mi;
}
}
- if (!v2 || peer_id_disabled)
- =
{
- mi =3D multi_get_instance_udp_real(m, &real);
- =
}
+ }
+ if (!v2 || peer_id_disabled)
+ {
+ return multi_g=
et_instance_udp_real(m, real);
+ }
+ return NULL;
+}
- /* we=
have no existing multi instance for this connection */
- if (!mi)
-=
{
- mi =3D handle_connection_attempt(m, sock, &real, buc=
ket);
- }
-
-#ifdef ENABLE_DEBUG
- if (check_debug_level(D_MU=
LTI_DEBUG))
- {
- const char *status =3D mi ? "[ok]" : "[=
failed]";
-
- dmsg(D_MULTI_DEBUG, "GET INST BY REAL: %s %s", mro=
ute_addr_print(&real, &gc), status);
- }
-#endif
+struct multi_insta=
nce *
+multi_get_create_instance_udp(struct multi_context *m, bool *floated=
, struct link_socket *sock)
+{
+ /* If the buffer is empty, the packet h=
as no op code and can be neither
+ * a (valid) data nor control packet =
*/
+ if (m->top=2Ec2=2Ebuf=2Elen <=3D 0)
+ {
+ return NULL;
=
}
- gc_free(&gc);
+ uint8_t *ptr =3D BPTR(&m->top=2Ec2=2Ebuf);
+=
uint8_t op =3D ptr[0] >> P_OPCODE_SHIFT;
+
+ struct mroute_addr real=
=3D { 0 };
+ real=2Eproto =3D sock->info=2Eproto;
+
+ if (!mroute_ex=
tract_openvpn_sockaddr(&real, &m->top=2Ec2=2Efrom=2Edest, true))
+ {
+ =
return NULL;
+ }
+
+ struct multi_instance *mi =3D NULL;
+ i=
f (op =3D=3D P_DATA_V1 || op =3D=3D P_DATA_V2)
+ {
+ mi =3D multi=
_get_instance_udp_data(m, floated, &real, sock);
+ }
+ else
+ {
+ =
mi =3D multi_get_instance_udp_control(m, sock);
+
+ /* we hav=
e no existing multi instance for this connection, control
+ * packe=
ts can create a session=2E Data packets cannot */
+ if (!mi)
+ =
{
+ mi =3D handle_connection_attempt(m, sock, &real);
+ =
}
+ }
+
+#ifdef ENABLE_DEBUG
+ if (check_debug_level(D_MULTI_DEBUG))=
+ {
+ struct gc_arena gc =3D gc_new();
+ const char *stat=
us =3D mi ? "[ok]" : "[failed]";
+
+ dmsg(D_MULTI_DEBUG, "GET INST B=
Y REAL/SID: %s %s", mroute_addr_print(&real, &gc), status);
+ gc_fre=
e(&gc);
+ }
+#endif
+
ASSERT(!(mi && mi->halt));
return mi;
}=
--
To view, visit http://gerrit=2Eopenvpn=2Enet/c/openvpn/+/1726?usp=3De=
mail
To unsubscribe, or for help writing mail filters, visit http://gerrit=
=2Eopenvpn=2Enet/settings?usp=3Demail
Gerrit-MessageType: newpatchset
Gerr=
it-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I8e9923b51b77f1=
84c7d49d697004cb02d2b5cfc3
Gerrit-Change-Number: 1726
Gerrit-PatchSet: 16
G=
errit-Owner: plaisthos <arne-openvpn@rfc2549=2Eorg>
Gerrit-Reviewer: flicht=
enheld <frank@lichtenheld=2Ecom>
Gerrit-CC: openvpn-devel <openvpn-devel@li=
sts=2Esourceforge=2Enet>
Gerrit-Attention: plaisthos <arne-openvpn@rfc2549=
=2Eorg>
--i/Koy45Sn0E=
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE html><html><head><style></style></head><body><p> Attention is cur=
rently required from: plaisthos=2E </p>
<p>plaisthos <strong>uploaded patch=
set #16</strong> to this change=2E</p><p><a href=3D"http://gerrit=2Eopenvp=
n=2Enet/c/openvpn/+/1726?usp=3Demail">View Change</a></p><p>The change is n=
o longer submittable: checks~ChecksSubmitRule is unsatisfied now=2E</p><pre=
class=3D"blocks" style=3D"font-family: monospace,monospace; white-space: p=
re-wrap;">Split multi_get_create_instance_udp into data and control parts<b=
r><br>This currently leads to a bit of code duplication but this refactorin=
g<br>will make the follow up patches cleaner and better to understand when<=
br>the control channel lookup will be changed to use session ids instead of=
<br>IP addresses=2E<br><br>Change-Id: I8e9923b51b77f184c7d49d697004cb02d2b5=
cfc3<br>Signed-off-by: Arne Schwabe <arne@rfc2549=2Eorg><br>---<br>M =
src/openvpn/mudp=2Ec<br>1 file changed, 97 insertions(+), 54 deletions(-)<b=
r><br></pre><pre class=3D"blocks" style=3D"font-family: monospace,monospace=
; white-space: pre-wrap;">git pull ssh://gerrit=2Eopenvpn=2Enet:29418/openv=
pn refs/changes/26/1726/16</pre><pre style=3D"font-family: monospace,monosp=
ace; white-space: pre-wrap;"><span>diff --git a/src/openvpn/mudp=2Ec b/src/=
openvpn/mudp=2Ec</span><br><span>index 596a458=2E=2Ef176655 100644</span><b=
r><span>--- a/src/openvpn/mudp=2Ec</span><br><span>+++ b/src/openvpn/mudp=
=2Ec</span><br><span>@@ -204,8 +204,7 @@</span><br><span> static struct mul=
ti_instance *</span><br><span> handle_connection_attempt(struct multi_conte=
xt *m,</span><br><span> struct link_socket *sock,=
</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
struct mroute_addr *real,</span><br><span style=3D"color: hsl(0, 100%,=
40%);">- struct hash_bucket *bucket)</span><br><s=
pan style=3D"color: hsl(120, 100%, 40%);">+ struct=
mroute_addr *real)</span><br><span> {</span><br><span> struct hash *ha=
sh =3D m->hash;</span><br><span> struct tls_pre_decrypt_state state =
=3D { 0 };</span><br><span>@@ -236,7 +235,9 @@</span><br><span> =
if (mi)</span><br><span> {</span><br><span> co=
nst uint64_t hv =3D hash_value(hash, real);</span><br><span style=3D"color:=
hsl(120, 100%, 40%);">+ struct hash_bucket *bucket =3D hash=
_bucket(hash, hv);</span><br><span> hash_add_fast(hash, buc=
ket, &mi->real, hv, mi);</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+</span><br><span> mi->did_real_hash =3D true=
;</span><br><span> multi_assign_peer_id(m, mi);</span><br><=
span> </span><br><span>@@ -285,6 +286,19 @@</span><br><span> return NUL=
L;</span><br><span> }</span><br><span> </span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+struct multi_instance *</span><br><span style=3D"color:=
hsl(120, 100%, 40%);">+multi_get_instance_udp_control(struct multi_context=
*m, struct link_socket *sock)</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+{</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ str=
uct mroute_addr real =3D { 0 };</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+ real=2Eproto =3D sock->info=2Eproto;</span><br><span sty=
le=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(12=
0, 100%, 40%);">+ if (mroute_extract_openvpn_sockaddr(&real, &m-=
>top=2Ec2=2Efrom=2Edest, true) && m->top=2Ec2=2Ebuf=2Elen >=
; 0)</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ {</span><br=
><span style=3D"color: hsl(120, 100%, 40%);">+ return multi_get_inst=
ance_udp_real(m, &real);</span><br><span style=3D"color: hsl(120, 100%,=
40%);">+ }</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+ return NULL;</span><=
br><span style=3D"color: hsl(120, 100%, 40%);">+}</span><br><span> </span><=
br><span> /**</span><br><span> * Get a client instance based on real addre=
ss=2E If</span><br><span>@@ -292,72 +306,101 @@</span><br><span> * mainta=
ining real address hash table atomicity=2E</span><br><span> */</span><br><=
span> struct multi_instance *</span><br><span style=3D"color: hsl(0, 100%, =
40%);">-multi_get_create_instance_udp(struct multi_context *m, bool *floate=
d, struct link_socket *sock)</span><br><span style=3D"color: hsl(120, 100%,=
40%);">+multi_get_instance_udp_data(struct multi_context *m, bool *floated=
, struct mroute_addr *real, struct link_socket *sock)</span><br><span> {</s=
pan><br><span style=3D"color: hsl(0, 100%, 40%);">- struct gc_arena gc =
=3D gc_new();</span><br><span style=3D"color: hsl(0, 100%, 40%);">- stru=
ct mroute_addr real =3D { 0 };</span><br><span> struct multi_instance *=
mi =3D NULL;</span><br><span style=3D"color: hsl(0, 100%, 40%);">- struc=
t hash *hash =3D m->hash;</span><br><span style=3D"color: hsl(0, 100%, 4=
0%);">- real=2Eproto =3D sock->info=2Eproto;</span><br><span> </span>=
<br><span style=3D"color: hsl(0, 100%, 40%);">- if (mroute_extract_openv=
pn_sockaddr(&real, &m->top=2Ec2=2Efrom=2Edest, true) && =
m->top=2Ec2=2Ebuf=2Elen > 0)</span><br><span style=3D"color: hsl(120,=
100%, 40%);">+ uint8_t *ptr =3D BPTR(&m->top=2Ec2=2Ebuf);</span>=
<br><span style=3D"color: hsl(120, 100%, 40%);">+ uint8_t op =3D ptr[0] =
>> P_OPCODE_SHIFT;</span><br><span style=3D"color: hsl(120, 100%, 40%=
);">+ bool v2 =3D (op =3D=3D P_DATA_V2) && (m->top=2Ec2=2Ebuf=
=2Elen >=3D (1 + 3));</span><br><span style=3D"color: hsl(120, 100%, 40%=
);">+ bool peer_id_disabled =3D false;</span><br><span style=3D"color: h=
sl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);=
">+ /* make sure buffer has enough length to read opcode (1 byte) and pe=
er-id (3 bytes) */</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
if (v2)</span><br><span> {</span><br><span style=3D"color: hsl(0, 10=
0%, 40%);">- const uint64_t hv =3D hash_value(hash, &real);</spa=
n><br><span style=3D"color: hsl(0, 100%, 40%);">- struct hash_bucket=
*bucket =3D hash_bucket(hash, hv);</span><br><span style=3D"color: hsl(0, =
100%, 40%);">- uint8_t *ptr =3D BPTR(&m->top=2Ec2=2Ebuf);</sp=
an><br><span style=3D"color: hsl(0, 100%, 40%);">- uint8_t op =3D pt=
r[0] >> P_OPCODE_SHIFT;</span><br><span style=3D"color: hsl(0, 100%, =
40%);">- bool v2 =3D (op =3D=3D P_DATA_V2) && (m->top=2Ec=
2=2Ebuf=2Elen >=3D (1 + 3));</span><br><span style=3D"color: hsl(0, 100%=
, 40%);">- bool peer_id_disabled =3D false;</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+ uint32_t peer_id =3D ((uint32_t)ptr[=
1] << 16) | ((uint32_t)ptr[2] << 8) | ((uint32_t)ptr[3]);</span=
><br><span style=3D"color: hsl(120, 100%, 40%);">+ peer_id_disabled =
=3D (peer_id =3D=3D MAX_PEER_ID);</span><br><span> </span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- /* make sure buffer has enough leng=
th to read opcode (1 byte) and peer-id (3 bytes) */</span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- if (v2)</span><br><span style=3D"co=
lor: hsl(120, 100%, 40%);">+ if (!peer_id_disabled && (peer_=
id < m->max_clients) && (m->instances[peer_id]))</span><br=
><span> {</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
uint32_t peer_id =3D ((uint32_t)ptr[1] << 16) | ((uint32_t)pt=
r[2] << 8) | ((uint32_t)ptr[3]);</span><br><span style=3D"color: hsl(=
0, 100%, 40%);">- peer_id_disabled =3D (peer_id =3D=3D MAX_PEER_=
ID);</span><br><span style=3D"color: hsl(0, 100%, 40%);">-</span><br><span =
style=3D"color: hsl(0, 100%, 40%);">- if (!peer_id_disabled &=
;& (peer_id < m->max_clients) && m->instances[peer_id]=
)</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ /* Flo=
ating on TCP will never be possible, so ensure we only process</span><br><s=
pan style=3D"color: hsl(120, 100%, 40%);">+ * UDP clients */</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+ if (m->=
instances[peer_id]->context=2Ec2=2Elink_sockets[0]->info=2Eproto</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+ =3D=3D s=
ock->info=2Eproto)</span><br><span> {</span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- /* Floating on TCP will nev=
er be possible, so ensure we only process</span><br><span style=3D"color: h=
sl(0, 100%, 40%);">- * UDP clients */</span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- if (m->instances[peer_id=
]->context=2Ec2=2Elink_sockets[0]->info=2Eproto</span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- =3D=3D sock->info=2E=
proto)</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
{</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
mi =3D m->instances[peer_id];</span><br><span style=3D"color: hsl(0, 10=
0%, 40%);">- *floated =3D !link_socket_actual_match(&=
;mi->context=2Ec2=2Efrom, &m->top=2Ec2=2Efrom);</span><br><span s=
tyle=3D"color: hsl(120, 100%, 40%);">+ mi =3D m->instance=
s[peer_id];</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
*floated =3D !link_socket_actual_match(&mi->context=2Ec2=2Ef=
rom, &m->top=2Ec2=2Efrom);</span><br><span> </span><br><span style=
=3D"color: hsl(0, 100%, 40%);">- if (*floated)</span><br=
><span style=3D"color: hsl(0, 100%, 40%);">- {</span><br=
><span style=3D"color: hsl(0, 100%, 40%);">- /* rese=
t prefix, since here we are not sure peer is the one it claims to be</span>=
<br><span style=3D"color: hsl(0, 100%, 40%);">- */<=
/span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
ungenerate_prefix(mi);</span><br><span style=3D"color: hsl(0, 100%, 40%);=
">- msg(D_MULTI_MEDIUM, "Float requested for pe=
er %" PRIu32 " to %s", peer_id,</span><br><span style=3D"col=
or: hsl(0, 100%, 40%);">- mroute_addr_print(&=
;real, &gc));</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
}</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
if (*floated)</span><br><span style=3D"color: hsl(120, 100%, =
40%);">+ {</span><br><span style=3D"color: hsl(120, 100%, 40=
%);">+ /* reset prefix, since here we are not sure peer =
is the one it claims to be</span><br><span style=3D"color: hsl(120, 100%, 4=
0%);">+ */</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+ ungenerate_prefix(mi);</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+ struct gc_arena gc =
=3D gc_new();</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
msg(D_MULTI_MEDIUM, "Float requested for peer %" PR=
Iu32 " to %s", peer_id,</span><br><span style=3D"color: hsl(120, =
100%, 40%);">+ mroute_addr_print(real, &gc));</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+ gc=
_free(&gc);</span><br><span> }</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+ return mi;</span><br><span> =
}</span><br><span> }</span><br><span style=3D"color: hs=
l(0, 100%, 40%);">- if (!v2 || peer_id_disabled)</span><br><span sty=
le=3D"color: hsl(0, 100%, 40%);">- {</span><br><span style=3D"color:=
hsl(0, 100%, 40%);">- mi =3D multi_get_instance_udp_real(m, &am=
p;real);</span><br><span style=3D"color: hsl(0, 100%, 40%);">- }</sp=
an><br><span style=3D"color: hsl(120, 100%, 40%);">+ }</span><br><span s=
tyle=3D"color: hsl(120, 100%, 40%);">+ if (!v2 || peer_id_disabled)</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+ {</span><br><span st=
yle=3D"color: hsl(120, 100%, 40%);">+ return multi_get_instance_udp_=
real(m, real);</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ }=
</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ return NULL;</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+}</span><br><span> </s=
pan><br><span style=3D"color: hsl(0, 100%, 40%);">- /* we have no ex=
isting multi instance for this connection */</span><br><span style=3D"color=
: hsl(0, 100%, 40%);">- if (!mi)</span><br><span style=3D"color: hsl=
(0, 100%, 40%);">- {</span><br><span style=3D"color: hsl(0, 100%, 40=
%);">- mi =3D handle_connection_attempt(m, sock, &real, buck=
et);</span><br><span style=3D"color: hsl(0, 100%, 40%);">- }</span><=
br><span style=3D"color: hsl(0, 100%, 40%);">-</span><br><span style=3D"col=
or: hsl(0, 100%, 40%);">-#ifdef ENABLE_DEBUG</span><br><span style=3D"color=
: hsl(0, 100%, 40%);">- if (check_debug_level(D_MULTI_DEBUG))</span>=
<br><span style=3D"color: hsl(0, 100%, 40%);">- {</span><br><span st=
yle=3D"color: hsl(0, 100%, 40%);">- const char *status =3D mi ? =
"[ok]" : "[failed]";</span><br><span style=3D"color: hs=
l(0, 100%, 40%);">-</span><br><span style=3D"color: hsl(0, 100%, 40%);">- =
dmsg(D_MULTI_DEBUG, "GET INST BY REAL: %s %s", mroute_a=
ddr_print(&real, &gc), status);</span><br><span style=3D"color: hsl=
(0, 100%, 40%);">- }</span><br><span style=3D"color: hsl(0, 100%, 40=
%);">-#endif</span><br><span style=3D"color: hsl(120, 100%, 40%);">+struct =
multi_instance *</span><br><span style=3D"color: hsl(120, 100%, 40%);">+mul=
ti_get_create_instance_udp(struct multi_context *m, bool *floated, struct l=
ink_socket *sock)</span><br><span style=3D"color: hsl(120, 100%, 40%);">+{<=
/span><br><span style=3D"color: hsl(120, 100%, 40%);">+ /* If the buffer=
is empty, the packet has no op code and can be neither</span><br><span sty=
le=3D"color: hsl(120, 100%, 40%);">+ * a (valid) data nor control packe=
t */</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ if (m->t=
op=2Ec2=2Ebuf=2Elen <=3D 0)</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+ {</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
return NULL;</span><br><span> }</span><br><span> </span><br><span =
style=3D"color: hsl(0, 100%, 40%);">- gc_free(&gc);</span><br><span =
style=3D"color: hsl(120, 100%, 40%);">+ uint8_t *ptr =3D BPTR(&m->=
;top=2Ec2=2Ebuf);</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
uint8_t op =3D ptr[0] >> P_OPCODE_SHIFT;</span><br><span style=3D"c=
olor: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120, 100%=
, 40%);">+ struct mroute_addr real =3D { 0 };</span><br><span style=3D"c=
olor: hsl(120, 100%, 40%);">+ real=2Eproto =3D sock->info=2Eproto;</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+ if (!mroute_extract_openvpn_sockaddr(=
&real, &m->top=2Ec2=2Efrom=2Edest, true))</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+ {</span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+ return NULL;</span><br><span style=3D"color: hs=
l(120, 100%, 40%);">+ }</span><br><span style=3D"color: hsl(120, 100%, 4=
0%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ struct m=
ulti_instance *mi =3D NULL;</span><br><span style=3D"color: hsl(120, 100%, =
40%);">+ if (op =3D=3D P_DATA_V1 || op =3D=3D P_DATA_V2)</span><br><span=
style=3D"color: hsl(120, 100%, 40%);">+ {</span><br><span style=3D"colo=
r: hsl(120, 100%, 40%);">+ mi =3D multi_get_instance_udp_data(m, flo=
ated, &real, sock);</span><br><span style=3D"color: hsl(120, 100%, 40%)=
;">+ }</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ else</=
span><br><span style=3D"color: hsl(120, 100%, 40%);">+ {</span><br><span=
style=3D"color: hsl(120, 100%, 40%);">+ mi =3D multi_get_instance_u=
dp_control(m, sock);</span><br><span style=3D"color: hsl(120, 100%, 40%);">=
+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ /* we have=
no existing multi instance for this connection, control</span><br><span st=
yle=3D"color: hsl(120, 100%, 40%);">+ * packets can create a sessio=
n=2E Data packets cannot */</span><br><span style=3D"color: hsl(120, 100%, =
40%);">+ if (!mi)</span><br><span style=3D"color: hsl(120, 100%, 40%=
);">+ {</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
mi =3D handle_connection_attempt(m, sock, &real);</span><br><spa=
n style=3D"color: hsl(120, 100%, 40%);">+ }</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+ }</span><br><span style=3D"color: hsl(12=
0, 100%, 40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+#i=
fdef ENABLE_DEBUG</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
if (check_debug_level(D_MULTI_DEBUG))</span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+ {</span><br><span style=3D"color: hsl(120, 100%, 40=
%);">+ struct gc_arena gc =3D gc_new();</span><br><span style=3D"col=
or: hsl(120, 100%, 40%);">+ const char *status =3D mi ? "[ok]&q=
uot; : "[failed]";</span><br><span style=3D"color: hsl(120, 100%,=
40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ dm=
sg(D_MULTI_DEBUG, "GET INST BY REAL/SID: %s %s", mroute_addr_prin=
t(&real, &gc), status);</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+ gc_free(&gc);</span><br><span style=3D"color: hsl(1=
20, 100%, 40%);">+ }</span><br><span style=3D"color: hsl(120, 100%, 40%)=
;">+#endif</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><b=
r><span> ASSERT(!(mi && mi->halt));</span><br><span> ret=
urn mi;</span><br><span> }</span><br><span></span><br></pre><p>To view, vis=
it <a href=3D"http://gerrit=2Eopenvpn=2Enet/c/openvpn/+/1726?usp=3Demail">c=
hange 1726</a>=2E To unsubscribe, or for help writing mail filters, visit <=
a href=3D"http://gerrit=2Eopenvpn=2Enet/settings?usp=3Demail">settings</a>=
=2E</p><div itemscope itemtype=3D"http://schema=2Eorg/EmailMessage"><div it=
emscope itemprop=3D"action" itemtype=3D"http://schema=2Eorg/ViewAction"><li=
nk itemprop=3D"url" href=3D"http://gerrit=2Eopenvpn=2Enet/c/openvpn/+/1726?=
usp=3Demail"/><meta itemprop=3D"name" content=3D"View Change"/></div></div>=
<div style=3D"display:none"> Gerrit-MessageType: newpatchset </div>
<div =
style=3D"display:none"> Gerrit-Project: openvpn </div>
<div style=3D"displa=
y:none"> Gerrit-Branch: master </div>
<div style=3D"display:none"> Gerrit-C=
hange-Id: I8e9923b51b77f184c7d49d697004cb02d2b5cfc3 </div>
<div style=3D"di=
splay:none"> Gerrit-Change-Number: 1726 </div>
<div style=3D"display:none">=
Gerrit-PatchSet: 16 </div>
<div style=3D"display:none"> Gerrit-Owner: plai=
sthos <arne-openvpn@rfc2549=2Eorg> </div>
<div style=3D"display:none"=
> Gerrit-Reviewer: flichtenheld <frank@lichtenheld=2Ecom> </div>
<div=
style=3D"display:none"> Gerrit-CC: openvpn-devel <openvpn-devel@lists=
=2Esourceforge=2Enet> </div>
<div style=3D"display:none"> Gerrit-Attenti=
on: plaisthos <arne-openvpn@rfc2549=2Eorg> </div>
</body></html>
--i/Koy45Sn0E=--
--===============7731073159917752974==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--===============7731073159917752974==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel
--===============7731073159917752974==--