SOURCES (LINUX_2_6): linux-net-2.6.19.patch (NEW) - updated netfil...

cieciwa cieciwa at pld-linux.org
Fri Sep 22 11:32:18 CEST 2006


Author: cieciwa                      Date: Fri Sep 22 09:32:18 2006 GMT
Module: SOURCES                       Tag: LINUX_2_6
---- Log message:
- updated netfilter modules.

---- Files affected:
SOURCES:
   linux-net-2.6.19.patch (NONE -> 1.1.2.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/linux-net-2.6.19.patch
diff -u /dev/null SOURCES/linux-net-2.6.19.patch:1.1.2.1
--- /dev/null	Fri Sep 22 11:32:18 2006
+++ SOURCES/linux-net-2.6.19.patch	Fri Sep 22 11:32:12 2006
@@ -0,0 +1,42139 @@
+diff -Nur linux-2.6.18-rc5/net/Kconfig linux-2.6.19/net/Kconfig
+--- linux-2.6.18-rc5/net/Kconfig	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/Kconfig	2006-09-22 10:04:58.000000000 +0200
+@@ -249,6 +249,11 @@
+ config WIRELESS_EXT
+ 	bool
+ 
++source "net/netlabel/Kconfig"
++
++config FIB_RULES
++	bool
++
+ endif   # if NET
+ endmenu # Networking
+ 
+diff -Nur linux-2.6.18-rc5/net/Makefile linux-2.6.19/net/Makefile
+--- linux-2.6.18-rc5/net/Makefile	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/Makefile	2006-09-22 10:04:58.000000000 +0200
+@@ -46,6 +46,7 @@
+ obj-$(CONFIG_IP_SCTP)		+= sctp/
+ obj-$(CONFIG_IEEE80211)		+= ieee80211/
+ obj-$(CONFIG_TIPC)		+= tipc/
++obj-$(CONFIG_NETLABEL)		+= netlabel/
+ 
+ ifeq ($(CONFIG_NET),y)
+ obj-$(CONFIG_SYSCTL)		+= sysctl_net.o
+diff -Nur linux-2.6.18-rc5/net/atm/atm_sysfs.c linux-2.6.19/net/atm/atm_sysfs.c
+--- linux-2.6.18-rc5/net/atm/atm_sysfs.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/atm/atm_sysfs.c	2006-09-22 10:04:58.000000000 +0200
+@@ -1,6 +1,5 @@
+ /* ATM driver model support. */
+ 
+-#include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/kobject.h>
+diff -Nur linux-2.6.18-rc5/net/atm/mpc.c linux-2.6.19/net/atm/mpc.c
+--- linux-2.6.18-rc5/net/atm/mpc.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/atm/mpc.c	2006-09-22 10:04:58.000000000 +0200
+@@ -98,11 +98,6 @@
+ 	0
+ };
+ 
+-#ifdef CONFIG_PROC_FS
+-extern int mpc_proc_init(void);
+-extern void mpc_proc_clean(void);
+-#endif
+-
+ struct mpoa_client *mpcs = NULL; /* FIXME */
+ static struct atm_mpoa_qos *qos_head = NULL;
+ static DEFINE_TIMER(mpc_timer, NULL, 0, 0);
+diff -Nur linux-2.6.18-rc5/net/atm/mpc.h linux-2.6.19/net/atm/mpc.h
+--- linux-2.6.18-rc5/net/atm/mpc.h	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/atm/mpc.h	2006-09-22 10:04:58.000000000 +0200
+@@ -50,4 +50,7 @@
+ struct seq_file;
+ void atm_mpoa_disp_qos(struct seq_file *m);
+ 
++int mpc_proc_init(void);
++void mpc_proc_clean(void);
++
+ #endif /* _MPC_H_ */
+diff -Nur linux-2.6.18-rc5/net/bridge/br_forward.c linux-2.6.19/net/bridge/br_forward.c
+--- linux-2.6.18-rc5/net/bridge/br_forward.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/bridge/br_forward.c	2006-09-22 10:04:58.000000000 +0200
+@@ -38,13 +38,10 @@
+ 	if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb))
+ 		kfree_skb(skb);
+ 	else {
+-#ifdef CONFIG_BRIDGE_NETFILTER
+ 		/* ip_refrag calls ip_fragment, doesn't copy the MAC header. */
+ 		if (nf_bridge_maybe_copy_header(skb))
+ 			kfree_skb(skb);
+-		else
+-#endif
+-		{
++		else {
+ 			skb_push(skb, ETH_HLEN);
+ 
+ 			dev_queue_xmit(skb);
+diff -Nur linux-2.6.18-rc5/net/bridge/br_netfilter.c linux-2.6.19/net/bridge/br_netfilter.c
+--- linux-2.6.18-rc5/net/bridge/br_netfilter.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/bridge/br_netfilter.c	2006-09-22 10:04:58.000000000 +0200
+@@ -53,10 +53,10 @@
+ 
+ #ifdef CONFIG_SYSCTL
+ static struct ctl_table_header *brnf_sysctl_header;
+-static int brnf_call_iptables = 1;
+-static int brnf_call_ip6tables = 1;
+-static int brnf_call_arptables = 1;
+-static int brnf_filter_vlan_tagged = 1;
++static int brnf_call_iptables __read_mostly = 1;
++static int brnf_call_ip6tables __read_mostly = 1;
++static int brnf_call_arptables __read_mostly = 1;
++static int brnf_filter_vlan_tagged __read_mostly = 1;
+ #else
+ #define brnf_filter_vlan_tagged 1
+ #endif
+@@ -127,14 +127,37 @@
+ 
+ static inline void nf_bridge_save_header(struct sk_buff *skb)
+ {
+-        int header_size = 16;
++        int header_size = ETH_HLEN;
+ 
+ 	if (skb->protocol == htons(ETH_P_8021Q))
+-		header_size = 18;
++		header_size += VLAN_HLEN;
+ 
+ 	memcpy(skb->nf_bridge->data, skb->data - header_size, header_size);
+ }
+ 
++/*
++ * When forwarding bridge frames, we save a copy of the original
++ * header before processing.
++ */
++int nf_bridge_copy_header(struct sk_buff *skb)
++{
++	int err;
++        int header_size = ETH_HLEN;
++
++	if (skb->protocol == htons(ETH_P_8021Q))
++		header_size += VLAN_HLEN;
++
++	err = skb_cow(skb, header_size);
++	if (err)
++		return err;
++
++	memcpy(skb->data - header_size, skb->nf_bridge->data, header_size);
++
++	if (skb->protocol == htons(ETH_P_8021Q))
++		__skb_push(skb, VLAN_HLEN);
++	return 0;
++}
++
+ /* PF_BRIDGE/PRE_ROUTING *********************************************/
+ /* Undo the changes made for ip6tables PREROUTING and continue the
+  * bridge PRE_ROUTING hook. */
+@@ -695,16 +718,6 @@
+ 	else
+ 		pf = PF_INET6;
+ 
+-#ifdef CONFIG_NETFILTER_DEBUG
+-	/* Sometimes we get packets with NULL ->dst here (for example,
+-	 * running a dhcp client daemon triggers this). This should now
+-	 * be fixed, but let's keep the check around. */
+-	if (skb->dst == NULL) {
+-		printk(KERN_CRIT "br_netfilter: skb->dst == NULL.");
+-		return NF_ACCEPT;
+-	}
+-#endif
+-
+ 	nf_bridge = skb->nf_bridge;
+ 	nf_bridge->physoutdev = skb->dev;
+ 	realindev = nf_bridge->physindev;
+@@ -786,7 +799,7 @@
+ 	 * keep the check just to be sure... */
+ 	if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) {
+ 		printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: "
+-		       "bad mac.raw pointer.");
++		       "bad mac.raw pointer.\n");
+ 		goto print_error;
+ 	}
+ #endif
+@@ -804,7 +817,7 @@
+ 
+ #ifdef CONFIG_NETFILTER_DEBUG
+ 	if (skb->dst == NULL) {
+-		printk(KERN_CRIT "br_netfilter: skb->dst == NULL.");
++		printk(KERN_INFO "br_netfilter post_routing: skb->dst == NULL\n");
+ 		goto print_error;
+ 	}
+ #endif
+@@ -841,6 +854,7 @@
+ 	}
+ 	printk(" head:%p, raw:%p, data:%p\n", skb->head, skb->mac.raw,
+ 	       skb->data);
++	dump_stack();
+ 	return NF_ACCEPT;
+ #endif
+ }
+diff -Nur linux-2.6.18-rc5/net/bridge/br_netlink.c linux-2.6.19/net/bridge/br_netlink.c
+--- linux-2.6.18-rc5/net/bridge/br_netlink.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/bridge/br_netlink.c	2006-09-22 10:04:58.000000000 +0200
+@@ -12,6 +12,7 @@
+ 
+ #include <linux/kernel.h>
+ #include <linux/rtnetlink.h>
++#include <net/netlink.h>
+ #include "br_private.h"
+ 
+ /*
+@@ -76,26 +77,24 @@
+ void br_ifinfo_notify(int event, struct net_bridge_port *port)
+ {
+ 	struct sk_buff *skb;
+-	int err = -ENOMEM;
++	int payload = sizeof(struct ifinfomsg) + 128;
++	int err = -ENOBUFS;
+ 
+ 	pr_debug("bridge notify event=%d\n", event);
+-	skb = alloc_skb(NLMSG_SPACE(sizeof(struct ifinfomsg) + 128),
+-			GFP_ATOMIC);
+-	if (!skb)
+-		goto err_out;
++	skb = nlmsg_new(nlmsg_total_size(payload), GFP_ATOMIC);
++	if (skb == NULL)
++		goto errout;
++
++	err = br_fill_ifinfo(skb, port, 0, 0, event, 0);
++	if (err < 0) {
++		kfree_skb(skb);
++		goto errout;
++	}
+ 
+-	err = br_fill_ifinfo(skb, port, current->pid, 0, event, 0);
++	err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
++errout:
+ 	if (err < 0)
+-		goto err_kfree;
+-
+-	NETLINK_CB(skb).dst_group = RTNLGRP_LINK;
+-	netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC);
+-	return;
+-
+-err_kfree:
+-	kfree_skb(skb);
+-err_out:
+-	netlink_set_err(rtnl, 0, RTNLGRP_LINK, err);
++		rtnl_set_sk_err(RTNLGRP_LINK, err);
+ }
+ 
+ /*
+diff -Nur linux-2.6.18-rc5/net/bridge/netfilter/ebtables.c linux-2.6.19/net/bridge/netfilter/ebtables.c
+--- linux-2.6.18-rc5/net/bridge/netfilter/ebtables.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/bridge/netfilter/ebtables.c	2006-09-22 10:04:58.000000000 +0200
+@@ -37,30 +37,9 @@
+ #include <linux/netfilter_ipv4/listhelp.h>
+ #include <linux/mutex.h>
+ 
+-#if 0
+-/* use this for remote debugging
+- * Copyright (C) 1998 by Ori Pomerantz
+- * Print the string to the appropriate tty, the one
+- * the current task uses
+- */
+-static void print_string(char *str)
+-{
+-	struct tty_struct *my_tty;
+-
+-	/* The tty for the current task */
+-	my_tty = current->signal->tty;
+-	if (my_tty != NULL) {
+-		my_tty->driver->write(my_tty, 0, str, strlen(str));
+-		my_tty->driver->write(my_tty, 0, "\015\012", 2);
+-	}
+-}
+-
+-#define BUGPRINT(args) print_string(args);
+-#else
+ #define BUGPRINT(format, args...) printk("kernel msg: ebtables bug: please "\
+                                          "report to author: "format, ## args)
+ /* #define BUGPRINT(format, args...) */
+-#endif
+ #define MEMPRINT(format, args...) printk("kernel msg: ebtables "\
+                                          ": out of memory: "format, ## args)
+ /* #define MEMPRINT(format, args...) */
+diff -Nur linux-2.6.18-rc5/net/core/Makefile linux-2.6.19/net/core/Makefile
+--- linux-2.6.18-rc5/net/core/Makefile	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/core/Makefile	2006-09-22 10:04:58.000000000 +0200
+@@ -17,3 +17,4 @@
+ obj-$(CONFIG_WIRELESS_EXT) += wireless.o
+ obj-$(CONFIG_NETPOLL) += netpoll.o
+ obj-$(CONFIG_NET_DMA) += user_dma.o
++obj-$(CONFIG_FIB_RULES) += fib_rules.o
+diff -Nur linux-2.6.18-rc5/net/core/datagram.c linux-2.6.19/net/core/datagram.c
+--- linux-2.6.18-rc5/net/core/datagram.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/core/datagram.c	2006-09-22 10:04:58.000000000 +0200
+@@ -417,7 +417,7 @@
+ 
+ 	sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
+ 	if (likely(!sum)) {
+-		if (unlikely(skb->ip_summed == CHECKSUM_HW))
++		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
+ 			netdev_rx_csum_fault(skb->dev);
+ 		skb->ip_summed = CHECKSUM_UNNECESSARY;
+ 	}
+@@ -462,7 +462,7 @@
+ 			goto fault;
+ 		if ((unsigned short)csum_fold(csum))
+ 			goto csum_error;
+-		if (unlikely(skb->ip_summed == CHECKSUM_HW))
++		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
+ 			netdev_rx_csum_fault(skb->dev);
+ 		iov->iov_len -= chunk;
+ 		iov->iov_base += chunk;
+diff -Nur linux-2.6.18-rc5/net/core/dev.c linux-2.6.19/net/core/dev.c
+--- linux-2.6.18-rc5/net/core/dev.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/core/dev.c	2006-09-22 10:04:58.000000000 +0200
+@@ -640,6 +640,8 @@
+ {
+ 	if (*name == '\0')
+ 		return 0;
++	if (strlen(name) >= IFNAMSIZ)
++		return 0;
+ 	if (!strcmp(name, ".") || !strcmp(name, ".."))
+ 		return 0;
+ 
+@@ -1166,12 +1168,12 @@
+  * Invalidate hardware checksum when packet is to be mangled, and
+  * complete checksum manually on outgoing path.
+  */
+-int skb_checksum_help(struct sk_buff *skb, int inward)
++int skb_checksum_help(struct sk_buff *skb)
+ {
+ 	unsigned int csum;
+ 	int ret = 0, offset = skb->h.raw - skb->data;
+ 
+-	if (inward)
++	if (skb->ip_summed == CHECKSUM_COMPLETE)
+ 		goto out_set_summed;
+ 
+ 	if (unlikely(skb_shinfo(skb)->gso_size)) {
+@@ -1223,7 +1225,7 @@
+ 	skb->mac_len = skb->nh.raw - skb->data;
+ 	__skb_pull(skb, skb->mac_len);
+ 
+-	if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
++	if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
+ 		if (skb_header_cloned(skb) &&
+ 		    (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
+ 			return ERR_PTR(err);
+@@ -1232,7 +1234,7 @@
+ 	rcu_read_lock();
+ 	list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
+ 		if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
+-			if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
++			if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
+ 				err = ptype->gso_send_check(skb);
+ 				segs = ERR_PTR(err);
+ 				if (err || skb_gso_ok(skb, features))
+@@ -1444,11 +1446,11 @@
+ 	/* If packet is not checksummed and device does not support
+ 	 * checksumming for this protocol, complete checksumming here.
+ 	 */
+-	if (skb->ip_summed == CHECKSUM_HW &&
++	if (skb->ip_summed == CHECKSUM_PARTIAL &&
+ 	    (!(dev->features & NETIF_F_GEN_CSUM) &&
+ 	     (!(dev->features & NETIF_F_IP_CSUM) ||
+ 	      skb->protocol != htons(ETH_P_IP))))
+-	      	if (skb_checksum_help(skb, 0))
++	      	if (skb_checksum_help(skb))
+ 	      		goto out_kfree_skb;
+ 
+ gso:
+@@ -3191,13 +3193,15 @@
+ 	struct net_device *dev;
+ 	int alloc_size;
+ 
++	BUG_ON(strlen(name) >= sizeof(dev->name));
++
+ 	/* ensure 32-byte alignment of both the device and private area */
+ 	alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
+ 	alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
+ 
+ 	p = kzalloc(alloc_size, GFP_KERNEL);
+ 	if (!p) {
+-		printk(KERN_ERR "alloc_dev: Unable to allocate device.\n");
++		printk(KERN_ERR "alloc_netdev: Unable to allocate device.\n");
+ 		return NULL;
+ 	}
+ 
+diff -Nur linux-2.6.18-rc5/net/core/dev_mcast.c linux-2.6.19/net/core/dev_mcast.c
+--- linux-2.6.18-rc5/net/core/dev_mcast.c	2006-08-28 05:41:48.000000000 +0200
++++ linux-2.6.19/net/core/dev_mcast.c	2006-09-22 10:04:58.000000000 +0200
+@@ -21,8 +21,7 @@
+  *	2 of the License, or (at your option) any later version.
+  */
+ 
+-#include <linux/config.h> 
+-#include <linux/module.h> 
++#include <linux/module.h>
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+ #include <linux/bitops.h>
+diff -Nur linux-2.6.18-rc5/net/core/fib_rules.c linux-2.6.19/net/core/fib_rules.c
+--- linux-2.6.18-rc5/net/core/fib_rules.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.19/net/core/fib_rules.c	2006-09-22 10:04:58.000000000 +0200
+@@ -0,0 +1,421 @@
++/*
++ * net/core/fib_rules.c		Generic Routing Rules
++ *
++ *	This program is free software; you can redistribute it and/or
++ *	modify it under the terms of the GNU General Public License as
++ *	published by the Free Software Foundation, version 2.
++ *
++ * Authors:	Thomas Graf <tgraf at suug.ch>
++ */
++
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/list.h>
++#include <net/fib_rules.h>
++
++static LIST_HEAD(rules_ops);
++static DEFINE_SPINLOCK(rules_mod_lock);
++
++static void notify_rule_change(int event, struct fib_rule *rule,
++			       struct fib_rules_ops *ops, struct nlmsghdr *nlh,
++			       u32 pid);
++
++static struct fib_rules_ops *lookup_rules_ops(int family)
++{
++	struct fib_rules_ops *ops;
++
++	rcu_read_lock();
++	list_for_each_entry_rcu(ops, &rules_ops, list) {
++		if (ops->family == family) {
++			if (!try_module_get(ops->owner))
++				ops = NULL;
++			rcu_read_unlock();
++			return ops;
++		}
++	}
++	rcu_read_unlock();
++
++	return NULL;
++}
++
++static void rules_ops_put(struct fib_rules_ops *ops)
++{
++	if (ops)
++		module_put(ops->owner);
++}
++
++int fib_rules_register(struct fib_rules_ops *ops)
++{
++	int err = -EEXIST;
++	struct fib_rules_ops *o;
++
++	if (ops->rule_size < sizeof(struct fib_rule))
++		return -EINVAL;
++
++	if (ops->match == NULL || ops->configure == NULL ||
++	    ops->compare == NULL || ops->fill == NULL ||
++	    ops->action == NULL)
++		return -EINVAL;
++
++	spin_lock(&rules_mod_lock);
++	list_for_each_entry(o, &rules_ops, list)
++		if (ops->family == o->family)
++			goto errout;
++
++	list_add_tail_rcu(&ops->list, &rules_ops);
++	err = 0;
++errout:
++	spin_unlock(&rules_mod_lock);
++
++	return err;
++}
++
++EXPORT_SYMBOL_GPL(fib_rules_register);
++
++static void cleanup_ops(struct fib_rules_ops *ops)
++{
++	struct fib_rule *rule, *tmp;
++
++	list_for_each_entry_safe(rule, tmp, ops->rules_list, list) {
++		list_del_rcu(&rule->list);
++		fib_rule_put(rule);
++	}
++}
++
++int fib_rules_unregister(struct fib_rules_ops *ops)
++{
++	int err = 0;
++	struct fib_rules_ops *o;
++
++	spin_lock(&rules_mod_lock);
++	list_for_each_entry(o, &rules_ops, list) {
++		if (o == ops) {
++			list_del_rcu(&o->list);
++			cleanup_ops(ops);
++			goto out;
++		}
++	}
++
++	err = -ENOENT;
++out:
++	spin_unlock(&rules_mod_lock);
++
++	synchronize_rcu();
++
++	return err;
++}
++
++EXPORT_SYMBOL_GPL(fib_rules_unregister);
++
++int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl,
++		     int flags, struct fib_lookup_arg *arg)
++{
++	struct fib_rule *rule;
++	int err;
++
++	rcu_read_lock();
++
++	list_for_each_entry_rcu(rule, ops->rules_list, list) {
++		if (rule->ifindex && (rule->ifindex != fl->iif))
++			continue;
++
++		if (!ops->match(rule, fl, flags))
++			continue;
++
++		err = ops->action(rule, fl, flags, arg);
++		if (err != -EAGAIN) {
++			fib_rule_get(rule);
++			arg->rule = rule;
++			goto out;
++		}
++	}
++
++	err = -ENETUNREACH;
++out:
++	rcu_read_unlock();
++
++	return err;
++}
++
++EXPORT_SYMBOL_GPL(fib_rules_lookup);
++
++int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
++{
++	struct fib_rule_hdr *frh = nlmsg_data(nlh);
++	struct fib_rules_ops *ops = NULL;
++	struct fib_rule *rule, *r, *last = NULL;
++	struct nlattr *tb[FRA_MAX+1];
++	int err = -EINVAL;
++
++	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*frh)))
++		goto errout;
++
++	ops = lookup_rules_ops(frh->family);
++	if (ops == NULL) {
++		err = EAFNOSUPPORT;
++		goto errout;
++	}
++
++	err = nlmsg_parse(nlh, sizeof(*frh), tb, FRA_MAX, ops->policy);
++	if (err < 0)
++		goto errout;
++
++	rule = kzalloc(ops->rule_size, GFP_KERNEL);
++	if (rule == NULL) {
++		err = -ENOMEM;
++		goto errout;
++	}
++
++	if (tb[FRA_PRIORITY])
++		rule->pref = nla_get_u32(tb[FRA_PRIORITY]);
++
++	if (tb[FRA_IFNAME]) {
++		struct net_device *dev;
++
++		rule->ifindex = -1;
++		nla_strlcpy(rule->ifname, tb[FRA_IFNAME], IFNAMSIZ);
++		dev = __dev_get_by_name(rule->ifname);
++		if (dev)
++			rule->ifindex = dev->ifindex;
++	}
++
++	rule->action = frh->action;
++	rule->flags = frh->flags;
++	rule->table = frh_get_table(frh, tb);
++
++	if (!rule->pref && ops->default_pref)
++		rule->pref = ops->default_pref();
++
++	err = ops->configure(rule, skb, nlh, frh, tb);
++	if (err < 0)
++		goto errout_free;
++
++	list_for_each_entry(r, ops->rules_list, list) {
++		if (r->pref > rule->pref)
++			break;
++		last = r;
++	}
++
++	fib_rule_get(rule);
++
++	if (last)
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list