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