Re: rt_ifp and pf(4)

2015-11-22 Thread Alexandr Nedvedicky
On Sat, Nov 21, 2015 at 12:37:58PM +0100, Martin Pieuchot wrote:
> On 20/11/15(Fri) 18:05, Alexandr Nedvedicky wrote:
> > Hello,
> > 
> > I have just nit comments, feel free to ignore them.
> > 
> > 1) would it be possible to use closing #endif guards as follows:
> > #endif  /* NCARP */
> 
> Done.
> 

thanks a lot. I'm fine with your patch.

OK

regards
sasha

> > it's detail, given at some point in future we will probably have to use
> > if_put()/if_get() for ifp's bound to kif's (right?).
> 
> Well not necessarily.  kif have the same lifetime as an ifp and are easy
> to garbage collect so there's no need for the moment to use index for
> them.  Indexes are useful when two objects having a different lifetime
> need to be linked at some point.  By using indexes/id/cookie we do not 
> increase the lifetime of an object like with references but this has the
> cost of a layer of indirection.

and thanks for clarification here.



Re: rt_ifp and pf(4)

2015-11-21 Thread Martin Pieuchot
On 20/11/15(Fri) 18:05, Alexandr Nedvedicky wrote:
> Hello,
> 
> I have just nit comments, feel free to ignore them.
> 
> 1) would it be possible to use closing #endif guards as follows:
>   #endif  /* NCARP */

Done.

> 2) another nit here:
> > @@ -5607,6 +5616,8 @@ pf_route(struct mbuf **m, struct pf_rule
> >  done:
> > if (r->rt != PF_DUPTO)
> > *m = NULL;
> > +   if (!r->rt)
> > +   if_put(ifp);
> > rtfree(rt);
> > return;
> >  
> 
> I would probably use test as follows:
>   if (rt != NULL)
>   if_put(ifp);
> 
> it's detail, given at some point in future we will probably have to use
> if_put()/if_get() for ifp's bound to kif's (right?).

Well not necessarily.  kif have the same lifetime as an ifp and are easy
to garbage collect so there's no need for the moment to use index for
them.  Indexes are useful when two objects having a different lifetime
need to be linked at some point.  By using indexes/id/cookie we do not 
increase the lifetime of an object like with references but this has the
cost of a layer of indirection.



Re: rt_ifp and pf(4)

2015-11-20 Thread Alexandr Nedvedicky
Hello,

I have just nit comments, feel free to ignore them.

1) would it be possible to use closing #endif guards as follows:
#endif  /* NCARP */

2) another nit here:
> @@ -5607,6 +5616,8 @@ pf_route(struct mbuf **m, struct pf_rule
>  done:
>   if (r->rt != PF_DUPTO)
>   *m = NULL;
> + if (!r->rt)
> + if_put(ifp);
>   rtfree(rt);
>   return;
>  

I would probably use test as follows:
if (rt != NULL)
if_put(ifp);

it's detail, given at some point in future we will probably have to use
if_put()/if_get() for ifp's bound to kif's (right?).  My point here is we call
if_get() after we successfully obtain rt.

Apart those two everything is OK, since those two are nits, it's up to you if
you go for my suggestions.

regards
sasha
On Thu, Nov 19, 2015 at 12:07:38PM +0100, Martin Pieuchot wrote:
> Stop using rt_ifp.  While here put some NCARP... ok?
> 
> Index: net/pf.c
> ===
> RCS file: /cvs/src/sys/net/pf.c,v
> retrieving revision 1.950
> diff -u -p -r1.950 pf.c
> --- net/pf.c  12 Nov 2015 10:07:14 -  1.950
> +++ net/pf.c  19 Nov 2015 11:05:37 -
> @@ -36,6 +36,7 @@
>   */
>  
>  #include "bpfilter.h"
> +#include "carp.h"
>  #include "pflog.h"
>  #include "pfsync.h"
>  #include "pflow.h"
> @@ -2595,9 +2596,11 @@ pf_match_rcvif(struct mbuf *m, struct pf
>   if (ifp == NULL)
>   return (0);
>  
> +#if NCARP > 0
>   if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
>   kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
>   else
> +#endif
>   kif = (struct pfi_kif *)ifp->if_pf_kif;
>  
>   if_put(ifp);
> @@ -5347,7 +5350,6 @@ pf_routable(struct pf_addr *addr, sa_fam
>   struct sockaddr_in6 *dst6;
>  #endif   /* INET6 */
>   struct rtentry  *rt, *rt0 = NULL;
> - struct ifnet*ifp;
>  
>   check_mpath = 0;
>   memset(, 0, sizeof(ss));
> @@ -5397,13 +5399,20 @@ pf_routable(struct pf_addr *addr, sa_fam
>   ret = 0;
>   rt = rt0;
>   do {
> - if (rt->rt_ifp->if_type == IFT_CARP)
> - ifp = rt->rt_ifp->if_carpdev;
> - else
> - ifp = rt->rt_ifp;
> -
> - if (kif->pfik_ifp == ifp)
> + if (rt->rt_ifidx == kif->pfik_ifp->if_index) {
>   ret = 1;
> +#if NCARP > 0
> + } else {
> + struct ifnet*ifp;
> +
> + ifp = if_get(rt->rt_ifidx);
> + if (ifp != NULL && ifp->if_type == IFT_CARP &&
> + ifp->if_carpdev == kif->pfik_ifp)
> + ret = 1;
> + if_put(ifp);
> +#endif
> + }
> +
>  #ifndef SMALL_KERNEL
>   rt = rtable_mpath_next(rt);
>  #else
> @@ -5512,7 +5521,7 @@ pf_route(struct mbuf **m, struct pf_rule
>   goto bad;
>   }
>  
> - ifp = rt->rt_ifp;
> + ifp = if_get(rt->rt_ifidx);
>  
>   if (rt->rt_flags & RTF_GATEWAY)
>   dst = satosin(rt->rt_gateway);
> @@ -5607,6 +5616,8 @@ pf_route(struct mbuf **m, struct pf_rule
>  done:
>   if (r->rt != PF_DUPTO)
>   *m = NULL;
> + if (!r->rt)
> + if_put(ifp);
>   rtfree(rt);
>   return;
>  
> @@ -6312,9 +6323,11 @@ pf_test(sa_family_t af, int fwdir, struc
>   if (!pf_status.running)
>   return (PF_PASS);
>  
> +#if NCARP > 0
>   if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
>   kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
>   else
> +#endif
>   kif = (struct pfi_kif *)ifp->if_pf_kif;
>  
>   if (kif == NULL) {
> 



rt_ifp and pf(4)

2015-11-19 Thread Martin Pieuchot
Stop using rt_ifp.  While here put some NCARP... ok?

Index: net/pf.c
===
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.950
diff -u -p -r1.950 pf.c
--- net/pf.c12 Nov 2015 10:07:14 -  1.950
+++ net/pf.c19 Nov 2015 11:05:37 -
@@ -36,6 +36,7 @@
  */
 
 #include "bpfilter.h"
+#include "carp.h"
 #include "pflog.h"
 #include "pfsync.h"
 #include "pflow.h"
@@ -2595,9 +2596,11 @@ pf_match_rcvif(struct mbuf *m, struct pf
if (ifp == NULL)
return (0);
 
+#if NCARP > 0
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
else
+#endif
kif = (struct pfi_kif *)ifp->if_pf_kif;
 
if_put(ifp);
@@ -5347,7 +5350,6 @@ pf_routable(struct pf_addr *addr, sa_fam
struct sockaddr_in6 *dst6;
 #endif /* INET6 */
struct rtentry  *rt, *rt0 = NULL;
-   struct ifnet*ifp;
 
check_mpath = 0;
memset(, 0, sizeof(ss));
@@ -5397,13 +5399,20 @@ pf_routable(struct pf_addr *addr, sa_fam
ret = 0;
rt = rt0;
do {
-   if (rt->rt_ifp->if_type == IFT_CARP)
-   ifp = rt->rt_ifp->if_carpdev;
-   else
-   ifp = rt->rt_ifp;
-
-   if (kif->pfik_ifp == ifp)
+   if (rt->rt_ifidx == kif->pfik_ifp->if_index) {
ret = 1;
+#if NCARP > 0
+   } else {
+   struct ifnet*ifp;
+
+   ifp = if_get(rt->rt_ifidx);
+   if (ifp != NULL && ifp->if_type == IFT_CARP &&
+   ifp->if_carpdev == kif->pfik_ifp)
+   ret = 1;
+   if_put(ifp);
+#endif
+   }
+
 #ifndef SMALL_KERNEL
rt = rtable_mpath_next(rt);
 #else
@@ -5512,7 +5521,7 @@ pf_route(struct mbuf **m, struct pf_rule
goto bad;
}
 
-   ifp = rt->rt_ifp;
+   ifp = if_get(rt->rt_ifidx);
 
if (rt->rt_flags & RTF_GATEWAY)
dst = satosin(rt->rt_gateway);
@@ -5607,6 +5616,8 @@ pf_route(struct mbuf **m, struct pf_rule
 done:
if (r->rt != PF_DUPTO)
*m = NULL;
+   if (!r->rt)
+   if_put(ifp);
rtfree(rt);
return;
 
@@ -6312,9 +6323,11 @@ pf_test(sa_family_t af, int fwdir, struc
if (!pf_status.running)
return (PF_PASS);
 
+#if NCARP > 0
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
else
+#endif
kif = (struct pfi_kif *)ifp->if_pf_kif;
 
if (kif == NULL) {