lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 11 Feb 2019 10:38:00 +0100 From: Nicolas Dichtel <nicolas.dichtel@...nd.com> To: Callum Sinclair <callum.sinclair@...iedtelesis.co.nz>, davem@...emloft.net, kuznet@....inr.ac.ru, yoshfuji@...ux-ipv6.org, nikolay@...ulusnetworks.com, netdev@...r.kernel.org, linux-kernel@...r.kernel.org Subject: Re: [PATCH net-next v3] ipmr: ip6mr: Create new sockopt to clear mfc cache or vifs Le 11/02/2019 à 04:54, Callum Sinclair a écrit : > v1 -> v2: > Implemented additional flags for static entries > v2 -> v3: > Cleaned up flag logic so any combination of routes can be cleared. > Fixed style errors > Fixed incorrect flag values nit: those lines are usually put after the '---', thus they don't appear in the final commit log (they are useful for reviewers only). > > Currently the only way to clear the forwarding cache was to delete the > entries one by one using the MRT_DEL_MFC socket option or to destroy and > recreate the socket. > > Create a new socket option which with the use of optional flags can > clear any combination of multicast entries (static or not static) and > multicast vifs (static or not static). > > Calling the new socket option MRT_FLUSH with the flags MRT_FLUSH_MFC and > MRT_FLUSH_VIFS will clear all entries and vifs on the socket except for > static entries. > > Signed-off-by: Callum Sinclair <callum.sinclair@...iedtelesis.co.nz> > --- ie, here > include/uapi/linux/mroute.h | 9 ++++- > include/uapi/linux/mroute6.h | 9 ++++- > net/ipv4/ipmr.c | 73 ++++++++++++++++++++------------- > net/ipv6/ip6mr.c | 78 +++++++++++++++++++++++------------- > 4 files changed, 112 insertions(+), 57 deletions(-) > > diff --git a/include/uapi/linux/mroute.h b/include/uapi/linux/mroute.h > index 5d37a9ccce63..11c8c1fc1124 100644 > --- a/include/uapi/linux/mroute.h > +++ b/include/uapi/linux/mroute.h > @@ -28,12 +28,19 @@ > #define MRT_TABLE (MRT_BASE+9) /* Specify mroute table ID */ > #define MRT_ADD_MFC_PROXY (MRT_BASE+10) /* Add a (*,*|G) mfc entry */ > #define MRT_DEL_MFC_PROXY (MRT_BASE+11) /* Del a (*,*|G) mfc entry */ > -#define MRT_MAX (MRT_BASE+11) > +#define MRT_FLUSH (MRT_BASE+12) /* Flush all mfc entries and/or vifs */ > +#define MRT_MAX (MRT_BASE+12) > > #define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ > #define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) > #define SIOCGETRPF (SIOCPROTOPRIVATE+2) > > +/* MRT_FLUSH optional flags */ > +#define MRT_FLUSH_MFC 1 /* Flush multicast entries */ > +#define MRT_FLUSH_MFC_STATIC 2 /* Flush static multicast entries */ > +#define MRT_FLUSH_VIFS 4 /* Flush multicast vifs */ > +#define MRT_FLUSH_VIFS_STATIC 8 /* Flush static multicast vifs */ > + > #define MAXVIFS 32 > typedef unsigned long vifbitmap_t; /* User mode code depends on this lot */ > typedef unsigned short vifi_t; > diff --git a/include/uapi/linux/mroute6.h b/include/uapi/linux/mroute6.h > index 9999cc006390..ac84ef11b29c 100644 > --- a/include/uapi/linux/mroute6.h > +++ b/include/uapi/linux/mroute6.h > @@ -31,12 +31,19 @@ > #define MRT6_TABLE (MRT6_BASE+9) /* Specify mroute table ID */ > #define MRT6_ADD_MFC_PROXY (MRT6_BASE+10) /* Add a (*,*|G) mfc entry */ > #define MRT6_DEL_MFC_PROXY (MRT6_BASE+11) /* Del a (*,*|G) mfc entry */ > -#define MRT6_MAX (MRT6_BASE+11) > +#define MRT6_FLUSH (MRT6_BASE+12) /* Flush all mfc entries and/or vifs */ > +#define MRT6_MAX (MRT6_BASE+12) > > #define SIOCGETMIFCNT_IN6 SIOCPROTOPRIVATE /* IP protocol privates */ > #define SIOCGETSGCNT_IN6 (SIOCPROTOPRIVATE+1) > #define SIOCGETRPF (SIOCPROTOPRIVATE+2) > > +/* MRT6_FLUSH optional flags */ > +#define MRT6_FLUSH_MFC 1 /* Flush multicast entries */ > +#define MRT6_FLUSH_MFC_STATIC 2 /* Flush static multicast entries */ > +#define MRT6_FLUSH_VIFS 4 /* Flushing multicast vifs */ > +#define MRT6_FLUSH_VIFS_STATIC 8 /* Flush static multicast vifs */ > + > #define MAXMIFS 32 > typedef unsigned long mifbitmap_t; /* User mode code depends on this lot */ > typedef unsigned short mifi_t; > diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c > index e536970557dd..2c95ef8cf224 100644 > --- a/net/ipv4/ipmr.c > +++ b/net/ipv4/ipmr.c > @@ -110,7 +110,7 @@ static int ipmr_cache_report(struct mr_table *mrt, > static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc, > int cmd); > static void igmpmsg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt); > -static void mroute_clean_tables(struct mr_table *mrt, bool all); > +static void mroute_clean_tables(struct mr_table *mrt, int flags); > static void ipmr_expire_process(struct timer_list *t); > > #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES > @@ -415,7 +415,8 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) > static void ipmr_free_table(struct mr_table *mrt) > { > del_timer_sync(&mrt->ipmr_expire_timer); > - mroute_clean_tables(mrt, true); > + mroute_clean_tables(mrt, MRT_FLUSH_VIFS | MRT_FLUSH_VIFS_STATIC | > + MRT_FLUSH_MFC | MRT_FLUSH_MFC_STATIC); nit: MRT_FLUSH_MFC must be aligned with 'mrt' > rhltable_destroy(&mrt->mfc_hash); > kfree(mrt); > } > @@ -1296,7 +1297,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt, > } > > /* Close the multicast socket, and clear the vif tables etc */ > -static void mroute_clean_tables(struct mr_table *mrt, bool all) > +static void mroute_clean_tables(struct mr_table *mrt, int flags) > { > struct net *net = read_pnet(&mrt->net); > struct mr_mfc *c, *tmp; > @@ -1305,35 +1306,42 @@ static void mroute_clean_tables(struct mr_table *mrt, bool all) > int i; > > /* Shut down all active vif entries */ > - for (i = 0; i < mrt->maxvif; i++) { > - if (!all && (mrt->vif_table[i].flags & VIFF_STATIC)) > - continue; > - vif_delete(mrt, i, 0, &list); > + if (flags & (MRT_FLUSH_VIFS | MRT_FLUSH_VIFS_STATIC)) { > + for (i = 0; i < mrt->maxvif; i++) { > + if (((mrt->vif_table[i].flags & VIFF_STATIC) && > + !(flags & MRT_FLUSH_VIFS_STATIC)) || > + (!(mrt->vif_table[i].flags & VIFF_STATIC) && !(flags & MRT_FLUSH))) s/MRT_FLUSH/MRT_FLUSH_VIFS Regards, Nicolas
Powered by blists - more mailing lists