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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dhcp_prot.c

?? Mavell 無線模塊原廠IC AP32源代碼。DHCP客戶端與服務端源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
                reset_timeout( &tv, &timeout_scratch ); // next conversation
                *pstate = DHCPSTATE_RENEWING;
            }
        }

        switch ( *pstate )
        {

        case DHCPSTATE_INIT:

            // Send the DHCPDISCOVER packet

            // Fill in the BOOTP request - DHCPDISCOVER packet
            bzero(xmit, sizeof(*xmit));
            xmit->bp_op = BOOTREQUEST;
            xmit->bp_htype = HTYPE_ETHERNET;
            xmit->bp_hlen = IFHWADDRLEN;
            xmit->bp_xid = xid;
            xmit->bp_secs = 0;

#ifdef ORIG_DHCP_CODE

            xmit->bp_flags = htons(0x8000); // BROADCAST FLAG
#else

            xmit->bp_flags = htons(0x0000); // orig val did not work, no BCAST FLAG
#endif

            bcopy(ifr.ifr_hwaddr.sa_data, &xmit->bp_chaddr, xmit->bp_hlen);
            bcopy(mincookie, xmit->bp_vend, sizeof(mincookie));

            // remove the next line to test ability to handle bootp packets.
            set_fixed_tag( xmit, TAG_DHCP_MESS_TYPE, DHCPDISCOVER, 1 );
            // 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_INIT sending:\n" );
            show_bootp( intf, xmit );
#endif

            if (sendto(s, xmit, dhcp_size_for_send(xmit), 0,
                       (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr)) < 0)
            {
                *pstate = DHCPSTATE_FAILED;
                break;
            }

            seen_bootp_reply = 0;
            *pstate = DHCPSTATE_SELECTING;
            break;

        case DHCPSTATE_SELECTING:
            // This is a separate state so that we can listen again
            // *without* retransmitting.

            // listen for the DHCPOFFER reply

            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 (this time)
                if ( seen_bootp_reply )
                { // then already have a bootp reply
                    // Save the good packet in *xmit
                    bcopy( received, xmit, dhcp_size(received) );
                    *pstate = DHCPSTATE_BOOTP_FALLBACK;
                    NEW_XID( xid ); // Happy to advance, so new XID
                    reset_timeout( &tv, &timeout_scratch );
                    break;
                }
                // go to the next larger timeout and re-send:
                if ( ! next_timeout( &tv, &timeout_scratch ) )
                {
                    *pstate = DHCPSTATE_FAILED;
                    break;
                }
                *pstate = DHCPSTATE_INIT; // to retransmit
                break;
            }
            // Check for well-formed packet with correct termination (not truncated)
            length = dhcp_size( received );
#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_SELECTING 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() )          // XID and ESA matches?
                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);
            }

            // see if it was a DHCP reply or a bootp reply; it could be
            // either.
            length = sizeof(msgtype);
            if ( get_bootp_option( received, TAG_DHCP_MESS_TYPE, &msgtype) )
            {
                if ( DHCPOFFER == msgtype )
                { // all is well
                    // Save the good packet in *xmit
                    bcopy( received, xmit, dhcp_size(received) );
                    // we like the packet, so reset the timeout for next time
                    reset_timeout( &tv, &timeout_scratch );
                    *pstate = DHCPSTATE_REQUESTING;
                    NEW_XID( xid ); // Happy to advance, so new XID
                }
            }
            else // No TAG_DHCP_MESS_TYPE entry so it's a bootp reply
                seen_bootp_reply = 1; // (keep the bootp packet in received)

            // If none of the above state changes occurred, we got a packet
            // that "should not happen", OR we have a bootp reply in our
            // hand; so listen again with the same timeout, without
            // retrying the send, in the hope of getting a DHCP reply.
            break;

        case DHCPSTATE_REQUESTING:
            // Just send what you got with a DHCPREQUEST in the message type.
            // then wait for an ACK in DHCPSTATE_REQUEST_RECV.

            // Fill in the BOOTP request - DHCPREQUEST packet
            xmit->bp_xid = xid;
            xmit->bp_op = BOOTREQUEST;
#ifdef ORIG_DHCP_CODE

            xmit->bp_flags = htons(0x8000); // BROADCAST FLAG
#else

            xmit->bp_flags = htons(0x0000); // orig val did not work
#endif

            set_fixed_tag( xmit, TAG_DHCP_MESS_TYPE, DHCPREQUEST, 1 );
            // Set all the tags we want to use when sending a packet
            set_default_dhcp_tags( xmit );
            // And this will be a new one:
            set_fixed_tag( xmit, TAG_DHCP_REQ_IP, ntohl(xmit->bp_yiaddr.s_addr), 4 );

#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_REQUESTING 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_REQUEST_RECV;
            break;

        case DHCPSTATE_REQUEST_RECV:
            // wait for an ACK or a NACK - retry by going back to
            // DHCPSTATE_REQUESTING; NACK means go back to INIT.

            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 ) )
                {
                    *pstate = DHCPSTATE_FAILED;
                    break;
                }
                *pstate = DHCPSTATE_REQUESTING;
                break;
            }
            // Check for well-formed packet with correct termination (not truncated)
            length = dhcp_size( received );
#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_REQUEST_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...
                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 & server?
                        && received->bp_yiaddr.s_addr == xmit->bp_yiaddr.s_addr
                        && received->bp_siaddr.s_addr == xmit->bp_siaddr.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 // Same server?
                        && received->bp_siaddr.s_addr == xmit->bp_siaddr.s_addr)
                {
                    // we're bounced!
                    *pstate = DHCPSTATE_INIT;  // So back the start of the rigmarole.
                    NEW_XID( xid ); // Unhappy to advance, so new XID
                    reset_timeout( &tv, &timeout_scratch );
                    break;
                }
                // otherwise it's something else, maybe another offer, or a bogus
                // NAK from someone we are not asking!
                // Just listen again, which implicitly discards it.
            }
            break;

        case DHCPSTATE_BOUND:

            // We are happy now, we have our address.

            // All done with socket
            close(s);

            // Re-initialize the interface with the new state
            if ( DHCPSTATE_BOUND != 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_RENEWING:
            // Just send what you got with a DHCPREQUEST in the message
            // type UNICAST straight to the server.  Then wait for an ACK.

            // 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 );

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

#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_RENEWING 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_RENEW_RECV;
            break;

        case DHCPSTATE_RENEW_RECV:
            // wait for an ACK or a NACK - retry by going back to
            // DHCPSTATE_RENEWING; NACK means go to NOTBOUND.
            // No answer means just wait for T2, to broadcast.

            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 T2
                    // expires - retain the lease meanwhile.  The normal
                    // lease mechanism will invoke REBINDING as and when
                    // necessary.
                    *pstate = DHCPSTATE_BOUND;
                    break;
                }
                *pstate = DHCPSTATE_RENEWING;
                break;
            }
            // Check for well-formed packet with correct termination (not truncated)
            length = dhcp_size( received );
#ifdef CYGDBG_NET_DHCP_CHATTER

            diag_printf( "---------DHCPSTATE_RENEW_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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区三区高清不卡| 久久国产精品免费| 日本大胆欧美人术艺术动态| 国产精品一二三在| 精品视频在线免费| 国产精品超碰97尤物18| 日av在线不卡| 色婷婷综合中文久久一本| 精品福利一区二区三区免费视频| 亚洲色图在线播放| 国产a级毛片一区| 欧美一区二区在线免费播放| 亚洲黄色片在线观看| 国产伦精品一区二区三区在线观看 | 欧美一区午夜视频在线观看| 亚洲欧洲日本在线| 成人性生交大合| 欧美一级片在线看| 亚洲成人一区二区| 欧美性受极品xxxx喷水| 1024精品合集| 99这里只有久久精品视频| 日韩三级视频中文字幕| 亚洲一区二区三区视频在线播放| 91视视频在线观看入口直接观看www | 国产亚洲精品免费| 极品少妇xxxx精品少妇偷拍| 日韩片之四级片| 亚洲成精国产精品女| 欧美日韩一区二区三区不卡| 一区二区三区在线观看动漫| 91美女福利视频| 亚洲精品视频在线| 色香蕉久久蜜桃| 亚洲综合久久久| 欧美色爱综合网| 日韩av不卡一区二区| 91精品国产91久久久久久最新毛片 | 久久蜜桃一区二区| 国产一区二区福利| 欧美国产日韩精品免费观看| 成人h精品动漫一区二区三区| 中文一区二区完整视频在线观看| 国产激情精品久久久第一区二区| 国产喂奶挤奶一区二区三区| 成人丝袜18视频在线观看| 一区在线观看免费| 色婷婷综合久久久中文一区二区| 亚洲一区免费视频| 88在线观看91蜜桃国自产| 久久99精品国产麻豆婷婷洗澡| 337p日本欧洲亚洲大胆色噜噜| 国内精品视频666| 欧美经典一区二区三区| 色综合天天性综合| 日本成人在线电影网| 久久亚洲综合色一区二区三区| 成人精品亚洲人成在线| 夜夜嗨av一区二区三区网页| 51午夜精品国产| 国产电影精品久久禁18| 亚洲品质自拍视频| 欧美一区二区三区色| 国产成人av电影在线| 亚洲蜜臀av乱码久久精品| 在线成人免费观看| 懂色av一区二区夜夜嗨| 一区二区在线观看不卡| 欧美电视剧免费观看| 99re66热这里只有精品3直播| 视频一区在线视频| 久久久激情视频| 欧美日韩国产在线播放网站| 国产精品一区在线观看乱码| 夜夜嗨av一区二区三区四季av| 精品国产sm最大网站| 欧美午夜不卡视频| 成人av网站免费| 日韩高清一区二区| 亚洲欧美视频在线观看| 久久新电视剧免费观看| 欧美午夜片在线看| 成人综合日日夜夜| 精品一区二区三区久久| 亚洲bt欧美bt精品777| 中文字幕成人网| 欧美成人在线直播| 欧美午夜精品一区二区三区| 国产91在线|亚洲| 捆绑变态av一区二区三区| 亚洲综合色丁香婷婷六月图片| 国产精品全国免费观看高清| 日韩欧美综合一区| 91精品国产综合久久久久久漫画| 一本到不卡精品视频在线观看| 国产成人综合网| 韩日欧美一区二区三区| 日日欢夜夜爽一区| 亚洲成人777| 亚洲已满18点击进入久久| 亚洲色欲色欲www在线观看| 国产亚洲精品精华液| 久久婷婷国产综合国色天香| 欧美久久久久久久久| 欧美视频日韩视频| 91搞黄在线观看| 91久久精品一区二区三区| 北岛玲一区二区三区四区| 国产成人在线免费| 国产精品综合一区二区| 韩国v欧美v亚洲v日本v| 欧美aⅴ一区二区三区视频| 亚洲超碰精品一区二区| 亚洲第一主播视频| 日韩综合一区二区| 日韩和欧美一区二区三区| 亚洲国产另类av| 丝袜亚洲另类丝袜在线| 偷窥少妇高潮呻吟av久久免费| 亚洲国产日韩精品| 亚洲第一av色| 日韩激情在线观看| 九九视频精品免费| 国产不卡视频在线播放| 高清国产一区二区| 一本大道久久a久久综合婷婷| 色天天综合色天天久久| 欧美色手机在线观看| 日韩欧美一二三| 久久亚洲精精品中文字幕早川悠里| 久久久噜噜噜久噜久久综合| 国产精品毛片久久久久久| 一区精品在线播放| 午夜婷婷国产麻豆精品| 老司机午夜精品| 成人久久18免费网站麻豆| 在线一区二区三区| 91精品一区二区三区久久久久久 | 波多野洁衣一区| 在线视频欧美精品| 91精品国产一区二区| 久久精品欧美一区二区三区麻豆| 欧美国产一区在线| 一区二区三区免费网站| 日本午夜精品一区二区三区电影| 国产成人综合亚洲91猫咪| 在线亚洲+欧美+日本专区| 日韩欧美中文字幕精品| 国产精品女同互慰在线看| 一二三四区精品视频| 国产一区欧美一区| 色美美综合视频| 日韩精品一区二区在线| 日韩一区在线看| 日韩国产精品大片| 北岛玲一区二区三区四区| 欧美二区三区的天堂| 中文字幕第一区| 青娱乐精品视频在线| 不卡的看片网站| 欧美一区二区三区在线看| 国产精品久久二区二区| 日韩国产精品91| 99精品视频免费在线观看| 精品少妇一区二区三区日产乱码| 亚洲品质自拍视频网站| 精品一区二区三区在线播放| 色婷婷久久99综合精品jk白丝| 精品国产乱码91久久久久久网站| 亚洲色图欧洲色图婷婷| 麻豆一区二区三| 欧美日韩亚洲国产综合| 中文字幕一区二区三中文字幕| 久久国产免费看| 欧美日韩亚州综合| 一区二区在线看| 成人激情图片网| 精品国产乱码久久| 日本不卡在线视频| 欧美三级韩国三级日本一级| 亚洲图片另类小说| 丁香桃色午夜亚洲一区二区三区| 精品少妇一区二区三区在线播放| 亚洲成人在线观看视频| 色婷婷精品大视频在线蜜桃视频 | 亚洲高清视频在线| 色悠悠久久综合| 中文字幕在线视频一区| 韩国av一区二区三区四区| 日韩一区二区三区免费看| 一区二区在线观看免费视频播放| www.在线成人| 日本一区二区三区视频视频| 国产黄人亚洲片| 国产日韩欧美激情| 国产传媒日韩欧美成人| 国产日韩欧美高清| 成人国产精品免费网站| 国产精品国产自产拍在线| 岛国精品在线观看|