Hi,

On 30/09/17 00:10, Steffan Karger wrote:
> Hi,
> 
> On 18-09-17 20:13, Antonio Quartulli wrote:
>> In the attempt of getting rid of any pf-inline.h file, we need
>> to make sure that inline functions do not trigger any circular
>> include dependency.
>>
>> For this reason, avoid pf_c2c/addr_test() to be 'struct context'
>> aware, so that pf-inline.h does not need to rely on the content
>> of openvpn.h.
>>
>> Cc: Steffan Karger <stef...@karger.me>
>> Signed-off-by: Antonio Quartulli <a...@unstable.cc>
>> ---
>>
>> v1-v3: skipped
>> v4: this is the first version of this patch, but named v4 for conveniency
>>
>>
>>  src/openvpn/multi.c     | 25 ++++++++++++++++++-------
>>  src/openvpn/pf-inline.h | 16 ++++++++++------
>>  src/openvpn/pf.c        |  6 +++++-
>>  3 files changed, 33 insertions(+), 14 deletions(-)
>>
>> diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c
>> index c798c438..641b825a 100644
>> --- a/src/openvpn/multi.c
>> +++ b/src/openvpn/multi.c
>> @@ -2233,7 +2233,10 @@ multi_bcast(struct multi_context *m,
>>  #ifdef ENABLE_PF
>>                  if (sender_instance)
>>                  {
>> -                    if (!pf_c2c_test(&sender_instance->context,
> &mi->context, "bcast_c2c"))
>> +                    if (!pf_c2c_test(&sender_instance->context.c2.pf,
>> +                                     &sender_instance->context,
>> +                                     &mi->context.c2.pf, &mi->context,
>> +                                     "bcast_c2c"))
>>                      {
>>                          msg(D_PF_DROPPED_BCAST, "PF: client[%s] ->
> client[%s] packet dropped by BCAST packet filter",
>>                              mi_prefix(sender_instance),
>> @@ -2243,7 +2246,8 @@ multi_bcast(struct multi_context *m,
>>                  }
>>                  if (sender_addr)
>>                  {
>> -                    if (!pf_addr_test(&mi->context, sender_addr,
> "bcast_src_addr"))
>> +                    if (!pf_addr_test(&mi->context.c2.pf, &mi->context,
>> +                                      sender_addr, "bcast_src_addr"))
>>                      {
>>                          struct gc_arena gc = gc_new();
>>                          msg(D_PF_DROPPED_BCAST, "PF: addr[%s] ->
> client[%s] packet dropped by BCAST packet filter",
>> @@ -2602,7 +2606,8 @@ multi_process_incoming_link(struct multi_context
> *m, struct multi_instance *inst
>>                          if (mi)
>>                          {
>>  #ifdef ENABLE_PF
>> -                            if (!pf_c2c_test(c, &mi->context, "tun_c2c"))
>> +                            if (!pf_c2c_test(&c->c2.pf, c,
> &mi->context.c2.pf,
>> +                                             &mi->context, "tun_c2c"))
>>                              {
>>                                  msg(D_PF_DROPPED, "PF: client ->
> client[%s] packet dropped by TUN packet filter",
>>                                      mi_prefix(mi));
>> @@ -2618,7 +2623,8 @@ multi_process_incoming_link(struct multi_context
> *m, struct multi_instance *inst
>>                      }
>>                  }
>>  #ifdef ENABLE_PF
>> -                if (c->c2.to_tun.len && !pf_addr_test(c, &dest,
> "tun_dest_addr"))
>> +                if (c->c2.to_tun.len && !pf_addr_test(&c->c2.pf, c,
> &dest,
>> +                                                      "tun_dest_addr"))
>>                  {
>>                      msg(D_PF_DROPPED, "PF: client -> addr[%s] packet
> dropped by TUN packet filter",
>>                          mroute_addr_print_ex(&dest, MAPF_SHOW_ARP, &gc));
>> @@ -2663,7 +2669,10 @@ multi_process_incoming_link(struct
> multi_context *m, struct multi_instance *inst
>>                                  if (mi)
>>                                  {
>>  #ifdef ENABLE_PF
>> -                                    if (!pf_c2c_test(c, &mi->context,
> "tap_c2c"))
>> +                                    if (!pf_c2c_test(&c->c2.pf, c,
>> +                                                     &mi->context.c2.pf,
>> +                                                     &mi->context,
>> +                                                     "tap_c2c"))
>>                                      {
>>                                          msg(D_PF_DROPPED, "PF: client
> -> client[%s] packet dropped by TAP packet filter",
>>                                              mi_prefix(mi));
>> @@ -2679,7 +2688,9 @@ multi_process_incoming_link(struct multi_context
> *m, struct multi_instance *inst
>>                              }
>>                          }
>>  #ifdef ENABLE_PF
>> -                        if (c->c2.to_tun.len && !pf_addr_test(c,
> &edest, "tap_dest_addr"))
>> +                        if (c->c2.to_tun.len &&
> !pf_addr_test(&c->c2.pf, c,
>> +                                                              &edest,
>> +
> "tap_dest_addr"))
>>                          {
>>                              msg(D_PF_DROPPED, "PF: client -> addr[%s]
> packet dropped by TAP packet filter",
>>                                  mroute_addr_print_ex(&edest,
> MAPF_SHOW_ARP, &gc));
>> @@ -2792,7 +2803,7 @@ multi_process_incoming_tun(struct multi_context
> *m, const unsigned int mpp_flags
>>                      set_prefix(m->pending);
>>
>>  #ifdef ENABLE_PF
>> -                    if (!pf_addr_test(c, e2, "tun_tap_src_addr"))
>> +                    if (!pf_addr_test(&c->c2.pf, c, e2,
> "tun_tap_src_addr"))
>>                      {
>>                          msg(D_PF_DROPPED, "PF: addr[%s] -> client
> packet dropped by packet filter",
>>                              mroute_addr_print_ex(&src, MAPF_SHOW_ARP,
> &gc));
>> diff --git a/src/openvpn/pf-inline.h b/src/openvpn/pf-inline.h
>> index ac19ac4c..7e38e674 100644
>> --- a/src/openvpn/pf-inline.h
>> +++ b/src/openvpn/pf-inline.h
>> @@ -31,20 +31,24 @@
>>  #define PCT_SRC  1
>>  #define PCT_DEST 2
>>  static inline bool
>> -pf_c2c_test(const struct context *src, const struct context *dest,
> const char *prefix)
>> +pf_c2c_test(const struct pf_context *src_pf, const struct context *src,
>> +            const struct pf_context *dest_pf, const struct context *dest,
>> +            const char *prefix)
> 
> If you make this function take a const struct tls_multi * as 2nd and 4th
> argument, you don't have to change the pf_cn_test function prototype
> (and it doesn't have to know about struct context internals, which is
> useful for testing modules separately).


Sorry for forgetting about this comment. This is actually a good idea!

v5 will come soon.


Cheers,


> 
>>  {
>> -    bool pf_cn_test(struct pf_set *pfs, const struct tls_multi *tm,
> const int type, const char *prefix);
>> +    bool pf_cn_test(const struct context *src, const struct context
> *dest,
>> +                    const int type, const char *prefix);
>>
>> -    return (!src->c2.pf.enabled  || pf_cn_test(src->c2.pf.pfs,
> dest->c2.tls_multi, PCT_DEST, prefix))
>> -           && (!dest->c2.pf.enabled || pf_cn_test(dest->c2.pf.pfs,
> src->c2.tls_multi,  PCT_SRC,  prefix));
>> +    return (!src_pf->enabled || pf_cn_test(src, dest, PCT_DEST, prefix))
>> +           && (!dest_pf->enabled || pf_cn_test(dest, src, PCT_SRC,
> prefix));
>>  }
>>
>>  static inline bool
>> -pf_addr_test(const struct context *src, const struct mroute_addr
> *dest, const char *prefix)
>> +pf_addr_test(const struct pf_context *src_pf, const struct context *src,
>> +             const struct mroute_addr *dest, const char *prefix)
>>  {
>>      bool pf_addr_test_dowork(const struct context *src, const struct
> mroute_addr *dest, const char *prefix);
>>
>> -    if (src->c2.pf.enabled)
>> +    if (src_pf->enabled)
>>      {
>>          return pf_addr_test_dowork(src, dest, prefix);
>>      }
>> diff --git a/src/openvpn/pf.c b/src/openvpn/pf.c
>> index 5cb002bf..135cb15d 100644
>> --- a/src/openvpn/pf.c
>> +++ b/src/openvpn/pf.c
>> @@ -442,8 +442,12 @@ lookup_cn_rule(struct hash *h, const char *cn,
> const uint32_t cn_hash)
>>  }
>>
>>  bool
>> -pf_cn_test(struct pf_set *pfs, const struct tls_multi *tm, const int
> type, const char *prefix)
>> +pf_cn_test(const struct context *src, const struct context *dest,
>> +           const int type, const char *prefix)
>>  {
>> +    struct pf_set *pfs = src->c2.pf.pfs;
>> +    struct tls_multi *tm = dest->c2.tls_multi;
>> +
>>      if (pfs && !pfs->kill)
>>      {
>>          const char *cn;
>>
> 
> Otherwise this looks good to me.
> 
> -Steffan
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
> 

-- 
Antonio Quartulli

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to