1.recv(p, h)
  if(h == DOWN) //DOWN代表此pkt要傳送出去
    send(p,h);

2.send(p, h)
  先check energy model,若為sleep mode則丟棄封包,
  否則將handler設給callback(upcall_)
  接著call sendDATA(p)及sendRTS(ETHER_ADDR(dh->dh_ra))
  之後檢查channel是否idle(檢驗defer time)
  當Defer timer expires的時候,程式就會去呼叫deferHandler()。

3.deferHandler()
  check_pktCTRL()及mhBackoff.busy()沒有資料,回傳-1
  呼叫check_pktRTS()

4.check_pktRTS()
  if channel busy
    增加一個contention window並重新執行backoff,
  else
    設定傳輸狀態為MAC_RTS
    等待CTS Timeout
  傳送RTS packet

5.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
  packet接收完畢後call recvHandler()

6.recvHandler()
  call recv_timer()

7.recv_timer()
  若判斷收到的pcaket為CTS,表示RTS已傳送成功。
  call recvCTS(pktRx)

8.recvCTS(pktRx)
  set pktRTS = 0
  set ssrc = 0(STA Short Count)
  set rtsrc = 0(RTS Retry Count)
  call tx_resume()

9.tx_resume()
  RTS/CTS已交換完成,準備傳送資料。
  檢查channel是否idle(檢驗defer time)
  當Defer timer expires的時候,程式就會去呼叫deferHandler()。

10.deferHandler()
  check_pktCTRL()、mhBackoff.busy()、check_pktRTS()沒有資料,回傳-1
  呼叫check_pktTx()

11.check_pktTx()
  if channel busy
    增加一個contention window並重新執行backoff,
  else
    設定傳輸狀態為MAC_SEND
    等待ACK Timeout
  傳送DATA packet

12.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
  packet接收完畢後call recvHandler()

13.recvHandler()
  call recv_timer()

14.recv_timer()
  若判斷收到的pcaket為ACK,表示DATA已傳送完畢。
  call recvACK(pktRx)

15.recvACK(pktRx)
  由於data packet已成功送出,call mhSend.Stop()
  if packet size <= RTSThreshold
    slrc = 0(STA Long Retry Count)
  else
    ssrc = 0
  call tx_resume()

16.tx_resume()
  if no data to send nor receive
    goto_sleep();
  else
    呼叫callback
  封包傳送結束。

arrow
arrow
    全站熱搜

    Graffine 發表在 痞客邦 留言(0) 人氣()