[NDP] len=0

在这里插入图片描述

void Optic::field_inf() { double x_o, y_o, x_s; double U[FACENUM], U_[FACENUM], I[FACENUM], I_[FACENUM]; double L[FACENUM] = { 0 }, L_[FACENUM] = { 0 };//distance of object and image,and L[0] is zero double rL[FACENUM], rL_[FACENUM];//ideal image and object distance double x[FACENUM], h[FACENUM], D[FACENUM]; double lt_[FACENUM], ls_[FACENUM]; double xt_[FACENUM], xs_[FACENUM], ast_[FACENUM];//variate related to curvature of field /* refractive index of each space(include the object), initial data before each calculation */ double s[FACENUM], t[FACENUM], s_[FACENUM], t_[FACENUM], ast[FACENUM];//variate related to astigmatism double rp[FACENUM] = { 0 }, ndp[FACENUM] = { 0 }, disp[FACENUM] = { 0 }; x_s = 0; U[0] = input->W / 180 * PI; x_o = -INFTY; y_o = -x_o * tan(U[0]); for (int i = 0; i < FACENUM; i++) { ndp[i] = 1; } /* transport data into related arrays */ initLight(d); for (int i = 1; i < input->faceNum; i++) { rp[i] = input->face[i].radius; ndp[i] = input->face[i].n; disp[i] = input->face[i].distance; } /* calculate initial data */ t_[0] = s_[0] = 0; x[0] = x_o - x_s; //take the distance from x-object to x-stop as x0 L[1] = -disp[0]; U[0] = atan(y_o / (-x[0])); rL[1] = x[0] - disp[0]; for (int i = 0; i < input->faceNum; i++) { /* calculate x_i+1 */ I[i] = asin((L[i + 1] - rp[i + 1]) / rp[i + 1] * sin(U[i])); I_[i] = asin(ndp[i] / ndp[i + 1] * sin(I[i])); U_[i] = U[i] + I[i] - I_[i]; L_[i + 1] = rp[i + 1] + rp[i + 1] * sin(I_[i]) / sin(U_[i]); h[i + 1] = rp[i + 1] * sin(U_[i] + I_[i]); x[i + 1] = (L[i] * sin(U[0]) / cos((I[i] - U[0]) / 2)) * (L[i] * sin(U[0]) / cos((I[i] - U[0]) / 2)) / (2 * rp[i + 1]); /* calculate s_i+1 & t_i+1 */ D[i] = (disp[i] - x[i] + x[i + 1]) / cos(U[i]); t[i + 1] = t_[i] - D[i]; s[i + 1] = s_[i] - D[i]; /* calculate s'_i+1, t'_i+1 and astigmatism */ t_[i + 1] = ndp[i + 1] * cos(I_[i]) * cos(I_[i]) / ((ndp[i + 1] * cos(I_[i]) - ndp[i] * cos(I[i])) / rp[i + 1] + ndp[i] * cos(I[i]) * cos(I[i]) / t[i + 1]); s_[i + 1] = ndp[i + 1] / (ndp[i] / s[i + 1] + (ndp[i + 1] * cos(I_[i]) - ndp[i] * cos(I[i])) / rp[i + 1]); ast[i + 1] = (t_[i + 1] - s_[i + 1]) * cos(U_[i]); rL_[i + 1] = ndp[i + 1] / ((ndp[i + 1] - ndp[i]) / rp[i + 1] + ndp[i] / rL[i + 1]); lt_[i + 1] = t_[i + 1] * cos(U_[i]) + x[i + 1]; ls_[i + 1] = s_[i + 1] * cos(U_[i]) + x[i + 1]; xt_[i + 1] = lt_[i + 1] - rL_[i + 1]; xs_[i + 1] = ls_[i + 1] - rL_[i + 1]; ast_[i + 1] = xt_[i + 1] - xs_[i + 1]; /* transmit variable */ L[i + 2] = L_[i + 1] - disp[i + 1]; rL[i + 2] = rL_[i + 1] - disp[i + 1]; U[i + 1] = U_[i]; } this->s = xs_[input->faceNum - 1]; this->t = xt_[input->faceNum - 1]; this->ast = ast[input->faceNum - 1]; } void Optic::field_obj() { double x_o, y_o, x_s; double U[FACENUM], U_[FACENUM], I[FACENUM], I_[FACENUM]; double L[FACENUM] = { 0 }, L_[FACENUM] = { 0 };//distance of object and image,and L[0] is zero double rL[FACENUM], rL_[FACENUM];//ideal image and object distance double x[FACENUM], h[FACENUM], D[FACENUM]; double lt_[FACENUM], ls_[FACENUM]; double xt_[FACENUM], xs_[FACENUM], ast_[FACENUM];//variate related to curvature of field /* refractive index of each space(include the object), initial data before each calculation */ double s[FACENUM], t[FACENUM], s_[FACENUM], t_[FACENUM], ast[FACENUM];//variate related to astigmatism double rp[FACENUM] = { 0 }, ndp[FACENUM] = { 0 }, disp[FACENUM] = { 0 }; x_s = 0; U[0] = input->W / 180 * PI; x_o = -input->L; y_o = -input->H; for (int i = 0; i < FACENUM; i++) { ndp[i] = 1; } /* transport data into related arrays */ initLight(d); for (int i = 1; i < input->faceNum; i++) { rp[i] = input->face[i].radius; ndp[i] = input->face[i].n; disp[i] = input->face[i].distance; } /* calculate initial data */ t_[0] = s_[0] = 0; x[0] = x_o - x_s; //take the distance from x-object to x-stop as x0 L[1] = -disp[0]; U[0] = atan(y_o / (-x[0])); rL[1] = x[0] - disp[0]; for (int i = 0; i < input->faceNum; i++) { /* calculate x_i+1 */ I[i] = asin((L[i + 1] - rp[i + 1]) / rp[i + 1] * sin(U[i])); I_[i] = asin(ndp[i] / ndp[i + 1] * sin(I[i])); U_[i] = U[i] + I[i] - I_[i]; L_[i + 1] = rp[i + 1] + rp[i + 1] * sin(I_[i]) / sin(U_[i]); h[i + 1] = rp[i + 1] * sin(U_[i] + I_[i]); x[i + 1] = (L[i] * sin(U[0]) / cos((I[i] - U[0]) / 2)) * (L[i] * sin(U[0]) / cos((I[i] - U[0]) / 2)) / (2 * rp[i + 1]); /* calculate s_i+1 & t_i+1 */ D[i] = (disp[i] - x[i] + x[i + 1]) / cos(U[i]); t[i + 1] = t_[i] - D[i]; s[i + 1] = s_[i] - D[i]; /* calculate s'_i+1, t'_i+1 and astigmatism */ t_[i + 1] = ndp[i + 1] * cos(I_[i]) * cos(I_[i]) / ((ndp[i + 1] * cos(I_[i]) - ndp[i] * cos(I[i])) / rp[i + 1] + ndp[i] * cos(I[i]) * cos(I[i]) / t[i + 1]); s_[i + 1] = ndp[i + 1] / (ndp[i] / s[i + 1] + (ndp[i + 1] * cos(I_[i]) - ndp[i] * cos(I[i])) / rp[i + 1]); ast[i + 1] = (t_[i + 1] - s_[i + 1]) * cos(U_[i]); rL_[i + 1] = ndp[i + 1] / ((ndp[i + 1] - ndp[i]) / rp[i + 1] + ndp[i] / rL[i + 1]); lt_[i + 1] = t_[i + 1] * cos(U_[i]) + x[i + 1]; ls_[i + 1] = s_[i + 1] * cos(U_[i]) + x[i + 1]; xt_[i + 1] = lt_[i + 1] - rL_[i + 1]; xs_[i + 1] = ls_[i + 1] - rL_[i + 1]; ast_[i + 1] = xt_[i + 1] - xs_[i + 1]; /* transmit variable */ L[i + 2] = L_[i + 1] - disp[i + 1]; rL[i + 2] = rL_[i + 1] - disp[i + 1]; U[i + 1] = U_[i]; } this->s = xs_[input->faceNum - 1]; this->t = xt_[input->faceNum - 1]; this->ast = ast[input->faceNum - 1]; } 根据上述c程序的原理,用python 编写一个计算像散的函数
06-26
现在遇到新的情况 当存在与当前设置冲突的地址时 即使后缀不为1 也能抓到DAD检测报文 同时会打印函数addrconf_dad_failure中net_info_ratelimited(“%s: IPv6 duplicate address %pI6c used by %pM detected!\n”, ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);的这个打印 经查找该函数在下面的函数调用,请分析原因static void ndisc_recv_ns(struct sk_buff *skb) { struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb); const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; u8 *lladdr = NULL; u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + offsetof(struct nd_msg, opt)); struct ndisc_options ndopts; struct net_device *dev = skb->dev; struct inet6_ifaddr *ifp; struct inet6_dev *idev = NULL; struct neighbour *neigh; int dad = ipv6_addr_any(saddr); bool inc; int is_router = -1; u64 nonce = 0; if (skb->len < sizeof(struct nd_msg)) { ND_PRINTK(2, warn, "NS: packet too short\n"); return; } if (ipv6_addr_is_multicast(&msg->target)) { ND_PRINTK(2, warn, "NS: multicast target address\n"); return; } /* * RFC2461 7.1.1: * DAD has to be destined for solicited node multicast address. */ if (dad && !ipv6_addr_is_solict_mult(daddr)) { ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n"); return; } if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) { ND_PRINTK(2, warn, "NS: invalid ND options\n"); return; } if (ndopts.nd_opts_src_lladdr) { lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev); if (!lladdr) { ND_PRINTK(2, warn, "NS: invalid link-layer address length\n"); return; } /* RFC2461 7.1.1: * If the IP source address is the unspecified address, * there MUST NOT be source link-layer address option * in the message. */ if (dad) { ND_PRINTK(2, warn, "NS: bad DAD packet (link-layer address option)\n"); return; } } if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) memcpy(&nonce, (u8 *)(ndopts.nd_opts_nonce + 1), 6); inc = ipv6_addr_is_multicast(daddr); ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); if (ifp) { have_ifp: if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { if (dad) { if (nonce != 0 && ifp->dad_nonce == nonce) { u8 *np = (u8 )&nonce; / Matching nonce if looped back / ND_PRINTK(2, notice, “%s: IPv6 DAD loopback for address %pI6c nonce %pM ignored\n”, ifp->idev->dev->name, &ifp->addr, np); goto out; } / * We are colliding with another node * who is doing DAD * so fail our DAD process / addrconf_dad_failure(skb, ifp); return; } else { / * This is not a dad solicitation. * If we are an optimistic node, * we should respond. * Otherwise, we should ignore it. */ if (!(ifp->flags & IFA_F_OPTIMISTIC)) goto out; } } idev = ifp->idev; } else { struct net *net = dev_net(dev); /* perhaps an address on the master device */ if (netif_is_l3_slave(dev)) { struct net_device *mdev; mdev = netdev_master_upper_dev_get_rcu(dev); if (mdev) { ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); if (ifp) goto have_ifp; } } idev = in6_dev_get(dev); if (!idev) { /* XXX: count this drop? */ return; } if (ipv6_chk_acast_addr(net, dev, &msg->target) || (idev->cnf.forwarding && (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) && (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && skb->pkt_type != PACKET_HOST && inc && NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { /* * for anycast or proxy, * sender should delay its response * by a random time between 0 and * MAX_ANYCAST_DELAY_TIME seconds. * (RFC2461) -- yoshfuji */ struct sk_buff *n = skb_clone(skb, GFP_ATOMIC); if (n) pneigh_enqueue(&nd_tbl, idev->nd_parms, n); goto out; } } else goto out; } if (is_router < 0) is_router = idev->cnf.forwarding; if (dad) { ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target, !!is_router, false, (ifp != NULL), true); goto out; } if (inc) NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast); else NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast); /* * update / create cache entry * for the source address */ neigh = __neigh_lookup(&nd_tbl, saddr, dev, !inc || lladdr || !dev->addr_len); if (neigh) ndisc_update(dev, neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_WEAK_OVERRIDE| NEIGH_UPDATE_F_OVERRIDE, NDISC_NEIGHBOUR_SOLICITATION, &ndopts); if (neigh || !dev->header_ops) { ndisc_send_na(dev, saddr, &msg->target, !!is_router, true, (ifp != NULL && inc), inc); if (neigh) neigh_release(neigh); } out: if (ifp) in6_ifa_put(ifp); else in6_dev_put(idev); }
10-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值