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

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

?? sed.c

?? 一個微型的tcp棧實現
?? C
字號:
/* 
 * Ethernet Driver.
 * A Very Simple set of ethernet driver primitives.  The ethernet (3com Mbus)
 * interface is controlled by busy-waiting, the application is handed the
 * location of on-board packet buffers, and allowed to fill in the
 * transmit buffer directly.  The interface is entirely blocking.
 * 
 * Written March, 1986 by Geoffrey Cooper
 *
 * Copyright (C) 1986, IMAGEN Corporation
 *  "This code may be duplicated in whole or in part provided that [1] there
 *   is no commercial gain involved in the duplication, and [2] that this
 *   copyright notice is preserved on all copies.  Any other duplication
 *   requires written notice of the author (Geoffrey H. Cooper)."
 * 
 * Primitives:
 *  sed_Init()  -- Initialize the package
 *  sed_FormatPacket( destEAddr ) => location of transmit buffer
 *  sed_Send( pkLength ) -- send the packet that is in the transmit buffer
 *  sed_Receive( recBufLocation ) -- enable receiving packets.
 *  sed_IsPacket() => location of packet in receive buffer
 *  sed_CheckPacket( recBufLocation, expectedType )
 *
 * Global Variables:
 *  sed_lclEthAddr -- Ethernet address of this host.
 *  sed_ethBcastAddr -- Ethernet broadcast address.
 */

#include "tinytcp.h"
#include "sed.h"

#define en10pages        ((en10size) >> pageshift)

octet *sed_va;                          /* virtual address of ethernet card */
eth_HwAddress sed_lclEthAddr;           /* local ethernet address */
eth_HwAddress sed_ethBcastAddr;         /* Ethernet broadcast address */
BOOL sed_respondARPreq;                 /* controls responses to ARP req's */
char bufAinUse, bufBinUse;              /* tell whether bufs are in use */

/* 
 *  Initialize the Ethernet Interface, and this package.  Enable input on
 * both buffers.
 */
sed_Init()
{
    int recState;
    register i, j;

    recState = 7;                       /* == mine + broad - errors */

    /* Map the Ethernet Interface in, and initialize sed_va */
    sed_va = (octet *)SED3CVA;        /* our virtual addr */

    /* Map memory for 3Com board (must be 8k boundary) */
    /* INSERT CODE HERE */
    map_ethernet_board();

    /* Reset the Ethernet controller */
    MECSR(sed_va) = RESET;
    for (i=0; i<10; i++);           /* delay a bit... */

    /* just copy on-board ROM to on-board RAM, to use std. address */
    Move(MEAROM(sed_va), sed_lclEthAddr, 6);
    Move(sed_lclEthAddr, MEARAM(sed_va), 6);
    
    MECSR(sed_va) |= AMSW;        /* and tell board we did it */

    /*
     * and initialize the exported variable which gives the Eth broadcast
     * address, for everyone else to use. 
     */
    for (i=0; i<3; i++) sed_ethBcastAddr[i] = 0xFFFF;
    
    /* accept packets addressed for us and broadcast packets */

    MECSR(sed_va) = (MECSR(sed_va)&~PA) | recState;

    /* declare both buffers in use... */
    bufAinUse = bufBinUse = TRUE;

}

/* 
 * Format an ethernet header in the transmit buffer, and say where it is.
 * Note that because of the way the 3Com interface works, we need to know
 * how long the packet is before we know where to put it.  The solution is
 * that we format the packet at the BEGINNING of the transmit buffer, and
 * later copy it (carefully) to where it belongs.  Another hack would be
 * to be inefficient about the size of the packet to be sent (always send
 * a larger ethernet packet than you need to, but copying should be ok for
 * now.
 */
octet *
sed_FormatPacket( destEAddr, ethType )
        register octet *destEAddr;
{
    register octet *xMitBuf;
    
    xMitBuf = &((octet *)MEXBUF(sed_va))[-0x800];
    Move( destEAddr, xMitBuf, 6 );
    Move( sed_lclEthAddr, xMitBuf + 6, 6 );
    *((short *)(xMitBuf+12)) = ethType;
    return ( xMitBuf+14 );
}

/*
 *  Send a packet out over the ethernet.  The packet is sitting at the
 * beginning of the transmit buffer.  The routine returns when the
 * packet has been successfully sent.
 */
sed_Send( pkLengthInOctets )
    register int pkLengthInOctets;
{
    register octet *fromO, *toO;
    register pkLength;
    register csr;

    pkLengthInOctets += 14;             /* account for Ethernet header */
    pkLengthInOctets = (pkLengthInOctets + 1) & (~1);

    if (pkLengthInOctets < E10P_MIN) 
        pkLengthInOctets = E10P_MIN; /* and min. ethernet len */

    /*  and copy the packet where it belongs */
    pkLength = pkLengthInOctets;
    fromO = &((octet *)MEXBUF(sed_va))[-0x800] + pkLength;
    toO = ((octet *)MEXBUF(sed_va));

    while ( pkLength-- ) *--toO = *--fromO;
    
    /* send the packet */
    
    MEXHDR(sed_va) = 2048 - pkLengthInOctets;
    MECSR(sed_va) |= TBSW;

    /* and wait until it has really been sent. */

    for (pkLength=0; pkLength < 15; pkLength++) {
        while ( (! ((csr = MECSR(sed_va)) & JAM)) && (csr & TBSW) )
            ;
        if (csr & JAM ) {
            /* Ethernet Collision detected... */
#ifdef DEBUG
            printf("sed: JAM: MECSR=%x\n", csr);
#endif
            MEBACK(sed_va) = clock_ValueRough();
            MECSR(sed_va) |= JAM;
        } else break;
    }
    if ( pkLength == 15 ) SysBug("Go and Buy a New Ethernet Interface.");

    /*  else we sent the packet ok. */
}

/* 
 *  Enable the Ethernet interface to receive packets from the network.  If
 * the argument is zero, enable both buffers.  If the argument is nonzero,
 * take it as the address of the buffer to be enabled.
 */
sed_Receive( recBufLocation )
    octet *recBufLocation;
{
    word enables = 0;

    if (recBufLocation == 0) {
        bufAinUse = FALSE;
        bufBinUse = FALSE;
        enables = (ABSW | BBSW);
    }
    recBufLocation -= 16;
    if (recBufLocation == ((octet *)MEAHDR(sed_va))) {
        bufAinUse = FALSE;
        enables = ABSW;
        }
    if (recBufLocation == ((octet *)MEBHDR(sed_va))) {
        bufBinUse = FALSE;
        enables = BBSW;
    }

    MECSR (sed_va) |= enables;
}

/* 
 * Test for the arrival of a packet on the Ethernet interface.  The packet may
 * arrive in either buffer A or buffer B; the location of the packet is
 * returned.  If no packet is returned withing 'timeout' milliseconds,
 * then the routine returns zero.
 * 
 * Note: ignores ethernet errors.  may occasionally return something
 * which was received in error.
 */

octet *
sed_IsPacket()
{
    register oldStatus;
    register octet *pb;
    
    pb = 0;
    if ( ! bufAinUse && (MECSR(sed_va)&ABSW) == 0 ) 
        pb = (octet *)MEAHDR(sed_va);
    if ( ! pb && ! bufBinUse && (MECSR(sed_va)&BBSW) == 0 )
        pb = (octet *)MEBHDR(sed_va);

    if ( pb ) {
        if ( ((octet *)pb) == ((octet *)MEAHDR(sed_va)) ) bufAinUse = 1;
        else bufBinUse = 1;
        pb += 16;                       /* get past the ethernet header */
    }

    return ( pb );
}

/* 
 *  Check to make sure that the packet that you received was the one that
 * you expected to get.
 */
sed_CheckPacket( recBufLocation, expectedType )
    word *recBufLocation;
    word expectedType;
{
    register recHeader = recBufLocation[-8];
    if ( (recHeader&R_ERROR) != 0 ||
         (recHeader&R_OFFSET) < E10P_MIN ) {
         return ( -1 );
    }
    if ( recBufLocation[-1] != expectedType ) {
        return ( 0 );
    }
    return (1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
678五月天丁香亚洲综合网| 精品少妇一区二区三区视频免付费| 欧美系列亚洲系列| 日韩欧美一区中文| 中文字幕欧美日韩一区| 偷拍亚洲欧洲综合| 成人h动漫精品| 精品日韩成人av| 亚洲乱码国产乱码精品精98午夜 | 樱桃视频在线观看一区| 激情综合五月婷婷| 欧美日韩不卡在线| ...av二区三区久久精品| 国产乱子伦一区二区三区国色天香| 欧美日韩精品一区视频| 亚洲欧美激情视频在线观看一区二区三区 | 2020国产精品| 亚洲成a人在线观看| 一本一道久久a久久精品综合蜜臀| 久久久国产精华| 精彩视频一区二区三区| 日韩色视频在线观看| 五月天网站亚洲| 色婷婷激情综合| 久久久久久毛片| 国产伦精一区二区三区| 久久久久久电影| 国产黄色精品网站| 国产三级欧美三级日产三级99| 丝袜亚洲精品中文字幕一区| 欧美日韩电影一区| 日本欧美一区二区在线观看| 欧美精品vⅰdeose4hd| 天天色天天爱天天射综合| 欧美日韩日日夜夜| 日本人妖一区二区| 精品欧美乱码久久久久久| 韩国av一区二区三区| 久久久久国产精品厨房| 国产成人午夜视频| 国产精品第五页| 在线观看日韩电影| 亚洲bt欧美bt精品| 日韩欧美高清一区| 激情欧美一区二区| 国产精品乱人伦| 91精品办公室少妇高潮对白| 亚洲123区在线观看| 日韩欧美一区二区在线视频| 开心九九激情九九欧美日韩精美视频电影 | 日韩美女在线视频| 国产乱码精品1区2区3区| 中文字幕不卡在线| 欧美午夜精品久久久| 免费一区二区视频| 亚洲国产经典视频| 欧美日韩一二区| 国产在线一区观看| 国产精品对白交换视频| 欧美猛男超大videosgay| 久久99精品久久久久久国产越南 | 亚洲成av人片观看| 欧美v日韩v国产v| 91色porny蝌蚪| 久久精品国产精品亚洲红杏| 中文字幕一区在线观看视频| 欧美女孩性生活视频| 国产精品原创巨作av| 一区二区三区久久| 久久人人超碰精品| 欧美三级蜜桃2在线观看| 国产在线视视频有精品| 亚洲欧洲综合另类| 欧美一区二区三区婷婷月色| 国产白丝网站精品污在线入口| 一区二区在线观看av| 精品久久久久99| 欧美主播一区二区三区| 青青草成人在线观看| 国产精品沙发午睡系列990531| 欧美日韩你懂的| 99re在线视频这里只有精品| 日本欧美一区二区| 国产精品对白交换视频| 日韩欧美电影一二三| 成人免费视频app| 精品一区二区免费视频| 亚洲成人福利片| 亚洲欧洲无码一区二区三区| 久久综合色天天久久综合图片| 色呦呦日韩精品| 成人看片黄a免费看在线| 免费看欧美美女黄的网站| 亚洲免费看黄网站| 日本一区二区三区免费乱视频| 91.xcao| 在线观看网站黄不卡| 99这里都是精品| 国产一区二区剧情av在线| 性做久久久久久免费观看欧美| 亚洲日本一区二区| 欧美激情资源网| 久久麻豆一区二区| 欧美日韩高清在线| 色狠狠一区二区三区香蕉| 99re热这里只有精品免费视频| 国产一区二区三区高清播放| 日韩精品一级二级 | 成人av电影在线| 国产乱码精品一区二区三区av | 欧美一区二区观看视频| 欧美性猛片aaaaaaa做受| 色综合一区二区| 91国在线观看| 欧美色爱综合网| 欧美日韩不卡一区二区| 宅男噜噜噜66一区二区66| 欧美一区永久视频免费观看| 欧美日韩三级一区二区| 欧美日产在线观看| 日韩一卡二卡三卡国产欧美| 7777精品伊人久久久大香线蕉的| 97久久超碰国产精品电影| 九九精品一区二区| 理论片日本一区| 国产高清久久久久| 久久er99精品| 国产激情偷乱视频一区二区三区 | 国产精品视频观看| 中文字幕中文乱码欧美一区二区| 亚洲三级视频在线观看| 亚洲综合在线观看视频| 视频一区二区中文字幕| 国产主播一区二区三区| 成av人片一区二区| 欧美色倩网站大全免费| 日韩一区二区在线观看| 国产女人aaa级久久久级| 亚洲黄色小说网站| 捆绑调教美女网站视频一区| 大白屁股一区二区视频| 欧美亚洲日本一区| 久久午夜电影网| 亚洲色图20p| 麻豆精品精品国产自在97香蕉| 国产精品18久久久久| 91麻豆免费观看| 日韩精品中文字幕一区| 亚洲欧洲av一区二区三区久久| 亚洲狠狠爱一区二区三区| 韩国精品一区二区| 91亚洲资源网| 久久综合久久鬼色| 一区二区免费视频| 国产福利一区二区三区| 欧美日韩一级片网站| 国产精品色婷婷| 美国十次综合导航| 色婷婷综合五月| 国产视频911| 日日夜夜免费精品| 91亚洲男人天堂| 久久久青草青青国产亚洲免观| 亚洲一区在线视频| 成人亚洲一区二区一| 日韩一区二区精品| 亚洲一区二区在线观看视频| 国产一区啦啦啦在线观看| 欧美日韩国产一级片| 亚洲视频中文字幕| 国产91精品露脸国语对白| 欧美一三区三区四区免费在线看 | 欧美中文字幕一二三区视频| 久久精品亚洲精品国产欧美kt∨| 亚洲第一电影网| 99精品久久只有精品| 久久久久国产精品免费免费搜索| 日韩1区2区3区| 欧美色视频在线观看| 亚洲精选在线视频| 不卡电影一区二区三区| 久久伊人中文字幕| 极品少妇xxxx偷拍精品少妇| 欧美一区二区在线视频| 亚洲成人激情综合网| 欧美性猛片aaaaaaa做受| 亚洲免费在线观看| 色一情一乱一乱一91av| 中文字幕在线一区二区三区| 国产999精品久久久久久| 久久中文娱乐网| 国产最新精品精品你懂的| 精品粉嫩aⅴ一区二区三区四区| 日韩国产一区二| 91精品婷婷国产综合久久竹菊| 无码av中文一区二区三区桃花岛| 欧美伊人精品成人久久综合97| 一区二区三区四区中文字幕| 在线观看不卡一区| 亚洲成人黄色影院|