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

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

?? dhcp_prot.c

?? Mavell 無線模塊原廠IC AP32源代碼。DHCP客戶端與服務端源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:

    if (ioctl(s, SIOCADDRT, &route))
    { /* add route */
        if (errno != EEXIST)
        {
            perror("SIOCADDRT 3");
            return false;
        }
    }

    close(s);

    return true;
}


// ------------------------------------------------------------------------
// DHCP retransmission timeouts and number of tries
//
// To work better with simulated failures (or real ones!) so that the rest
// of the system is tested, rather than DHCP renewal failures pulling
// everything down, we try a little more zealously than the RFC suggests.

static unsigned char timeout_random = 0;

struct timeout_state
{
    unsigned int secs;
    int countdown;
};

static inline void reset_timeout( struct timeval *ptv, struct timeout_state *pstate )
{
    timeout_random++;
    pstate->countdown = 4; // initial fast retries
    pstate->secs = 3 + (timeout_random & 3);
    ptv->tv_sec = 0;
    ptv->tv_usec = 65536 * (2 + (timeout_random & 3)); // 0.1 - 0.3S, about
}

static inline int next_timeout( struct timeval *ptv, struct timeout_state *pstate )
{
    if ( 0 < pstate->countdown-- )
        return true;
    if ( 0 == ptv->tv_sec )
        ptv->tv_sec = pstate->secs;
    else
    {
        timeout_random++;
        pstate->secs = ptv->tv_sec * 2 - 2 + (timeout_random & 3);
        pstate->countdown = 2; // later fast retries
        ptv->tv_sec = 0;
    }
    return (pstate->secs < DHCP_TIMEOUT_IN_SEC); // If longer, too many tries...
}

// ------------------------------------------------------------------------
// Lease expiry and alarms to notify it

static cyg_alarm_t alarm_function;

static void alarm_function(cyg_handle_t alarm, cyg_addrword_t data)
{
    struct dhcp_lease *lease = (struct dhcp_lease *)data;
    lease->which |= lease->next;
    if ( lease->needs_attention )
        cyg_semaphore_post( lease->needs_attention );

    // Step the lease on into its next state of being alarmed ;-)
    if ( lease->next & DHCP_LEASE_EX )
    {
        cyg_alarm_disable( alarm );
    }
    else if ( lease->next & DHCP_LEASE_T2 )
    {
        lease->next = DHCP_LEASE_EX;
        cyg_alarm_initialize( lease->alarm, lease->expiry, 0 );
        cyg_alarm_enable( lease->alarm );
    }
    else if ( lease->next & DHCP_LEASE_T1 )
    {
        lease->next = DHCP_LEASE_T2;
        cyg_alarm_initialize( lease->alarm, lease->t2, 0 );
        cyg_alarm_enable( lease->alarm );
    }
}

static inline void no_lease( struct dhcp_lease *lease )
{
    if ( lease->alarm )
    {
        // Already set: delete this.
        cyg_alarm_disable( lease->alarm );
        cyg_alarm_delete( lease->alarm );
        lease->alarm = 0;
    }
}

static inline void new_lease( struct bootp *bootp, struct dhcp_lease *lease )
{
    cyg_tick_count_t now = cyg_current_time();
    cyg_tick_count_t then;
    cyg_uint32 tag = 0;
    cyg_uint32 expiry_then;
    cyg_resolution_t resolution =
        cyg_clock_get_resolution(cyg_real_time_clock());
    cyg_handle_t h;
    unsigned int length;

    // Silence any jabbering from past lease on this interface
    no_lease( lease );
    lease->which = lease->next = 0;
    cyg_clock_to_counter(cyg_real_time_clock(), &h);
    cyg_alarm_create( h, alarm_function, (cyg_addrword_t)lease,
                      &lease->alarm, &lease->alarm_obj );

    // extract the lease time and scale it &c to now.
    length = sizeof(tag);
    if (!get_bootp_option( bootp, TAG_DHCP_LEASE_TIME, &tag ))
        tag = 0xffffffff;

    if ( 0xffffffff == tag )
    {
        lease->expiry = 0xffffffffffffffff;
        lease->t2 = 0xffffffffffffffff;
        lease->t1 = 0xffffffffffffffff;
        return ; // it's an infinite lease, hurrah!
    }

    then = (cyg_uint64)(ntohl(tag));
    expiry_then = then;

    then *= 1000000000; // into nS - we know there is room in a tick_count_t
    then = (then / resolution.dividend) * resolution.divisor; // into system ticks
    lease->expiry = now + then;
    length = sizeof(tag);
    if (get_bootp_option( bootp, TAG_DHCP_REBIND_TIME, &tag ))
        then = (cyg_uint64)(ntohl(tag));
    else
        then = expiry_then - expiry_then / 4;
    then *= 1000000000; // into nS - we know there is room in a tick_count_t
    then = (then / resolution.dividend) * resolution.divisor; // into system ticks
    lease->t2 = now + then;

    length = sizeof(tag);
    if (get_bootp_option( bootp, TAG_DHCP_RENEWAL_TIME, &tag ))
        then = (cyg_uint64)(ntohl(tag));
    else
        then = expiry_then / 2;
    then *= 1000000000; // into nS - we know there is room in a tick_count_t
    then = (then / resolution.dividend) * resolution.divisor; // into system ticks
    lease->t1 = now + then;

#if 0 // for testing this mechanism

    lease->expiry = now + 5000; // 1000 here makes for failure in the DHCP test
    lease->t2 = now + 3500;
    lease->t1 = now + 2500;
#endif

#ifdef CYGDBG_NET_DHCP_CHATTER

    diag_printf("new_lease:\n");
    diag_printf("  expiry = %d\n", lease->expiry);
    diag_printf("      t1 = %d\n", lease->t1);
    diag_printf("      t2 = %d\n", lease->t2);
#endif

    lease->next = DHCP_LEASE_T1;

    cyg_alarm_initialize( lease->alarm, lease->t1, 0 );
    cyg_alarm_enable( lease->alarm );
}

// ------------------------------------------------------------------------
// Set all the tags we want to use when sending a packet.
// This has expanded to a large, explicit set to interwork better
// with a variety of DHCP servers.

static void set_default_dhcp_tags( struct bootp *xmit )
{
    // Explicitly request full set of params that are default for LINUX
    // dhcp servers, but not default for others.  This is rather arbitrary,
    // but it preserves behaviour for people using those servers.
    // Perhaps configury of this set will be needed in future?
    //
    // Here's the set:
    static cyg_uint8 req_list[] = {
#ifdef CYGOPT_NET_DHCP_PARM_REQ_LIST_REPLACE
                                      CYGOPT_NET_DHCP_PARM_REQ_LIST_REPLACE ,
#else
                                      TAG_DHCP_SERVER_ID ,      //     DHCP server id: 10.16.19.66
                                      TAG_DHCP_LEASE_TIME ,      //     DHCP time 51: 60
                                      TAG_DHCP_RENEWAL_TIME ,      //     DHCP time 58: 30
                                      TAG_DHCP_REBIND_TIME ,      //     DHCP time 59: 52
                                      TAG_SUBNET_MASK ,      //     subnet mask: 255.255.255.0
                                      //        TAG_GATEWAY           ,     //     gateway: 10.16.19.66
                                      TAG_DOMAIN_SERVER ,      //     domain server: 10.16.19.66
                                      TAG_DOMAIN_NAME ,      //     domain name: hmt10.cambridge.redhat.com
                                      TAG_IP_BROADCAST ,      //     IP broadcast: 10.16.19.255
#endif
#ifdef CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL
                                      CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL ,
#endif
                                  };

    if ( req_list[0] ) // So that one may easily turn it all off by configury
        set_variable_tag( xmit, TAG_DHCP_PARM_REQ_LIST,
                          &req_list[0], sizeof( req_list ) );
#ifdef DHCP_MAGIC_OPTION
    set_variable_tag( xmit, 232, DHCP_MAGIC_OPTION, 7 );
#endif
    // Explicitly specify our max message size.
#ifndef BP_MAXPKTSZ
#define BP_MAXPKTSZ 364
#endif
    set_fixed_tag( xmit, TAG_DHCP_MAX_MSGSZ, BP_MAXPKTSZ, 2 );

}

// ------------------------------------------------------------------------
// the DHCP state machine - this does all the work

int
do_dhcp(const char *intf, struct bootp *res,
        cyg_uint8 *pstate, struct dhcp_lease *lease)
{
    struct ifreq ifr;
    struct sockaddr_in cli_addr, broadcast_addr, server_addr, rx_addr;
    int s, addrlen;
    int one = 1;
    unsigned char mincookie[] = {99, 130, 83, 99, 255} ;
    struct timeval tv;
    struct timeout_state timeout_scratch;
    cyg_uint8 oldstate = *pstate;
    cyg_uint8 msgtype = 0, seen_bootp_reply = 0;
    unsigned int length;

    cyg_uint32 xid;

#define CHECK_XID() (  /* and other details */                                  \
    received->bp_xid   != xid            || /* not the same transaction */      \
    received->bp_htype != xmit->bp_htype || /* not the same ESA type    */      \
    received->bp_hlen  != xmit->bp_hlen  || /* not the same length      */      \
    bcmp( &received->bp_chaddr, &xmit->bp_chaddr, xmit->bp_hlen )               \
    )

    // IMPORTANT: xmit is the same as res throughout this; *received is a
    // scratch buffer for reception; its contents are always copied to res
    // when we are happy with them.  So we always transmit from the
    // existing state.
    struct bootp rx_local;
    struct bootp *received = &rx_local;
    struct bootp *xmit = res;
    struct bootp xmit2;
    int xlen;

    // First, get a socket on the interface in question.  But Zeroth, if
    // needs be, bring it to the half-up broadcast only state if needs be.

    if ( DHCPSTATE_INIT == oldstate
            || DHCPSTATE_FAILED == oldstate
            || 0 == oldstate )
    {
        // either explicit init state or the beginning of time or retry
        if ( ! bring_half_up( intf, &ifr ) )
            return false;

        *pstate = DHCPSTATE_INIT;
    }

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

    if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)))
    {
        perror("setsockopt");
        return false;
    }

    memset((char *) &cli_addr, 0, sizeof(cli_addr));
    cli_addr.sin_family = AF_INET;
    cli_addr.sin_len = sizeof(cli_addr);
    cli_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    cli_addr.sin_port = htons(IPPORT_BOOTPC);

    memset((char *) &broadcast_addr, 0, sizeof(broadcast_addr));
    broadcast_addr.sin_family = AF_INET;
    broadcast_addr.sin_len = sizeof(broadcast_addr);
    broadcast_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    broadcast_addr.sin_port = htons(IPPORT_BOOTPS);

    memset((char *) &server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_len = sizeof(server_addr);
    server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); // overwrite later
    server_addr.sin_port = htons(IPPORT_BOOTPS);

    if (bind(s, (struct sockaddr *) &cli_addr, sizeof(cli_addr)) < 0)
    {
        perror("bind error");
        return false;
    }
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
    {
        perror("setsockopt SO_REUSEADDR");
        return false;
    }
    if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)))
    {
        perror("setsockopt SO_REUSEPORT");
        return false;
    }

    // Now, we can launch into the DHCP state machine.  I think this will
    // be the neatest way to do it; it returns from within the switch arms
    // when all is well, or utterly failed.

    reset_timeout( &tv, &timeout_scratch );

    // Choose a new XID: first get the ESA as a basis:
    strcpy(&ifr.ifr_name[0], intf);
    if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)
    {
        perror("SIOCGIFHWADDR 2");
        return false;
    }

    // Choose from scratch depending on ifr_hwaddr...[]
    xid = ifr.ifr_hwaddr.sa_data[5];
    xid |= (ifr.ifr_hwaddr.sa_data[4]) << 8;
    xid |= (ifr.ifr_hwaddr.sa_data[3]) << 16;
    xid |= (ifr.ifr_hwaddr.sa_data[2]) << 24;
    xid ^= (arc4random() & 0xffff0000);

    // Avoid adjacent ESAs colliding by increment
#define NEW_XID(_xid) CYG_MACRO_START (_xid)+= 0x10000; CYG_MACRO_END

    while ( 1 )
    {

        // If we are active rather than in the process of shutting down,
        // check for any lease expiry every time round, so that alarms
        // *can* change the course of events even when already renewing,
        // for example.
        if ( DHCPSTATE_DO_RELEASE != *pstate
                && DHCPSTATE_NOTBOUND != *pstate
                && DHCPSTATE_FAILED != *pstate )
        {
            cyg_uint8 lease_state;

            cyg_scheduler_lock();
            lease_state = lease->which;
            lease->which = 0; // flag that we have noticed it
            cyg_scheduler_unlock();

            if ( lease_state & DHCP_LEASE_EX )
            {
                // then the lease has expired completely!
                *pstate = DHCPSTATE_NOTBOUND;
            }
            else if ( lease_state & DHCP_LEASE_T2 )
            {
                // Time to renew
                reset_timeout( &tv, &timeout_scratch ); // next conversation
                *pstate = DHCPSTATE_REBINDING;
            }
            else if ( lease_state & DHCP_LEASE_T1 )
            {
                // Time to renew

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产aⅴ综合色| 91精品国产色综合久久ai换脸 | 欧美剧情电影在线观看完整版免费励志电影| 91香蕉视频污在线| 日韩欧美在线不卡| 亚洲乱码国产乱码精品精98午夜 | 国产自产视频一区二区三区| 成人天堂资源www在线| 日韩一卡二卡三卡国产欧美| 亚洲欧洲精品天堂一级| 国产一区二区免费看| 91精品国产综合久久婷婷香蕉| 亚洲欧洲精品成人久久奇米网| 国产乱人伦偷精品视频不卡| 欧美挠脚心视频网站| 亚洲理论在线观看| 成人激情电影免费在线观看| 亚洲精品一区二区精华| 日本免费新一区视频| 欧美系列日韩一区| 亚洲精品老司机| 99视频热这里只有精品免费| 国产女人aaa级久久久级| 国产一区二区女| 欧美xxxx老人做受| 麻豆91精品视频| 51精品秘密在线观看| 三级在线观看一区二区| 欧美日韩国产高清一区二区三区 | 热久久国产精品| 91精品国产综合久久久久久 | 国产精品国产三级国产aⅴ入口| 久久99精品国产麻豆婷婷 | 蜜桃一区二区三区在线观看| 欧美网站一区二区| 亚洲3atv精品一区二区三区| 欧美网站大全在线观看| 亚洲一区在线观看视频| 欧美浪妇xxxx高跟鞋交| 日韩高清不卡一区二区| 日韩精品一区二区在线| 国产又黄又大久久| 国产精品少妇自拍| 色天天综合色天天久久| 亚洲精品视频一区二区| 欧美日韩国产影片| 久久99国产精品久久99| 国产偷v国产偷v亚洲高清| 国产·精品毛片| 亚洲乱码国产乱码精品精小说| 欧美亚洲综合在线| 久久精品99久久久| 中文字幕不卡的av| 色婷婷综合久色| 日韩va亚洲va欧美va久久| 精品少妇一区二区三区在线播放 | 久久久午夜精品理论片中文字幕| 国产麻豆日韩欧美久久| 亚洲婷婷综合久久一本伊一区| 欧美亚日韩国产aⅴ精品中极品| 天天影视涩香欲综合网| 久久这里只有精品首页| 91麻豆国产在线观看| 日韩激情视频在线观看| 久久久91精品国产一区二区三区| 97精品国产97久久久久久久久久久久| 亚洲天堂2016| 欧美刺激午夜性久久久久久久| 国产东北露脸精品视频| 亚洲国产aⅴ天堂久久| 久久亚洲一区二区三区明星换脸| av电影天堂一区二区在线| 石原莉奈在线亚洲二区| 国产精品女同一区二区三区| 欧美日韩一区成人| 国产成人99久久亚洲综合精品| 亚洲一区二区高清| 国产精品九色蝌蚪自拍| 在线观看91精品国产麻豆| 成人禁用看黄a在线| 美国三级日本三级久久99 | 日本欧美在线观看| 亚洲天堂网中文字| xnxx国产精品| 欧美疯狂做受xxxx富婆| 成人精品视频网站| 国产麻豆日韩欧美久久| 午夜精品福利一区二区三区av | a美女胸又www黄视频久久| 美女任你摸久久| 亚洲成人www| 亚洲欧美日韩国产综合| 国产亚洲人成网站| 日韩免费高清av| 欧美图片一区二区三区| 97精品久久久午夜一区二区三区 | 色噜噜狠狠色综合中国| 国产精品一区二区你懂的| 日韩精品欧美精品| 亚洲午夜免费电影| 一区二区三区欧美日韩| 国产精品色哟哟网站| 久久五月婷婷丁香社区| 日韩你懂的在线播放| 91精品国产综合久久小美女| 欧美图区在线视频| 欧美在线播放高清精品| 色婷婷亚洲一区二区三区| 91免费版在线看| 99免费精品在线| 成人av午夜电影| 成人免费看黄yyy456| 成人高清视频在线| 91麻豆产精品久久久久久| 99re视频这里只有精品| 91小视频免费看| 色欧美日韩亚洲| 欧美日韩视频在线第一区| 欧美视频一区在线观看| 欧美精品一卡两卡| 欧美成人精品1314www| 日韩精品一区二区三区中文精品| 日韩精品一区二区三区在线观看| 日韩三级视频中文字幕| 精品福利在线导航| 国产婷婷色一区二区三区在线| 欧美激情综合网| 国产精品久久一卡二卡| 亚洲女与黑人做爰| 丝瓜av网站精品一区二区| 美女视频黄 久久| 国产91精品免费| 91美女在线看| 欧美一区二区福利在线| 久久人人超碰精品| 国产精品黄色在线观看| 一区二区三区欧美| 精品一区二区三区不卡| 国产精品一区二区免费不卡| av在线免费不卡| 欧美顶级少妇做爰| 国产丝袜在线精品| 亚洲黄色性网站| 麻豆极品一区二区三区| 成人午夜精品一区二区三区| 日本精品一区二区三区高清| 日韩一区和二区| 国产欧美日韩在线| 亚洲图片欧美视频| 国产黑丝在线一区二区三区| 91天堂素人约啪| 日韩亚洲欧美中文三级| 国产精品剧情在线亚洲| 青青青爽久久午夜综合久久午夜| 成人免费毛片app| 欧美精品久久久久久久多人混战| 国产欧美视频在线观看| 日韩精彩视频在线观看| caoporm超碰国产精品| 日韩色视频在线观看| 亚洲精品videosex极品| 国产一区二区网址| 欧美日韩一区二区在线观看| 国产欧美日本一区视频| 天天做天天摸天天爽国产一区| 高清国产一区二区三区| 欧美日韩三级视频| 国产精品女人毛片| 麻豆精品精品国产自在97香蕉 | 欧美一级欧美一级在线播放| 亚洲国产精品激情在线观看 | 欧美一区二区三区在线视频| 国产精品美女久久久久aⅴ国产馆| 日韩影院在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品三级在线观看| 蜜臀久久99精品久久久画质超高清| 97se狠狠狠综合亚洲狠狠| 久久青草欧美一区二区三区| 视频在线在亚洲| 欧美伊人精品成人久久综合97 | 91影院在线免费观看| 久久久亚洲精品石原莉奈| 久久精品99国产精品日本| 欧美日韩中文国产| 亚洲美女精品一区| 91亚洲精品一区二区乱码| 国产欧美日韩三区| 国产在线精品一区二区三区不卡| 91精品国产aⅴ一区二区| 亚洲成a人在线观看| 欧美亚洲国产一区在线观看网站 | 久久久久久久久久久久久夜| 精品亚洲成a人| 精品国产亚洲在线| 韩国av一区二区| 久久久久久久综合狠狠综合| 国产一区二区免费看| 久久久精品免费免费| 成人一区二区在线观看|