[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 &lt;arne@rfc2549=2Eorg&gt;<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-&gt;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, &amp;mi-&gt;real, hv, mi);</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+</span><br><span>                 mi-&gt;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-&gt;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(&amp;real, &amp;m-=
&gt;top=2Ec2=2Efrom=2Edest, true) &amp;&amp; m-&gt;top=2Ec2=2Ebuf=2Elen &gt=
; 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, &amp;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-&gt;hash;</span><br><span style=3D"color: hsl(0, 100%, 4=
0%);">-    real=2Eproto =3D sock-&gt;info=2Eproto;</span><br><span> </span>=
<br><span style=3D"color: hsl(0, 100%, 40%);">-    if (mroute_extract_openv=
pn_sockaddr(&amp;real, &amp;m-&gt;top=2Ec2=2Efrom=2Edest, true) &amp;&amp; =
m-&gt;top=2Ec2=2Ebuf=2Elen &gt; 0)</span><br><span style=3D"color: hsl(120,=
 100%, 40%);">+    uint8_t *ptr =3D BPTR(&amp;m-&gt;top=2Ec2=2Ebuf);</span>=
<br><span style=3D"color: hsl(120, 100%, 40%);">+    uint8_t op =3D ptr[0] =
&gt;&gt; P_OPCODE_SHIFT;</span><br><span style=3D"color: hsl(120, 100%, 40%=
);">+    bool v2 =3D (op =3D=3D P_DATA_V2) &amp;&amp; (m-&gt;top=2Ec2=2Ebuf=
=2Elen &gt;=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, &amp;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(&amp;m-&gt;top=2Ec2=2Ebuf);</sp=
an><br><span style=3D"color: hsl(0, 100%, 40%);">-        uint8_t op =3D pt=
r[0] &gt;&gt; P_OPCODE_SHIFT;</span><br><span style=3D"color: hsl(0, 100%, =
40%);">-        bool v2 =3D (op =3D=3D P_DATA_V2) &amp;&amp; (m-&gt;top=2Ec=
2=2Ebuf=2Elen &gt;=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] &lt;&lt; 16) | ((uint32_t)ptr[2] &lt;&lt; 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 &amp;&amp; (peer_=
id &lt; m-&gt;max_clients) &amp;&amp; (m-&gt;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] &lt;&lt; 16) | ((uint32_t)pt=
r[2] &lt;&lt; 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 &amp=
;&amp; (peer_id &lt; m-&gt;max_clients) &amp;&amp; m-&gt;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-&gt;=
instances[peer_id]-&gt;context=2Ec2=2Elink_sockets[0]-&gt;info=2Eproto</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+                =3D=3D s=
ock-&gt;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-&gt;instances[peer_id=
]-&gt;context=2Ec2=2Elink_sockets[0]-&gt;info=2Eproto</span><br><span style=
=3D"color: hsl(0, 100%, 40%);">-                    =3D=3D sock-&gt;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-&gt;instances[peer_id];</span><br><span style=3D"color: hsl(0, 10=
0%, 40%);">-                    *floated =3D !link_socket_actual_match(&amp=
;mi-&gt;context=2Ec2=2Efrom, &amp;m-&gt;top=2Ec2=2Efrom);</span><br><span s=
tyle=3D"color: hsl(120, 100%, 40%);">+                mi =3D m-&gt;instance=
s[peer_id];</span><br><span style=3D"color: hsl(120, 100%, 40%);">+        =
        *floated =3D !link_socket_actual_match(&amp;mi-&gt;context=2Ec2=2Ef=
rom, &amp;m-&gt;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, &quot;Float requested for pe=
er %&quot; PRIu32 &quot; to %s&quot;, peer_id,</span><br><span style=3D"col=
or: hsl(0, 100%, 40%);">-                            mroute_addr_print(&amp=
;real, &amp;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, &quot;Float requested for peer %&quot; PR=
Iu32 &quot; to %s&quot;, peer_id,</span><br><span style=3D"color: hsl(120, =
100%, 40%);">+                        mroute_addr_print(real, &amp;gc));</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+                    gc=
_free(&amp;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, &amp;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 ? =
&quot;[ok]&quot; : &quot;[failed]&quot;;</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, &quot;GET INST BY REAL: %s %s&quot;, mroute_a=
ddr_print(&amp;real, &amp;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-&gt;t=
op=2Ec2=2Ebuf=2Elen &lt;=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(&amp;gc);</span><br><span =
style=3D"color: hsl(120, 100%, 40%);">+    uint8_t *ptr =3D BPTR(&amp;m-&gt=
;top=2Ec2=2Ebuf);</span><br><span style=3D"color: hsl(120, 100%, 40%);">+  =
  uint8_t op =3D ptr[0] &gt;&gt; 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-&gt;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(=
&amp;real, &amp;m-&gt;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, &amp;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, &amp;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 ? &quot;[ok]&q=
uot; : &quot;[failed]&quot;;</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, &quot;GET INST BY REAL/SID: %s %s&quot;, mroute_addr_prin=
t(&amp;real, &amp;gc), status);</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+        gc_free(&amp;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 &amp;&amp; mi-&gt;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 &lt;arne-openvpn@rfc2549=2Eorg&gt; </div>
<div style=3D"display:none"=
> Gerrit-Reviewer: flichtenheld &lt;frank@lichtenheld=2Ecom&gt; </div>
<div=
 style=3D"display:none"> Gerrit-CC: openvpn-devel &lt;openvpn-devel@lists=
=2Esourceforge=2Enet&gt; </div>
<div style=3D"display:none"> Gerrit-Attenti=
on: plaisthos &lt;arne-openvpn@rfc2549=2Eorg&gt; </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==--