專案採用的是3.10.108的kernel,在測試時使用發包功率高速傳送dhcp request報文,發現busybox中的udhcpd 程序狀態為d,抓包看,沒有offer包,而且樣機ping不通。
分析發現是在kernel中的函式udp_queue_rcv_skb中:
if (sk_rcvqueues_full(sk, skb, sk->sk_rcvbuf))
丟包;列印除錯**後發現:
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : sock_queue_rcv_skb 483 call sk->sk_data_ready
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : sock_queue_rcv_skb 483 call sk->sk_data_ready
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : sock_queue_rcv_skb 483 call sk->sk_data_ready
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : sock_queue_rcv_skb 483 call sk->sk_data_ready
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : sock_queue_rcv_skb 483 call sk->sk_data_ready
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:24] :
[16:52:24] : __udp4_lib_mcast_deliver 1641 do flush_stack
[16:52:24] : udp_queue_rcv_skb 1538 goto drop;
[16:52:29] : udhcpd_main 501 : select retval = 1
udp協議棧中多次接收到包,並且把包放入sk->sk_receive_queue佇列,但是上層的應用程式select卻檢測到一次socket可讀並收包,這樣導致佇列滿而資料報被丟棄。
問題原因找到,在busybox中匯報呼叫了
fd = socket(pf_packet, sock_dgram, htons(eth_p_ip));導致程序處於d狀態。包沒有發出去,導致ip位址續約失敗。
linux UDP廣播通訊
2013 02 04 10 18 3881人閱讀收藏 舉報 c 語言 89 linux system 153 在除錯區域網內通過udp協議獲取其他裝置ip位址時,伺服器使用udp 廣播後,客戶端裝置無響應.先研究一下正常情況下,udp廣播通訊方法.參考了網路上一寫資料.整理如下 伺服器端向 255....
Linux UDP實現廣播
特點 較tcp來講udp無需建立連線可以直接傳送訊息,udp是對網路環境完全不彌補的協議,所以使用dup就要允許有一定的丟包率,udp廣播是面向區域網內所有的裝置的。對比tcp連線時服務端的ip位址的重要性來講,udp廣播中本機的ip顯得並不重要了。在udp廣播中不同於tcp的我們需要對網路套接字設...
DA14681 連線成功停止廣播
保證藍芽裝置只能同時被乙個主裝置連線 在14681的1.0.8.1050.1sdk中的pxp reporter工程裡 協議棧在開始連線的時候停止廣播,而一旦廣播被停止時,ble evt gap adv completed event會被觸發,handle evt gap adv completed ...