亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dhcp_prot.c

?? Mavell 無線模塊原廠IC AP32源代碼。DHCP客戶端與服務(wù)端源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
            if ( CHECK_XID() )          // not the same transaction;
                break;                  // listen again...

            if ( 0 == received->bp_siaddr.s_addr )
            {
                // then fill in from the options...
                length = sizeof(received->bp_siaddr.s_addr);
                get_bootp_option( received, TAG_DHCP_SERVER_ID,
                                  &received->bp_siaddr.s_addr);
            }

            // check it was a DHCP reply
            length = sizeof(msgtype);
            if ( get_bootp_option( received, TAG_DHCP_MESS_TYPE, &msgtype) )
            {
                if ( DHCPACK == msgtype  // Same offer?
                        && received->bp_yiaddr.s_addr == xmit->bp_yiaddr.s_addr)
                {
                    // we like the packet, so reset the timeout for next time
                    reset_timeout( &tv, &timeout_scratch );
                    // Record the new lease and set up timers &c
                    new_lease( received, lease );
                    *pstate = DHCPSTATE_BOUND;
                    break;
                }
                if ( DHCPNAK == msgtype )
                { // we're bounced!
                    *pstate = DHCPSTATE_NOTBOUND;  // So quit out.
                    break;
                }
                // otherwise it's something else, maybe another offer.
                // Just listen again, which implicitly discards it.
            }
            break;

        case DHCPSTATE_REBINDING:
            // Just send what you got with a DHCPREQUEST in the message type.
            // Then wait for an ACK.  This one is BROADCAST.

            // Fill in the BOOTP request - DHCPREQUEST packet
            xmit->bp_xid = xid;
            xmit->bp_op = BOOTREQUEST;
            xmit->bp_flags = htons(0); // no BROADCAST FLAG
            // Use the *client* address here:
            xmit->bp_ciaddr.s_addr = xmit->bp_yiaddr.s_addr;

            set_fixed_tag( xmit, TAG_DHCP_MESS_TYPE, DHCPREQUEST, 1 );
            // These must not be set in this context
            unset_tag( xmit, TAG_DHCP_REQ_IP );
            unset_tag( xmit, TAG_DHCP_SERVER_ID );
            // Set all the tags we want to use when sending a packet
            set_default_dhcp_tags( xmit );

#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_REBINDING sending:\n" );
            show_bootp( intf, xmit );
#endif
            // Send back a [modified] copy.  Note that some fields are explicitly
            // cleared, as per the RFC.  We need the copy because these fields are
            // still useful to us (and currently stored in the 'result' structure)
            xlen = dhcp_size_for_send( xmit );
            bcopy( xmit, &xmit2, xlen );
            xmit2.bp_yiaddr.s_addr = xmit2.bp_siaddr.s_addr = xmit2.bp_giaddr.s_addr = 0;
            xmit2.bp_hops = 0;
            if (sendto(s, &xmit2, xlen, 0,
                       (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr)) < 0)
            {
                *pstate = DHCPSTATE_FAILED;
                break;
            }

            *pstate = DHCPSTATE_REBIND_RECV;
            break;

        case DHCPSTATE_REBIND_RECV:
            // wait for an ACK or a NACK - retry by going back to
            // DHCPSTATE_REBINDING; NACK means go to NOTBOUND.
            // No answer means just wait for expiry; we tried!

            setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

            addrlen = sizeof(rx_addr);
            if (recvfrom(s, received, sizeof(struct bootp), 0,
                         (struct sockaddr *)&rx_addr, &addrlen) < 0)
            {
                // No packet arrived
                // go to the next larger timeout and re-send:
                if ( ! next_timeout( &tv, &timeout_scratch ) )
                {
                    // If we timed out completely, just give up until EX
                    // expires - retain the lease meanwhile.  The normal
                    // lease mechanism will invoke NOTBOUND state as and
                    // when necessary.
                    *pstate = DHCPSTATE_BOUND;
                    break;
                }
                *pstate = DHCPSTATE_REBINDING;
                break;
            }
            // Check for well-formed packet with correct termination (not truncated)
            length = dhcp_size( received );
#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_REBIND_RECV received:\n" );
            if ( length <= 0 )
                diag_printf( "WARNING! malformed or truncated packet\n" );
            diag_printf( "...rx_addr is family %d, addr %08x, port %d\n",
                         rx_addr.sin_family,
                         rx_addr.sin_addr.s_addr,
                         rx_addr.sin_port );
            show_bootp( intf, received );
#endif

            if ( length <= 0 )
                break;
            if ( CHECK_XID() )          // not the same transaction;
                break;                  // listen again...

            if ( 0 == received->bp_siaddr.s_addr )
            {
                // then fill in from the options...
                //int length = sizeof(received->bp_siaddr.s_addr );
                get_bootp_option( received, TAG_DHCP_SERVER_ID,
                                  &received->bp_siaddr.s_addr);
            }

            // check it was a DHCP reply
            length = sizeof(msgtype);
            if ( get_bootp_option( received, TAG_DHCP_MESS_TYPE, &msgtype) )
            {
                if ( DHCPACK == msgtype  // Same offer?
                        && received->bp_yiaddr.s_addr == xmit->bp_yiaddr.s_addr)
                {
                    // we like the packet, so reset the timeout for next time
                    reset_timeout( &tv, &timeout_scratch );
                    // Record the new lease and set up timers &c
                    new_lease( received, lease );
                    *pstate = DHCPSTATE_BOUND;
                    break;
                }
                else if ( DHCPNAK == msgtype )
                { // we're bounced!
                    *pstate = DHCPSTATE_NOTBOUND;  // So back the start of the rigmarole.
                    break;
                }
                // otherwise it's something else, maybe another offer.
                // Just listen again, which implicitly discards it.
            }
            break;

        case DHCPSTATE_BOOTP_FALLBACK:
            // All done with socket
            close(s);
            // And no lease should have become active, but JIC
            no_lease( lease );
            // Re-initialize the interface with the new state
            if ( DHCPSTATE_BOOTP_FALLBACK != oldstate )
            {
                // Then need to go down and up
                do_dhcp_down_net( intf, res, &oldstate, lease ); // oldstate used
                if ( 0 != oldstate )
                {
                    // Then not called from init_all_network_interfaces()
                    // so we must initialize the interface ourselves
                    if (!init_net(intf, res))
                    {
                        do_dhcp_down_net( intf, res, pstate, lease );
                        *pstate = DHCPSTATE_FAILED;
                        return false;
                    }
                }
            }

            // Otherwise, nothing whatsoever to do...
            return true;

        case DHCPSTATE_NOTBOUND:
            // All done with socket
            close(s);
            // No lease active
            no_lease( lease );
            // Leave interface up so app can tidy.
            return false;

        case DHCPSTATE_FAILED:
            // All done with socket
            close(s);
            // No lease active
            no_lease( lease );
            // Unconditionally down the interface.
            do_dhcp_down_net( intf, res, &oldstate, lease );
            return false;

        case DHCPSTATE_DO_RELEASE:
            // We have been forced here by external means, to release the
            // lease for graceful shutdown.

            // Just send what you got with a DHCPRELEASE in the message
            // type UNICAST straight to the server.  No ACK.  Then go to
            // NOTBOUND state.
            NEW_XID( xid );
            xmit->bp_xid = xid;
            xmit->bp_op = BOOTREQUEST;
            xmit->bp_flags = htons(0); // no BROADCAST FLAG
            // Use the *client* address here:
            xmit->bp_ciaddr.s_addr = xmit->bp_yiaddr.s_addr;

            set_fixed_tag( xmit, TAG_DHCP_MESS_TYPE, DHCPRELEASE, 1 );

            // Set unicast address to *server*
            server_addr.sin_addr.s_addr = res->bp_siaddr.s_addr;

#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_DO_RELEASE sending:\n" );
            diag_printf( "UNICAST to family %d, addr %08x, port %d\n",
                         server_addr.sin_family,
                         server_addr.sin_addr.s_addr,
                         server_addr.sin_port );
            show_bootp( intf, xmit );
#endif
            // Send back a [modified] copy.  Note that some fields are explicitly
            // cleared, as per the RFC.  We need the copy because these fields are
            // still useful to us (and currently stored in the 'result' structure)
            xlen = dhcp_size_for_send( xmit );
            bcopy( xmit, &xmit2, xlen );
            xmit2.bp_yiaddr.s_addr = xmit2.bp_siaddr.s_addr = xmit2.bp_giaddr.s_addr = 0;
            xmit2.bp_hops = 0;
            if (sendto(s, &xmit2, xlen, 0,
                       // UNICAST address of the server:
                       (struct sockaddr *)&server_addr,
                       sizeof(server_addr)) < 0)
            {
                *pstate = DHCPSTATE_FAILED;
                break;
            }

            *pstate = DHCPSTATE_NOTBOUND;
            break;

        default:
            no_lease( lease );
            close(s);
            return false;
        }
    }
    /* NOTREACHED */
    return false;
}

// ------------------------------------------------------------------------
// Bring an interface down, failed to initialize it or lease is expired
// Also part of normal startup, bring down for proper reinitialization

int
do_dhcp_down_net(const char *intf, struct bootp *res,
                 cyg_uint8 *pstate, struct dhcp_lease *lease)
{
    struct sockaddr_in *addrp;
    struct ifreq ifr;
    int s;

    // Ensure clean slate
    route_reinit();  // Force any existing routes to be forgotten

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0)
    {
        perror("socket");
        return false;
    }

    addrp = (struct sockaddr_in *) &ifr.ifr_addr;

    // Remove any existing address
    if ( DHCPSTATE_FAILED == *pstate
            || DHCPSTATE_INIT == *pstate
            || 0 == *pstate )
    {
        // it was configured for broadcast only, "half-up"
        memset(addrp, 0, sizeof(*addrp));
        addrp->sin_family = AF_INET;
        addrp->sin_len = sizeof(*addrp);
        addrp->sin_port = 0;
        addrp->sin_addr.s_addr = INADDR_ANY;
    }
    else
    {
        // get the specific address that was used
        strcpy(ifr.ifr_name, intf);
        if (ioctl(s, SIOCGIFADDR, &ifr))
        {
            perror("SIOCGIFADDR 1");
            return false;
        }
    }

    strcpy(ifr.ifr_name, intf);
    if (ioctl(s, SIOCDIFADDR, &ifr))
    { /* delete IF addr */
        perror("SIOCDIFADDR1");
    }

#ifdef INET6
    {
        int s6;

        s6 = socket(AF_INET6, SOCK_DGRAM, 0);
        if (s6 < 0)
        {
            perror("socket AF_INET6");
            return false;
        }
        // Now delete the ipv6 addr
        strcpy(ifr.ifr_name, intf);
        if (ioctl(s6, SIOCGLIFADDR, &ifr))
        {
            perror("SIOCGIFADDR_IN6 1");
            return false;
        }

        strcpy(ifr.ifr_name, intf);
        if (ioctl(s6, SIOCDLIFADDR, &ifr))
        { /* delete IF addr */
            perror("SIOCDIFADDR_IN61");
        }
        close(s6);
    }
#endif /* IP6 */

    // Shut down interface so it can be reinitialized
    ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
    if (ioctl(s, SIOCSIFFLAGS, &ifr))
    { /* set ifnet flags */
        perror("SIOCSIFFLAGS down");
        return false;
    }

    // All done with socket
    close(s);

    if ( 0 != *pstate ) // preserve initial state
        *pstate = DHCPSTATE_INIT;

    return true;
}

// ------------------------------------------------------------------------
// Release (relinquish) a leased address - if we have one - and bring down
// the interface.
int
do_dhcp_release(const char *intf, struct bootp *res,
                cyg_uint8 *pstate, struct dhcp_lease *lease)
{
    if ( 0 != *pstate
            && DHCPSTATE_INIT != *pstate
            && DHCPSTATE_NOTBOUND != *pstate
            && DHCPSTATE_FAILED != *pstate
            && DHCPSTATE_BOOTP_FALLBACK != *pstate )
    {
        *pstate = DHCPSTATE_DO_RELEASE;
        do_dhcp( intf, res, pstate, lease ); // to send the release packet
        cyg_thread_delay( 100 );             // to let it leave the building
    }
    return true;
}

// ------------------------------------------------------------------------

#endif // CYGPKG_NET_DHCP

// EOF dhcp_prot.c

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产欧美久久久精品| 国产精品理伦片| 成人午夜视频网站| 亚洲美女视频在线| 日韩视频永久免费| 99久久夜色精品国产网站| 天堂蜜桃91精品| 亚洲国产精华液网站w| 欧美一级在线视频| 国产美女精品人人做人人爽 | 国内外成人在线视频| 亚洲私人影院在线观看| 久久先锋影音av鲁色资源网| 成人午夜视频网站| 亚洲综合小说图片| 91精品国产一区二区三区蜜臀| 国产精品沙发午睡系列990531| 国产黄人亚洲片| 欧美日韩一区 二区 三区 久久精品| 亚洲精品成人a在线观看| 日韩三级伦理片妻子的秘密按摩| 一本大道久久a久久综合| av网站免费线看精品| 国产成人免费av在线| 青青国产91久久久久久| 亚洲成人动漫av| 午夜一区二区三区视频| 一区二区三区**美女毛片| 国产在线精品视频| 精品国产3级a| 在线综合+亚洲+欧美中文字幕| 成人免费视频视频在线观看免费| 精品一区二区在线视频| 无码av免费一区二区三区试看 | 在线综合视频播放| 91麻豆精品91久久久久同性| 在线成人免费观看| 一本色道亚洲精品aⅴ| 97久久精品人人做人人爽| 成人黄色国产精品网站大全在线免费观看 | 丁香网亚洲国际| 成人黄色在线网站| 99国产精品国产精品久久| 懂色av一区二区三区免费观看| 丰满亚洲少妇av| 不卡视频免费播放| 色综合天天综合网天天狠天天| www.av亚洲| 91热门视频在线观看| 99国产精品一区| 欧美视频一区二区三区四区 | 成人一区在线观看| 成人禁用看黄a在线| 一本一道波多野结衣一区二区| 在线免费av一区| 3atv在线一区二区三区| 26uuu国产电影一区二区| 久久尤物电影视频在线观看| 国产欧美精品一区aⅴ影院| 亚洲欧美日韩在线不卡| 亚洲1区2区3区4区| 国产精品一二三四| 91麻豆蜜桃一区二区三区| 欧美精品tushy高清| wwwwww.欧美系列| 国产精品视频一二三| 香蕉久久一区二区不卡无毒影院| 日本欧美加勒比视频| 国产91精品一区二区麻豆亚洲| 91原创在线视频| 日韩三区在线观看| 亚洲精品乱码久久久久久黑人| 日韩精品亚洲一区二区三区免费| 成人一区二区三区中文字幕| 欧美日本国产视频| 国产视频一区不卡| 亚洲成人av一区二区| 国产大片一区二区| 欧美综合一区二区三区| 2022国产精品视频| 亚洲一区二区三区中文字幕| 狠狠色丁香久久婷婷综| 欧美在线观看一区| 欧美电影在哪看比较好| 国产精品午夜春色av| 青青国产91久久久久久| 色综合激情五月| 久久亚洲捆绑美女| 国产精品白丝在线| 麻豆成人综合网| 欧美天堂亚洲电影院在线播放| 久久色成人在线| 亚洲成av人片一区二区三区| 国产suv精品一区二区6| 日韩一区二区中文字幕| 尤物av一区二区| 成人精品免费网站| 777亚洲妇女| 亚洲国产精品嫩草影院| www..com久久爱| 欧美v国产在线一区二区三区| 亚洲va天堂va国产va久| jizz一区二区| 精品国产伦理网| 日本不卡视频在线观看| 欧美日韩一区成人| 国产三级三级三级精品8ⅰ区| 五月天网站亚洲| 欧美日韩国产天堂| 亚洲国产视频直播| 色婷婷一区二区三区四区| 亚洲天堂免费看| 99国产精品久久久| 亚洲成人你懂的| 日韩精品综合一本久道在线视频| 国模一区二区三区白浆| 国产精品网站导航| 91性感美女视频| 亚洲成人精品一区| 精品国产三级a在线观看| 国产成人三级在线观看| 亚洲色大成网站www久久九九| 欧美性受xxxx黑人xyx| 日韩va亚洲va欧美va久久| 久久精品水蜜桃av综合天堂| av一二三不卡影片| 日韩精品乱码免费| 国产午夜亚洲精品午夜鲁丝片| 91网站最新网址| 免费观看成人av| 成人免费在线观看入口| 欧美午夜精品一区二区三区| 裸体健美xxxx欧美裸体表演| 国产欧美精品一区二区色综合| 欧美性一级生活| 国产精品资源在线观看| 一区二区三区欧美视频| 欧美精品一区二区三区一线天视频| av在线综合网| 久久国产精品色婷婷| 亚洲精品精品亚洲| 精品国产污污免费网站入口| 欧美在线免费观看视频| 国产精品69毛片高清亚洲| 亚洲一区二区三区爽爽爽爽爽| 精品对白一区国产伦| 欧美日韩在线播| 99久久婷婷国产精品综合| 国模套图日韩精品一区二区| 亚洲午夜三级在线| 亚洲天堂成人在线观看| 国产调教视频一区| 日韩免费性生活视频播放| 色菇凉天天综合网| 成人午夜激情在线| 久久精品72免费观看| 亚洲色图丝袜美腿| 国产无一区二区| 精品少妇一区二区| 欧美一区二区在线观看| 在线观看免费视频综合| 不卡av电影在线播放| 国产一区二区剧情av在线| 日韩精品电影在线观看| 亚洲国产精品一区二区久久 | 成人一区二区在线观看| 久久精品国产99久久6| 日韩制服丝袜av| 亚洲综合男人的天堂| 亚洲欧美日韩国产手机在线 | 日韩免费看的电影| 91精品国产欧美一区二区成人| 在线视频综合导航| 一本色道**综合亚洲精品蜜桃冫| 国产成人精品影院| 国产成人精品影视| 国产成人av资源| 国产精品538一区二区在线| 久久99精品一区二区三区| 蜜臀va亚洲va欧美va天堂| 五月开心婷婷久久| 婷婷综合在线观看| 日韩精品午夜视频| 日韩精品一二区| 精品一区二区免费视频| 久久 天天综合| 国产在线麻豆精品观看| 国内精品嫩模私拍在线| 成人综合婷婷国产精品久久免费| 国产成人免费视频| av午夜一区麻豆| 91黄色免费网站| 制服丝袜av成人在线看| 欧美成人精品1314www| 国产免费成人在线视频| 国产精品国产三级国产普通话三级| 中文字幕一区av| 一区二区三区四区不卡视频| 五月天一区二区三区| 韩国成人在线视频|