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

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

?? tftputil.c

?? 在ARM7和UC/OSII的平臺上實現了GPS自動報站的功能,涉及GPS模塊LEA_4S的驅動,位置速尋算法,語音芯片ISD4004的錄放音驅動,LED頁面管理等等.從啟動代碼到操作系統的移植以及到業
?? C
?? 第 1 頁 / 共 2 頁
字號:
       cn->callback(TFC_FOREIGN, cn, errtxt);
   USE_ARG(len);
}

/* tfsndack() - build and send ack for latest block */

int
tfsndack(struct tfconn *cn)
{
struct tfack * pack;
int e;

   tftp_udpbuffer(cn, sizeof(struct tfack) );
   if(cn->tf_outbuf.data == NULL)
      return ENP_NOBUFFER;
   pack = (struct tfack *)(cn->tf_outbuf.data);

   cn->tf_lastlen = sizeof(struct tfack);
   pack->tf_op = TF_ACK;   /* in local endian, tf_write will fix */
   pack->tf_block = cn->tf_expected;
   e = tf_write(cn, sizeof(struct tfack));   /* send the ack */
   return e;
}

/* tf_write() - write (send) a tftp packet to the other host */

int
tf_write(struct tfconn * cn, unsigned len)
{
struct tfack * packet;

   packet = (struct tfack *)(cn->tf_outbuf.data);
   if(packet == NULL)
   {
      dtrap("tftputil 2\n"); /* prog error */
      return ENP_NOBUFFER;
   }
   if(packet->tf_op != TF_RRQ && packet->tf_op != TF_WRQ)
   {
      packet->tf_block = htons(packet->tf_block);
      cn->tf_tries = TFTPTRIES;
   }      
   else 
      cn->tf_tries = REQTRIES;

   packet->tf_op = htons(packet->tf_op);   /* convert op to net format */

   cn->tf_lastlen = len;
   cn->tf_snt++;
   cn->tf_sent = cticks;
   cn->tf_tick = cticks + cn->tf_rt;   /* set time to retry */
   cn->tf_NR = 1;

   return(tftp_udpsend(cn, cn->tf_outbuf.data, len));
}


/* Send a TFTP data block. */

int
tfsndata(struct tfconn *cn)
{
struct tfdata * tfdata;
int bytes = 0;   /* bytes read from file */
int err;

   tftp_udpbuffer(cn, NORMLEN + sizeof(struct tfdata) );
   if(cn->tf_outbuf.data == NULL)
      return ENP_NOBUFFER;
   tfdata = (struct tfdata *) (cn->tf_outbuf.data);
   tfdata->tf_op = TF_DATA;
   tfdata->tf_block = cn->tf_expected;

   /* load file data into tftp buffer */
   if(!cn->tf_NR)   /* if this is NOT a retry, read in new data */
   {
      bytes = vfread(tfdata->tf_data, 1, NORMLEN, cn->tf_fd);   /* read next block from file */
      if(bytes < NORMLEN)      /* end of file? */
      {
         if(vferror(cn->tf_fd))   /* see if it;'s an error */
         {
            if(cn->callback)
                cn->callback(TFC_FILEREAD, cn, "file read error");
            return FALSE;
         }
         /* else at End Of File; fall through to do last send */
      }
      cn->tf_flen = bytes;   /* bytes in last packet sent */
      cn->tf_size += bytes;   /* total bytes sent so far */
   }
   else
   {   dtrap("tftputil 3\n");   /* can this happen? */
   }
   err = tf_write(cn, sizeof(struct tfdata)-512+bytes);   /* send the data block */
   if(err == 0)   /* if sent OK, wait for reply */
   {
      if(cn->tf_flen == NORMLEN)   /* this a full sized block? */
         cn->tf_state = ACKWAIT;      /* yes, normal wait for ack */
      else
         cn->tf_state = SENTLAST;   /* no, this is last block to send */
   }
   else   /* else kill connection */
   {
      if (cn->callback)
      {
         if (err == ENP_NOBUFFER)
            cn->callback(TFC_BUFFER, cn, "UDP alloc failed");
         else
            cn->callback(TFC_UDPSEND, cn, "UDP send failed");
      }
      tfkill(cn);
   }
   return err;
}

/* Handle an incoming ack. */

void
tfdoack(struct tfconn *cn)
{
struct tfack *ack;
TFTPBUF p = &cn->tf_inbuf;

   ack = (struct tfack *)(p->data);

   if(htons(ack->tf_block) != cn->tf_expected) 
   {/*  We have received an ACK,
         but not for the data block we sent.  It must be for
         a duplicate, since we wouldn't have sent
         the current data block if we hadn't gotten an ACK for
         the previous one.  This duplicate ACK means either
         that the network resent a packet that it wasn't sure
         got through, or else the other end resent the ACK
         because our current data block is lost or late.
         In either case, we can safely ignore this extra ACK,
         and if the ACK we want doesn't come our own timer will
         get us started again.  It isn't safe
         to resend the current data block now unless we are
         absolutely certain that the other end won't reack
         it if the earlier send was just delayed.  */

      cn->tf_ous++;
   }
   else 
   {
      tf_good(cn);
      /* If ack was for last packet, we are done with this connection */
      if(cn->tf_state == SENTLAST)
      {
         cn->tf_state = TERMINATED;
      }
      else
         cn->tf_state = RCVACK;

      tftp_udpfree(cn);    /* free acked data bufffer */
      cn->tf_expected++;   /* ready to do next block */
   }
}


/* tftprcv() - Handle an incoming TFTP packet. 

   This is upcalled from the tftpudp.c code which  handles UDP semantics. 
Note that contents of cn->tf_inbuf are only good for the duration of this 
upcall.

*/

void
tftprcv(struct tfconn *cn, unshort fport)
{
TFTPBUF p;
struct tfdata * pdata;
unshort op;
unsigned len;

   p = &cn->tf_inbuf;   /* data is in connection's buffer */
   len = p->dlen;      /* size of received data in buffer */

   /* If tf_fport is still not set, this should be ack for first block */
   if(cn->tf_fport == TFTPPORT)
   {
      struct tfack * ack = (struct tfack *)(p->data);
      if(htons(ack->tf_block) <= 1)   /* only do this on first block */
         cn->tf_fport = fport;   /* set port from upcalled value */
   }
   cn->tf_rcv++;
   pdata = (struct tfdata *) (p->data);
   op = htons(pdata->tf_op);
   pdata->tf_op = op;

   switch(op)
   {
      case TF_RRQ:   /* retry of original req? */
      case TF_WRQ:
         break;      /* silently ignore... */
      case TF_DATA:
         tfdodata(cn, p, len);
         break;
      case TF_ACK:
         tfdoack(cn);
         break;
      case TF_ERROR:
         tfdoerr(cn, p, len);
         break;
      default:
         dtrap("tftputil 4\n"); /* printf("TFTPRCV: Got bad opcode %u.\n", op); */
         tfsnderr(cn, ILLTFTP, " ");
         break;
   }
   check_state(cn);   /* see if we need to send something */
   return;
}


void
tfkill(struct tfconn * cn)
{
   cn->tf_state = DEAD;   /* will get cleaned up later */
   cn->tf_tick = cticks + TPS;      /* clean up after one second */
}

/* the tftp task/superloop handler. This scans all tftp connections to
see if any states have timed out. This should be called on every
received tftp packet and 1 second timer. 
*/

static int in_tftp_tick = 0;  /* re-entry guard */

void
tftp_tick(void)
{
struct tfconn * cn, * nextcn;

   if(in_tftp_tick)   /* avoid re-entring */
      return;
   in_tftp_tick++;

   for(cn = tftp_conns; cn; cn = nextcn)
   {
      nextcn = cn->next;   /* in case cn is deleted in check_state */
      if(cn->tf_tick > cticks)   /* time for state check? */
         continue;
      check_state(cn);
   }
   in_tftp_tick--;
}

void
check_state(struct tfconn * cn)
{
char * msg;

   /* prevent clock ticks from re-entering. Do not exit
   this routine without decrementing this counter! */
   in_tftp_tick++;

   switch (cn->tf_state)
   {
   case DATAWAIT:    /* waiting for data? */
   case ACKWAIT:     /* waiting for ack? */
   case SENTLAST:    /* sent last data block? */
      if(cn->tf_tick <= cticks)   /* timeout now? */
         tftptmo(cn);
      break;
   case TIMEOUT:
      tfsnderr(cn, ERRTXT, "Retry limit exceeded, giving up");
      if (cn->callback)
         cn->callback(TFC_TIMEOUT, cn, "retry limit exceeded");
      tfkill(cn);
      break;
   case RCVLASTDATA:   /* receive last incoming block of file */
   case TERMINATED:   /* sent last outgoing block of file */
      if(cn->callback)
      {
         if(cn->tf_size == 0L)
            cn->callback(TFC_ZEROFILE, cn, "zero length file");
         else
         {
         unsigned secs, tenths, elapsed;

            msg = cn->tf_inbuf.data;
            elapsed = (unsigned)(cticks - cn->tf_start);   /* elapsed ticks for transfer */
            secs = elapsed/TPS;      /* round down to number of whole seconds */
            tenths = ((unsigned)(cticks - cn->tf_start) - (secs*TPS))/2;   /* approximate 10ths of a second */
            sprintf_t(msg, "Transferred %lu bytes in %u.%u seconds", 
               cn->tf_size, secs, tenths);
            cn->callback(TFC_SUCCESS, cn, msg);
         }
      }
      cn->tf_state = DEAD;
      break;
   case RCVACK:   /* got an ack */
      tfsndata(cn);      /* send more data */
      break;
   case RCVDATA:
      tfsndack(cn);
      break;
   case DEAD:
      tfcleanup(cn);
      break;
   default:
      dtrap("tftputil 5\n");   /* bad state */
      if (cn->callback)
         cn->callback(TFC_BADSTATE, cn, " ");
      tfkill(cn);
      break;
   }
   in_tftp_tick--;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级理论片| 国产一区二区三区四区五区美女| 91在线观看成人| 国产精品久久久久久久久快鸭| 国产成人免费9x9x人网站视频| 久久久国产一区二区三区四区小说| 国产成人精品影院| 亚洲国产精品成人综合 | 成人h动漫精品一区二| 中文字幕一区二| 99精品久久99久久久久| 亚洲国产精品久久一线不卡| 欧美美女bb生活片| 六月婷婷色综合| 中文字幕精品一区二区精品绿巨人 | 欧美成人一级视频| 国产精品综合视频| 成人免费在线视频观看| 欧美日韩一区二区三区视频| 久久99精品久久久久婷婷| 国产精品视频在线看| 欧美午夜电影在线播放| 另类小说一区二区三区| 国产精品毛片a∨一区二区三区| 91视视频在线观看入口直接观看www | 亚洲图片有声小说| 精品少妇一区二区三区日产乱码| 国产精品一区二区在线播放| 亚洲人妖av一区二区| 欧美精品一二三| 国产精品一区二区久久精品爱涩 | 欧美亚洲综合色| 精彩视频一区二区三区| 亚洲人一二三区| 日韩视频一区二区三区| av电影一区二区| 免费视频最近日韩| 亚洲人精品午夜| 欧美大白屁股肥臀xxxxxx| 91女厕偷拍女厕偷拍高清| 捆绑调教美女网站视频一区| ㊣最新国产の精品bt伙计久久| 91精品欧美福利在线观看| 成人午夜视频在线观看| 日韩成人一区二区三区在线观看| 国产精品精品国产色婷婷| 欧美一区二区三区四区在线观看| 99精品久久99久久久久| 国产曰批免费观看久久久| 午夜在线成人av| 中文字幕一区二区在线观看| 欧美xxxxxxxxx| 欧美裸体一区二区三区| 一本大道久久a久久综合| 国产精品性做久久久久久| 天堂va蜜桃一区二区三区| 18成人在线视频| 日本一区二区三区电影| www成人在线观看| 欧美一区二区三区喷汁尤物| 欧美性大战久久久久久久蜜臀| 99久久99久久精品免费看蜜桃 | 免费观看日韩电影| 日韩一区二区在线观看| 色婷婷精品大在线视频| 国产一区二区精品久久99| 午夜av区久久| 亚洲美女区一区| 国产日韩在线不卡| 91精品婷婷国产综合久久 | 五月激情综合网| 亚洲美女一区二区三区| 久久蜜桃av一区二区天堂| 91精品国产综合久久香蕉的特点 | 狠狠色综合播放一区二区| 亚洲一区二区三区美女| 亚洲欧洲av色图| 国产欧美日韩综合| 日韩美女一区二区三区四区| 欧美伊人久久久久久久久影院| 成人精品视频网站| 国产精品一区二区三区99| 国内精品在线播放| 美腿丝袜亚洲一区| 日韩在线一区二区| 亚洲丰满少妇videoshd| 夜夜爽夜夜爽精品视频| 一区二区在线观看视频| 国产女人18水真多18精品一级做| 日韩一区二区三免费高清| 欧美高清视频不卡网| 欧美老女人第四色| 91精品国产综合久久蜜臀| 欧美日韩精品电影| 欧美精品久久久久久久多人混战| 欧美日韩一区二区三区在线看| 日本乱码高清不卡字幕| 精品1区2区3区| 一本大道综合伊人精品热热| 91麻豆精品久久久久蜜臀| 欧美一区二区三区在线电影| 日韩一区二区在线看| 日韩免费电影网站| 国产午夜亚洲精品羞羞网站| 国产无人区一区二区三区| 国产亚洲一区二区三区四区| 国产日产欧产精品推荐色| 国产精品视频看| 亚洲人精品午夜| 午夜精品一区二区三区电影天堂 | 精品久久久久久久久久久久包黑料| 日韩手机在线导航| 精品国产一区二区精华| 久久精品人人做人人综合 | 久久综合视频网| 国产欧美一区二区三区沐欲| 亚洲精品视频免费观看| 亚洲成人激情社区| 国产在线视频精品一区| 成人免费福利片| 日本国产一区二区| 91黄色在线观看| 欧美日本在线播放| 久久久亚洲午夜电影| 专区另类欧美日韩| 热久久免费视频| 国产成人aaa| 在线观看一区日韩| 欧美变态tickle挠乳网站| 国产精品网站导航| 一区二区三区国产精华| 国产一区二区成人久久免费影院| 99re热这里只有精品免费视频| 欧美日韩一级二级三级| 亚洲精品在线三区| 亚洲一区二区在线视频| 另类小说视频一区二区| 色94色欧美sute亚洲线路一久| 精品视频1区2区| 国产欧美1区2区3区| 日韩高清不卡一区| 91在线视频免费观看| 在线不卡中文字幕播放| 中文字幕在线播放不卡一区| 久久www免费人成看片高清| 色婷婷久久99综合精品jk白丝| 精品国产a毛片| 亚洲制服丝袜av| 99视频精品在线| 久久免费的精品国产v∧| 亚洲成精国产精品女| 成人小视频在线| 精品粉嫩超白一线天av| 亚洲国产视频直播| 成年人国产精品| 精品国产伦一区二区三区观看方式| 五月婷婷另类国产| 色综合天天天天做夜夜夜夜做| 亚洲精品一区二区三区精华液 | 依依成人精品视频| 成人免费视频一区二区| 欧美电影免费观看高清完整版在 | 国产成人午夜片在线观看高清观看| 欧美日韩亚洲综合在线| 中文字幕一区在线观看| 成人深夜视频在线观看| 日韩欧美一二三四区| 亚洲黄色录像片| av午夜精品一区二区三区| 久久久精品中文字幕麻豆发布| 日韩精品一二区| 欧美色图12p| 亚洲激情图片小说视频| 99视频一区二区| 亚洲色欲色欲www| 成人av网站免费| 精品福利av导航| 成人久久久精品乱码一区二区三区| 久久精品人人做人人爽人人| 黄色精品一二区| 久久久久久黄色| 国产乱码精品一区二区三区av| 精品裸体舞一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 成人avav在线| 亚洲一区二区在线播放相泽| 91国偷自产一区二区三区观看| 国产精品福利影院| 99在线热播精品免费| 成人欧美一区二区三区在线播放| 成人av电影观看| 亚洲精品欧美激情| 一本大道综合伊人精品热热 | 久久精子c满五个校花| 国内外精品视频| 久久美女艺术照精彩视频福利播放| 日本伊人色综合网| 久久久久久久久岛国免费| 成人三级伦理片| 亚洲综合在线五月|