2017年10月20日 星期五

Wi-Fi 速率

Protocol Frequency Signal Maximum Data Rate
傳統 802.11 2.4 GHz FHSS 或 DSSS 2 Mbps
802.11a 5 GHz OFDM 54 Mbps
802.11b 2.4 GHz HR-DSSS 11 Mbps
802.11g 2.4 GHz OFDM 54 Mbps
802.11n 2.4 或 5 GHz OFDM 600 Mbps (理論值)
802.11ac wav1 5 GHz
866.7 Mbps (理論值)
802.11ac wav2 5 GHz
1.73 Gbps (理論值)

??TKIP本來速率就會比較慢,頂多54Mbps,因為只有802.11g,但是txpower會比較強。AES就可以跑到802.11n 300Mbps.

參考來源:
延伸閱讀:
  • MCS

iwlist

iwlist <interface> scan[ning] 可以列出掃到的 Wi-Fi 網路 (AP 或 Ad-Hoc) 及其它訊息。root 才能驅動掃描,一般使用者只是讀出留下的掃描結果。

iwlist wlan0 scan
          Cell 01 - Address: 9C:D6:43:D0:02:AE
                    Channel:3
                    Frequency:2.422 GHz (Channel 3)
                    Quality=28/70  Signal level=-82 dBm 
                    Encryption key:on
                    ESSID:"my_ap"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=000000b8cd99d176
                    Extra: Last beacon: 14628ms ago
                    IE: Unknown: 0004616E6479
                    IE: Unknown: 010882848B960C121824
                    IE: Unknown: 030103
                    IE: Unknown: 050400010000
                    IE: Unknown: 2A0100
                    IE: Unknown: 32043048606C
                    IE: Unknown: 2D1A2C181EFFFF000000000000000000000000000000000000000000
                    IE: Unknown: 3D1603000000000000000000000000000000000000000000
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : TKIP CCMP
                        Authentication Suites (1) : PSK
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : TKIP CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00
                    IE: Unknown: DD1E00904C332C181EFFFF000000000000000000000000000000000000000000
                    IE: Unknown: DD1A00904C3403000000000000000000000000000000000000000000
                    IE: Unknown: DD0600E04C020160
                    IE: Unknown: DD180050F204104A00011010440001021049000600372A000120

其它:
  • nm-tool

漢字輸入法

hime 輸入法
  • sudo apt-get install hime-chewing
  • hime-setup (可參考《Ubuntu 12.04 & 12.10 調校備忘》的圖片)
    • 內定輸入法 & 開啟/關閉:只開啟需要的輸入法
    • 輸入視窗外觀設定
      • 字型可改用較符合臺灣「國字標準字體」的字型
      • 編輯區顯示:應用程式編輯區,勾選顯示字根於應用程式中 (OnTheSpot)
      • 啟用 System Tray Icon:單圖示
  • 左下角 → 偏好設定 → 輸入法 → 選 hime (或 im-switch -s hime)
  • 重新登入 (或 gnome-session-quit)
  • sudo apt-get purge ibus-table ibus-chewing

Lubuntu 16.10 Fcitx 無法選字

安裝後預設的漢字輸入法是 Fctix 新酷音,會出現黑框無法選字。 可能的解法
  1. 「開始功能表」→「偏好設定」→「Fcitx設定」→ 左方「附加元件」→取消勾選「Kimpanel」→ 重新登入
    • Kimpanel 是 KDE 輸入法面板
  2. 「開始功能表」→「偏好設定」→「LXSession的預設應用程式」→ 左方「自動啟動」→取消勾選「Fcitx Qt IMPanel」→ 重新登入
  3. sudo apt-get install qml-module-qtquick2
  4. 改用 hime
  5. 改用 ibus-chewing

ibus

  • 倉頡3代輸入法 sudo apt install ibus-table-cangjie3
  • 倉頡5代輸入法 sudo apt install ibus-table-cangjie5
  • 倉頡大字集輸入法 sudo apt install ibus-table-cangjie-big

參考

  1. https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=353834
  2. http://smpsfox.blogspot.tw/2016/06/ubuntufcitx.html
  3. http://goodjack.blogspot.tw/2013/08/linux-phonetic-setting.html

2017年9月15日 星期五

Asterisk PRI RESTART

使用 Q.931 RESTART 重新開始非使用中的 B channel (例如砍 call)
不適用 PRI_SWITCH_GR303_TMC、SIG_BRI_PTMP

Asterisk 作法:每輪依序找一個非使用中的 B channel 送 Q.931 RESTART,收到 ACK 後再找下一個送。找不到下一個時,則結束這一輪,停止一段時間,再重頭進行下一輪。如果送 Q.931 RESTART 一直沒收到 ACK,例如有些沒實作,則以收到此 channel 的 Q.931 SETUP 來當作完成。

另外有一種情況也可以送 RESTART:要 Q.931 SETUP 建立通話,但收到原因是 PRI_CAUSE_REQUESTED_CHAN_UNAVAIL 的掛斷 (可能是 Q.931 RELEASE 等)。會發生的一個可能是建立呼叫時,對方用戶端剛好也提出偏好此 channel 來建立呼叫,雖然最用後哪個 channel 還要局端確認,但對方還不知道而先回 channel unavail。

相關變數
  • resetinterval:上輪 RESTART 完成後經過多久開始下一輪。預設 = -1 = 不進行,至少 60 秒以上。
  • lastreset:上 RESTART 完成的時間。
  • span's resetting:span 是否目前正在進行一輪 RESTART。
  • resetpos:這一輪 RESTART 進行到哪個 channel。
  • channel's resetting:channel 的 RESTART 狀態。進行 RESTART 也算在使用中。狀態有
    • SIG_PRI_RESET_IDLE:非進行 RESTART 中。
    • SIG_PRI_RESET_ACTIVE:進行 RESTART 中,等候 Q.931 RESTART ACK
    • SIG_PRI_RESET_NO_ACK:進行 RESTART 中,沒等到 Q.931 RESTART ACK,卻收到 Q.931 SETUP。在此狀態再次收到 Q.931 SETUP 表示RESTART 完成,找下個非使用中的 B channel 進行 RESTART。
pri_check_restart():找下個非使用中的 B channel 進行 RESTART。channel 狀態設為 SIG_PRI_RESET_ACTIVE 並透過 pri_reset() 送 Q.931 RESTART。如果找不到下個未使用的 B channel 可進行 RESTART,結束 resetting = 0 span resetting 狀態並紀錄目前時間到 lastreset。

D channel 處理的無限迴圈:
  1. span 在 resetting 狀態且有 D channel 起來:如果還沒開始 RESTART,執行 pri_check_restart()。
  2. span 不在 resetting 狀態且離 lastreset 有 resetinterval 時間,進入 resetting 狀態
  3. PRI_EVENT_RESTART:進行砍 call
  4. PRI_EVENT_RESTART_ACK:
  5. 收到 Q.931 SETUP
  6. hangup PRI_CAUSE_REQUESTED_CHAN_UNAVAIL
  7. D channel 起來的時候,設為 5 秒後進入 resetting 狀態

2017年9月14日 星期四

Ubuntu 16.04 更新到 17.04 Ethernet 不通

sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
sudo service network-manager restart

參考
  1. 依據 https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1638842 #7,目的是覆蓋 /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
  2. nmcli d

2017年8月26日 星期六

Thread Safety

thread-safe 函數給多個 thread 同時重複呼叫時不會造成錯誤,包括原本就已經是 reentrant 的函數,以及用 mutex 或其它方式改良過的函式。

thread 排程不是 preemptive 會嗎?

threadFunc() 為例,對全域變數 glob 作 loops 次「加一」。當有兩個 thread t1 和 t2 都呼叫此函數,「加一」動作並不是 atomic operation,實際上包括了「讀 glob」、「glob 加 1」、和「寫 glob」,有時中間會插入另一個 thread,而造成結果被覆蓋而錯誤。
t1 讀 glob 為 1
t2 讀 glob 為 1
t2 加 1 後寫 glob 為 2
t1 加 1 後寫 glob 為 2
結果是 2,但正確結果是 3。

註:glob 是 int,所以 read 跟 write 可以一次完成。如果資料量大於 int 或沒對齊 int boundary,read 跟 write 無法一次完成,也可能插入其它 thread 的動作。

改正方式:
  1. 使用 mutex (如有 mutex 的 threadFunc())。例如一個變數配置一個 mutex,用在存取需要 critical sections 的部份。
  2. 一次只讓一個 thread 執行 (serialized)。如果 thread 花很多時間執行此函數,會失去 concurrency。
POSIX 裡的函數,有列出除了哪些以外,都必須是 thread-safe (可見 man pthreads)

reentrant 函數能夠不用 mutex 達到 thread safety。reentrant 函數
  • 不使用全域變數 (要回給 caller 或呼叫間需要保留的任何資訊,必須存在 caller 配置的 buffers。)
  • 不改變自身程式碼
  • 不呼叫 no-reentrant 函數

有些標準函數不是 reentrant 的,但有另外提供名稱後置 _r 的 reentrant 版本,這些函數需要 buffer 回傳結果。

例如 asctime_r()、ctime_r()、getgrgid_r()、getgrnam_r()、getlogin_r()、getpwnam_r()、getpwuid_r()、gmtime_r()、localtime_r()、rand_r()、readdir_r()、strerror_r()、strtok_r()、及 ttyname_r()。

glibc 提供的 crypt_r()、gethostbyname_r()、getservbyname_r()、getutent_r()、getutid_r()、getutline_r()、及 ptsname_r()。

參考:
  1. :《The Linux Programming Interface》chap. 31.1
  2. 可重入與執行緒安全 (reentrant vs thread-safe) Part 1/Part 2/Part 3
  3. coroutine
  4. https://en.wikipedia.org/wiki/Non-blocking_algorithm
  5. https://en.wikipedia.org/wiki/Real-time
  6. Emulated atomic operations and real-time scheduling,處理器原生只支援最基本的 atomic operations,如何 emulate 其它 atomic operation?在Linux kernel 只需要暫時關閉中斷 (SMP 不行)。

必須避免執行緒同時修改資料結構,破壞了資料的正確性

如果要鎖住資料結構,通常需要 read-modify-write

  1. 檢查目前是否有人正在修改 (有 read 動作)
  2. 如果沒人在修改,就先「鎖上」後修改 (modify-write)
硬體必須提供特別的指令,可以同時 1. 檢查 2. 檢查通過立刻上鎖

POSIX 提供高階的鎖定機制,如:semaphore、mutex、spinlock、rwlock

2017年8月25日 星期五

Create Wi-Fi Hotspot in Lubuntu

ASUS 筆電 PU301LA 安裝 Lubuntu 更新到 16.04 LTS (xenial)
執行「iw list」查看 Supported interface modes: 有 AP
已安裝 dnsmasq

點選右下角網路圖示 → 點選「Edit Connections...」 → 按「Add」鍵 → Choose a Connection Type 的選單選「Wi-Fi」 → 按「Create...」鍵 → Connection name 是設定檔名稱,可沿用自動產生的或另取,例如「hotspot」

Wi-Fi 標籤
  • SSID:設成想要的 Wi-Fi 網路名稱
  • Mode:選 Hotspot
  • Device:選使用的無線網卡
Wi-Fi Security 標籤
  • Security 選 WPA & WPA2 Personal
  • Password 設定
點選右下角網路圖示 → 點選「Create New Wi-Fi Network...」 → Connection: 選擇剛剛建立的 Connection name → 按「Create」鍵

註:設定檔 /etc/NetworkManager/system-connections/`Connection name`
註:不需要安裝 hostapd
註:似乎無法隱藏 SSID [參考 https://askubuntu.com/questions/554307/is-there-any-way-to-create-a-hidden-hotspot-from-ubuntu]

2017/08/29 後記:系統更新為 Lubuntu 17.04,「Create Net Wi-Fi Network...」沒有出現 「Connection:」供選擇的解法
sudo vi /etc/NetworkManager/NetworkManager.conf
在最後加上
[device]
wifi.scan-rand-mac-address=no
sudo service network-manager restart

參考:
  1. 3 Ways to Create Wifi Hotspot in Ubuntu 14.04 (採用內容主要描述的第三種方法)
  2. 把電腦的無線網卡當無線 AP 讓行動裝置連線上網 (iw list 等硬體查看參考)
  3. Create Wi-Fi hotspot in Lubuntu 15.04 (不是採用內容所敘述的方法,作為將來參考用)
  4. https://blogs.gnome.org/thaller/2016/08/26/mac-address-spoofing-in-networkmanager-1-4-0/

SIP header Via

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