免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2162 | 回复: 1

[vpn] freeswan bugs,大伙有没有碰到过类似情况!多谢! [复制链接]

论坛徽章:
0
发表于 2009-09-14 20:34 |显示全部楼层
已经在代码中表明OOPS 发生的代码行~
分析了很久也没有结果, 隧道条数超过500条, linux 2.4 内核代码 ~

struct radij_node *
rj_match(v_arg, head)
    void *v_arg;
    struct radij_node_head *head;
{
    caddr_t v = v_arg;
    register struct radij_node *t = head->rnh_treetop, *x;
    register caddr_t cp = v, cp2, cp3;
    caddr_t cplim, mstart;
    struct radij_node *saved_t, *top = t;
    int off = t->rj_off, vlen = *(u_char *)cp, matched_off;

    /*
     * Open code rj_search(v, top) to avoid overhead of extra
     * subroutine call.
     */

    for (; t->rj_b >= 0; ) {
        if (t->rj_bmask & cp[t->rj_off])
            t = t->rj_r;
        else
            t = t->rj_l;
    }
    /*
     * See if we match exactly as a host destination
     */

    KLIPS_PRINT(debug_radij,
            "klips_debug:rj_match: "
            "* See if we match exactly as a host destinationn");
   
    cp += off; cp2 = t->rj_key + off; cplim = v + vlen;
    for (; cp < cplim; cp++, cp2++)
        if (*cp != *cp2)  =======================================>>>OOPS
            goto on1;
    /*
     * This extra grot is in case we are explicitly asked
     * to look up the default.  Ugh!
     */

    if ((t->rj_flags & RJF_ROOT) && t->rj_dupedkey)
        t = t->rj_dupedkey;
    return t;
on1:
    matched_off = cp - v;
    saved_t = t;
    KLIPS_PRINT(debug_radij,
            "klips_debug:rj_match: "
            "** try to match a leaf, t=0p%pn", t);
    do {
        if (t->rj_mask) {
        /*
         * Even if we don't match exactly as a hosts;
         * we may match if the leaf we wound up at is
         * a route to a net.
         */

        cp3 = matched_off + t->rj_mask;
        cp2 = matched_off + t->rj_key;
        for (; cp < cplim; cp++)
            if ((*cp2++ ^ *cp) & *cp3++)
                break;
        if (cp == cplim)
            return t;
        cp = matched_off + v;
        }
    } while ((t = t->rj_dupedkey));
    t = saved_t;
    /* start searching up the tree */
    KLIPS_PRINT(debug_radij,
            "klips_debug:rj_match: "
            "*** start searching up the tree, t=0p%pn",
            t);
    do {
        register struct radij_mask *m;
        
        t = t->rj_p;
        KLIPS_PRINT(debug_radij,
                "klips_debug:rj_match: "
                "**** t=0p%pn",
                t);
        if ((m = t->rj_mklist)) {
            /*
             * After doing measurements here, it may
             * turn out to be faster to open code
             * rj_search_m here instead of always
             * copying and masking.
             */

            /* off = min(t->rj_off, matched_off); */
            off = t->rj_off;
            if (matched_off < off)
                off = matched_off;
            mstart = maskedKey + off;
            do {
                cp2 = mstart;
                cp3 = m->rm_mask + off;
                KLIPS_PRINT(debug_radij,
                        "klips_debug:rj_match: "
                        "***** cp2=0p%p cp3=0p%pn",
                        cp2, cp3);
                for (cp = v + off; cp < cplim;)
                    *cp2++ =  *cp++ & *cp3++;
                x = rj_search(maskedKey, t);
                while (x && x->rj_mask != m->rm_mask)
                    x = x->rj_dupedkey;
                if (x &&
                    (Bcmp(mstart, x->rj_key + off,
                    vlen - off) == 0))
                        return x;
            } while ((m = m->rm_mklist));
        }
    } while (t != top);
    KLIPS_PRINT(debug_radij,
            "klips_debug:rj_match: "
            "***** not found.n");
    return 0;
};
        


[ 本帖最后由 robbielee 于 2009-9-29 10:01 编辑 ]

论坛徽章:
0
发表于 2009-09-14 20:35 |显示全部楼层


int
rj_walktree(h, f, w)
    struct radij_node_head *h;
    register int (*f)(struct radij_node *,void *);
    void *w;
{
    int error;
    struct radij_node *base, *next;
    register struct radij_node *rn;

    if(!h || !f /* || !w */) {
        return -ENODATA;
    }

    rn = h->rnh_treetop;
    /*
     * This gets complicated because we may delete the node
     * while applying the function f to it, so we need to calculate
     * the successor node in advance.
     */

    /* First time through node, go left */
    while (rn->rj_b >= 0)
        rn = rn->rj_l;
    for (;;) {
#ifdef CONFIG_IPSEC_DEBUG
        if(debug_radij) {
            printk("klips_debug:rj_walktree: "
                   "for: rn=0p%p rj_b=%d rj_flags=%x",
                   rn,
                   rn->rj_b,
                   rn->rj_flags);
            rn->rj_b >= 0 ?
                printk(" node off=%xn",
                       rn->rj_off) :
                printk(" leaf key = %08x->%08xn",
                       (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
                       (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
                ;
        }
#endif /* CONFIG_IPSEC_DEBUG */
        base = rn;
        /* If at right child go back up, otherwise, go right */
        while (rn->rj_p->rj_r == rn && (rn->rj_flags & RJF_ROOT) == 0)
            rn = rn->rj_p;
        /* Find the next *leaf* since next node might vanish, too */
        for (rn = rn->rj_p->rj_r; rn->rj_b >= 0;)
            rn = rn->rj_l;    ============================>>>>>OOPS
        next = rn;
#ifdef CONFIG_IPSEC_DEBUG
        if(debug_radij) {
            printk("klips_debug:rj_walktree: "
                   "processing leaves, rn=0p%p rj_b=%d rj_flags=%x",
                   rn,
                   rn->rj_b,
                   rn->rj_flags);
            rn->rj_b >= 0 ?
                printk(" node off=%xn",
                       rn->rj_off) :
                printk(" leaf key = %08x->%08xn",
                       (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
                       (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
                ;
        }
#endif /* CONFIG_IPSEC_DEBUG */
        /* Process leaves */
        while ((rn = base)) {
            base = rn->rj_dupedkey;
#ifdef CONFIG_IPSEC_DEBUG
            if(debug_radij) {
                printk("klips_debug:rj_walktree: "
                       "while: base=0p%p rn=0p%p rj_b=%d rj_flags=%x",
                       base,
                       rn,
                       rn->rj_b,
                       rn->rj_flags);
                rn->rj_b >= 0 ?
                    printk(" node off=%xn",
                           rn->rj_off) :
                    printk(" leaf key = %08x->%08xn",
                           (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
                           (u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
                    ;
            }
#endif /* CONFIG_IPSEC_DEBUG */
            if (!(rn->rj_flags & RJF_ROOT) && (error = (*f)(rn, w)))
                return (-error);
        }
        rn = next;
        if (rn->rj_flags & RJF_ROOT)
            return (0);
    }
    /* NOTREACHED */
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP