2016年11月29日火曜日

fedora24 caps ctrl 入替え

参考:https://www.kdel.org/wp/?p=367

dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:swapcaps']"

reboot

2016年11月2日水曜日

iwlwifi の設定・デバッグ

自分用なので冗長なことが多いわりに中身がない.
リンクを踏んで適時補完...

1. iwlwifi の設定
 こことかここを参考に.
  • 無線関連のパラメータ一覧の表示
    • # modinfo iwlwifi 
  • 現在のパラメータの表示
    • # cat /sys/module/iwlwifi/parameters/11n_disable
      • 上は,フレームアグリゲーションの有無
      • parameters以下は,必要に応じて変更する
    • パラメータの変更
      例:フレームアグリゲーションの無効化
      • # echo "options iwlwifi 11n_disable=1" > /etc/modprobe.d/iwlwifi.conf
      • # reboot
      • 必要に応じて iwlwifi.conf を編集,再起動する
      • フレームアグリゲーションについて 
2. iwlwifi のデバッグ
ここを参考に.
  • 使用するツール:trace-cmd
    • # yum install trace-cmd
  •  使用例
    1. # trace-cmd record -e iwlwifi_msg ping google.com -c 1
      • ping 開始から終了時までのデバッグログを出力
      • カレントディレクトリにtrace.dat が形成される
    2. # trace-cmd report trace.dat| less
      • たくさんログが吐き出されるため,必要なものだけ抽出する
        • trace-cmd report | grep "LONG\|SUCCESS\|retries" | less
        •  送信完了処理で破棄するフレームの送信結果とMACヘッダのシーケンス番号を出力する
  • FW,HW,ドライバのみデバッグするならば,trace-cmd で事が足りると思う.
    →パケットの情報を見るならデフォルトのままでは不十分...
    • 送信時,送信完了時には,処理中のパケットのMACのシーケンス番号のみ出力される
    • MACだけの情報だとSrc, Dst の端末でWiresharkを使ったときにパケットの対応付けが難しい(上位レイヤの情報が欲しい)
      • Wireshark はEthernet以上の情報しか見れないため
  • モジュールに手を加えて必要な情報を取得する
    →具体的には,ドライバの送信バッファ内のsk_buff 構造体からヘッダやデータなどの値を取得する
    • (準備) カーネルモジュールのコンパイル
    • (準備) 全体をコンパイルする場合はこっち(Fedora 23)
      →config を iwlwifi と mac80211のデバッグのために変更するならば以下の方法
      1. # su -  
      2. # wget http://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.5.tar.gz
      3. # cat <<"EOF">> /etc/dnf/dnf.conf
      4. # exclude=kernel*
      5. EOF
      6. sudo cp /boot/config-4.5.5-300.fc23.x86_64 linux-4.5.5/.config
      7. dnf install -y openssl-devel ncurses-devel
      8. cd linux-4.5.5
      9. make menuconfig
      10. make
      11. make modules_install
      12. make install
    • モジュールのコードを書き換える
      • vi linux-4.5.5/driver/net/wireless/intel/iwlwifi/mvm/tx.c
      •  ここを書き換えるもしくは,マクロを新たに追加する
        1.  水平タブ(\t)の影響でノートPCだとログが改行して表示されるため\tを消す
        2. ほかにも出力される情報の中で冗長なものは,排除する
          • retries :フレームのMAC層における再送回数(実際にはackが返ってくるまでに再送した回数?(15回でリセット?))
        3. TCPに関する情報を出力する
          • シーケンス番号:ntohl(tcp_hdr(skb)->seq)
          • ポート番号:忘れた
          • パケット長:skb->len
          • ヘッダ長:skb_headlen(skb)
          • データ長:skb->data_len
      • コンパイル・アンロード・ロード   
        • # make M=driver/net/wireless/intel/iwlwifi/
        • # rmmod iwlmvm
        • # insmod linux-4.5.5/driver/net/wireless/intel/iwlwifi/mvm/iwlmvm.ko
    • 書き換えてから trace-cmd を再度実行


今回は,送信完了処理で呼ばれるデバッグ用の関数をヘッダ情報も出力させるように変更した.
毎回コンパイルが面倒ならばSystemTapとか使えば多少楽になるかも...