- 论坛徽章:
- 6
|
回复 15# ShadowStar
可以交流一下啊。
我研究了一下可以通过如下修改实现:
基于2.6.24.4内核
net/ipv4/route.c
< #include <linux/netfilter_ipv4.h>
< #include <net/netfilter/nf_conntrack.h>
< #include <net/netfilter/nf_conntrack_helper.h>
< #include <net/netfilter/nf_conntrack_l4proto.h>
< #include <net/netfilter/nf_conntrack_l3proto.h>
< #include <net/netfilter/nf_conntrack_core.h>
< #include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
75d66
1724,1727d1714
< /*if (res->fi && res->fi->fib_nhs > 1 && fl->oif == 0)
< fib_select_multipath(fl, res);*/
< // change upper two lines
1729,1740c1716
< {
< struct nf_conn *ct;
< enum ip_conntrack_info ctinfo;
< ct=nf_ct_get(skb, &ctinfo);
< if(!ct||ctinfo==IP_CT_NEW||ctinfo==IP_CT_RELATED)
< fib_select_multipath(fl, res);
< else{
< if(fib_select_multipath_ct(fl,res,ct)==0)
< fib_select_multipath(fl,res);
< }
< }
---
> fib_select_multipath(fl, res);
net/ipv4/fib_semantics.c
< //return 0 means doesn't match
< int fib_select_multipath_ct(const struct flowi *flp, struct fib_result *res,struct nf_conn *ct)
< {
< struct fib_info *fi = res->fi;
< struct in_device *in_dev;
< struct in_ifaddr *ifa;
< spin_lock_bh(&fib_multipath_lock);
< change_nexthops(fi) {
< in_dev=in_dev_get(nh->nh_dev);
< if(!in_dev)
< continue;
< rcu_read_lock();
< if (!(nh->nh_flags&RTNH_F_DEAD) &&in_dev->ifa_list){
< /*&&(in_dev->ifa_list==ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip||nh->nh_gw==ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip) {*/
< for(ifa=in_dev->ifa_list;ifa;ifa=ifa->ifa_next){
< if(ifa->ifa_local==ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip&&inet_ifa_match(nh->nh_gw,ifa))
< break;
< }
< rcu_read_unlock();
< in_dev_put(in_dev);
< if(ifa){
< printk(KERN_INFO "Match %u.%u.%u.%u\n",NIPQUAD(ifa->ifa_local));
< res->nh_sel=nhsel;
< spin_unlock_bh(&fib_multipath_lock);
< return 1;
< }
< }
< rcu_read_unlock();
< in_dev_put(in_dev);
< } endfor_nexthops(fi);
< spin_unlock_bh(&fib_multipath_lock);
< return 0;
< }
---
>
include/net/ip_fib.h
< #include <linux/netfilter_ipv4.h>
< #include <net/netfilter/nf_conntrack.h>
< #include <net/netfilter/nf_conntrack_helper.h>
< #include <net/netfilter/nf_conntrack_l4proto.h>
< #include <net/netfilter/nf_conntrack_l3proto.h>
< #include <net/netfilter/nf_conntrack_core.h>
< #include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
<
< extern int fib_select_multipath_ct(const struct flowi *flp, struct fib_result *res,struct nf_conn *ct); |
|