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 <[EMAIL PROTECTED]>
++ */
++
++#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>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to