Subject: Re: [RESEND 3/5] [NET]: Protocol Independant Policy Routing Rules Framework

From: Ville Nuorvala <[email-masked]>
Date: Mon, 31 Jul 2006 17:46:14 +0300

Thomas Graf wrote:

Hi Thomas,

> Derived from net/ipv6/fib_rules.c

do you mean net/ipv4/fib_rules.c or net/ipv6/fib6_rules.c? :-)

A couple of comments below.

> Signed-off-by: Thomas Graf <[email-masked]>
> 
> Index: net-2.6.git/include/linux/fib_rules.h
> ===================================================================
> --- /dev/null
> +++ net-2.6.git/include/linux/fib_rules.h
> @@ -0,0 +1,60 @@
> +#ifndef __LINUX_FIB_RULES_H
> +#define __LINUX_FIB_RULES_H
> +
> +#include <linux/types.h>
> +#include <linux/rtnetlink.h>
> +
> +/* rule is permanent, and cannot be deleted */
> +#define FIB_RULE_PERMANENT	1
> +
> +struct fib_rule_hdr
> +{
> +	__u8		family;
> +	__u8		dst_len;
> +	__u8		src_len;
> +	__u8		tos;
> +
> +	__u8		table;
> +	__u8		res1;	/* reserved */
> +	__u8		res2;	/* reserved */
> +	__u8		action;
> +
> +	__u32		flags;
> +};

I'm wondering if this is guaranteed to be equvalent to struct rtmsg?

struct rtmsg
{
	unsigned char		rtm_family;
	unsigned char		rtm_dst_len;
	unsigned char		rtm_src_len;
	unsigned char		rtm_tos;

	unsigned char		rtm_table;	/* Routing table id */
	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
	unsigned char		rtm_scope;	/* See below */	
	unsigned char		rtm_type;	/* See below	*/

	unsigned		rtm_flags;
};

Won't we otherwise be breaking the existing userland interface?

> +enum
> +{
> +	FRA_UNSPEC,
> +	FRA_DST,	/* destination address */
> +	FRA_SRC,	/* source address */
> +	FRA_IFNAME,	/* interface name */
> +	FRA_UNUSED1,
> +	FRA_UNUSED2,
> +	FRA_PRIORITY,	/* priority/preference */
> +	FRA_UNUSED3,
> +	FRA_UNUSED4,
> +	FRA_UNUSED5,
> +	FRA_FWMARK,	/* netfilter mark (IPv4) */
> +	FRA_FLOW,	/* flow/class id */
> +	__FRA_MAX
> +};
> +
> +#define FRA_MAX (__FRA_MAX - 1)
> +
> +enum
> +{
> +	FR_ACT_UNSPEC,
> +	FR_ACT_TO_TBL,		/* Pass to fixed table */
> +	FR_ACT_RES1,
> +	FR_ACT_RES2,
> +	FR_ACT_RES3,
> +	FR_ACT_RES4,
> +	FR_ACT_BLACKHOLE,	/* Drop without notification */
> +	FR_ACT_UNREACHABLE,	/* Drop with ENETUNREACH */
> +	FR_ACT_PROHIBIT,	/* Drop with EACCES */
> +	__FR_ACT_MAX,
> +};
> +
> +#define FR_ACT_MAX (__FR_ACT_MAX - 1)
> +
> +#endif

Shouldn't all these (struct fib_rule_hdr included) actually be defined
in include/linux/rtnetlink.h?

Otherwise, looks good.

Regards,
Ville