2020年6月24日 星期三

udpdump

udpdump 是 wireshark 內部接收 UDP 封包的 server,由其它所在擷取的訊息裝載而成 。udpdump 接收後,把 UDP 進前的 Header 拿掉,轉著 EXPORTED_PDU 格式給 wireshark 解析。

EXPORTED_PDU 格式是訊息前面含有一些 TLV 格式的 meta 資訊
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      Option Code              |         Option Length         |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                       Option Value                            /
 /             variable length, aligned to 32 bits               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 /                 . . . other options . . .                     /
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |   Option Code == opt_endofopt  |  Option Length == 0          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

依據 udpdump 原始碼,meta 資訊包含協定名稱 (在啟用時設定,預設 data)、實際來源 IP 和port、目的 IP (固定為 127.0.0.1)、實際目的 port (預設 5555)。

wireshark 依據協定名稱對訊息解析。

問題:協定如果是網路封包

參考來源
  • https://www.wireshark.org/docs/man-pages/udpdump.html 
  • https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob;f=epan/exported_pdu.h;hb=refs/heads/master
  •  https://www.wireshark.org/docs/wsdg_html_chunked/
  • https://www.wireshark.org/docs/wsdg_html_chunked/PartDevelopment.html

wireshark

wireshark 是功能強大的圖形界面網路分析程式。用 libpcap 或 winpcap 擷取封包

擷取過濾

顯示過濾

2020年6月19日 星期五

Thinkpad X1C 7th

規格:
  • 處理器:Intel Core i5-10210U 四核心 (1.6GHz)
  • 記憶體:8G LPDDR3
  • 硬碟:512G PCIe SSD
  • 螢幕:14吋 FHD IPS (1920x1080) 400Nit
  • 1.08 Kg,323 mm x 217 mm x 14.95 mm
  • $40900
還原 (=回復?)
  • 啟動電腦後,按 F11 或「單鍵回復按鈕」來啟動儲存於硬碟或回復光碟中的還原程式。
  • 備份:如何備份整個硬碟呢?接 AC 電源、插 16GB USB。搜尋 recovery,按建立修復磁碟機。允許 Recovery Media Creator 工具程式啟動。依指示建立。
  • 接 AC 電源、插回復 USB、啟動電腦。按 F12 開啟 Boot Menu。選取 USB 開機。疑難排解顯示選用的回復解決方案。視需要選取回復解決方案,依指示完成程序。
擴充
  • 加硬碟?M.2固態硬碟*•混合式固態硬碟*(搭載Intel®Optane™記憶體)
  • 擴充基座:ThinkPad Basic Docking Station、ThinkPad Pro Docking Station、ThinkPad Ultra Docking Station
  • 乙太網路擴充接頭Gen2
  • USB
安裝 Ubuntu
參考
https://certification.ubuntu.com/hardware/201904-26993
https://hackmd.io/7hyw0e1lQUmV3mY7G_gQ0w
http://alan1968.blogspot.com/2019/08/thinkpad-x1-yoga-3rd-add-second-ssd.html

2020年6月13日 星期六

inet_pton() and inet_ntop()

IPv4 或 IPv6 位址表示字串,如:
  • 204.152.189.116 (dotted-decimal 的 IPv4 位址)
  • ::1 (colon-separated hexadecimal 的 IPv6 位址)
  • ::FFFF:204.152.189.116 (IPv4-mapped 的 IPv6 位址)
inet_pton() 可轉換成為二進位格式 (struct in_addr 或 strut in6_addr)。而 inet_ntop() 反之。 函數名稱中的 p 是「presentation」,指文字表示字串;n 是「network」。
#include <arpa/inet.h>

// 轉換 IPv4 或 IPv6 數字位址 (表示字串) src_str 為二進位格式 addrptr
int inet_pton(
    int family, // AF_INET 或 AF_INET6
    const char *src_str,
    void *addrptr);
// 回傳 1:成功、0:src_str 格式不是表示字串、–1 on error

// 轉換二進位格式 addrptr 為表示字串 dst_str
const char *inet_ntop(
    int family,
    const void *addrptr,
    char *dst_str,
    size_t len);
// 回傳 指向 dst_str 的文字字串: 成功, NULL: 錯誤
  • family 可以是 AF_INET 或 AF_INET6。擴充並捨棄 inet_aton() 與 inet_ntoa() (只能用在 IPv4)。問題:程式如何判斷位址是 IPv4 或 IPv6?
  • addrptr 依據 family 可指到 struct in_addr 或 struct in6_addr。
  • 呼叫 inet_ntop() 需提供長度 len 的 dst_str buffer,適當的長度是 INET_ADDRSTRLEN (16) 或 INET6_ADDRSTRLEN (46)。

參考來源

TLPI §59.6 §59.13.1

2020年5月24日 星期日

Ephemeral Port

Ephemeral Port 是自動配置的近端 IP L4 通訊埠 (local port),作為當下通訊暫時使用。
ephemeral:無常的、短命的、短暫的
IANA 建議範圍 49152 ~ 65535,Linux 使用 32768 ~ 60999,可用
echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range
更改範圍,實際上是存在陣列 sysctl_local_port_range 的兩個數字。

如何配置?
bind() 指定 local port
inet_hash_connect() @net/ipv4/inet_hashtables.c:
inet6_hash_connect() @net/ipv6/inet6_hashtables.c:local port 未指定時,範圍內從小到大...
__udp_lib_get_port() @net/ipv4/udp.c
inet_csk_get_port() @net/ipv4/inet_connection_sock.c
selinux_socket_bind() @security/selinux/hooks.c:不在範圍內時 ...

問題:
可針對不同 net_device 而有不同範圍?

最後更新:20200721

2020年5月10日 星期日

Linux Method Dispatch

一種在 C 實作 Object 的方式是宣告一個 struct,含有一些函數指標,這些函數運作在 struct 自己 (也就是第一個參數是 struct 自己),但這不是 Linux 主要採用的樣式。
就同樣 class 的 Object,Method 不像狀態一般不會變,通常收集在另一個 struct,有時稱為「virtual function table (vtable)」,原本 struct 只需要一個指標到這個 table 而節省記憶體。

pure vtable:都是函數指標的 struct,這些函數的第一個引數指到一個 struct,其包含一個指標指到此 vtable。
例如:file_lock_operations 包含兩個函數指標,運作在 struct file_lock
例如:seq_operations 包含四個函數指標,運作在 struct seq_file
vtable 取名習慣是運作的 struct 名稱或 abbreviated 加上「_operations」,在 Linux 2.6.39 大約有 30 個「*_operations」。此外有超過 100 個「*_ops」,大部分也是。但也有幾個如 struct mdk_personality,並沒有規則。

函數指標為 NULL:
  • 呼叫前要檢查。
  • 與其間接執行一個沒功能的函數,檢查是否 NULL 較有效率。
  • 如果 NULL 只是少數例外,檢查 NULL 確實浪費程式空間及執行時間。
  • 可能有別的方式得知為 NULL,不用實際去檢查,也節省了 memory fetch。
原因:持續發展的結果。新加一個函數指標,舊有程式預設初始化為 NULL,不好一一指定一個存在、但沒實際動作的函數。 
原因:特定 Method 對有些使用情況是無意義的,測試為 NULL 需回傳錯誤。例如:在 inode_operations 的 create() 只有在 inode 是目錄才有意義,所以執行 vfs_create() 檢查為 NULL 而回傳 -EACCES。

原因:界面函數轉換。例如:file_operations 的 ioctl(),在 2.6.11 新增 unlocked_ioctl() 不用 big kernel lock,在 2.6.36 所有驅動程式和檔案系統完成轉換而移除 ioctl()。轉換過程中,一個檔案系統一般只有二者之一,讓另一個為 NULL。

例如:file_operations 的 read()/write() 和 aio_read()/aio_write() 只需要二者之一。aio_read() 用來支援 asynchronous IO,此時 the regular synchronous read() 是不需要的 (實際上是透過 do_sync_read() 使用 aio_read()),但似乎沒有移除 read() 的打算,有些情況 async IO 是 not relevant,例如特殊檔案系統 procfs 和 sysfs。

不純的 vtable:含有其它成員。

例如:struct mdk_personality 提供 particular software RAID level 操作,包含了「owner」、「name」、以及「list」「owner」是提供實作的模組,「name」只是識別(有些 vtable 是字串、有些數字,有些稱作「版本」、「family」、「drvname」、或「level」。)

Object-oriented design patterns in the kernel, part 1

2020年5月8日 星期五

電腦散熱風扇

電源說明
大 4 pinGND+12V--直接接電源跑全速,其實也可以 DC 控制。
小 2 pinDC
電壓控制
--
小 3 pin轉速偵測-
小 4 pin+12VPWM
電壓要高於啟動電壓才會轉動,另外也有 5V 或 24V 的風扇
轉速 (tachometer) 是每圈兩個方波的 open collector 輸出,需電阻 pull high。鎖住時固定 high 或 low。
PWM 是 25kHz 左右的 5V 方波
直徑:
轉速:
風量:
噪音:

貓頭鷹 S是靜音,F是聚焦,A前或後是進階(或進化),P是平衡
外接控制器

https://teal566.blogspot.com/2022/06/5v-12v-dc-fan.html

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...