dhcpleased

Table of Contents

my writing env

前回は、ひょんな事からmarkdown -> org な変換器をやった。今となっては、 markdownがデフォルトっぽいけど、オイラーがWebに進出した時は、そんなの 影も形も無かったぞ。ってな事で、自分史を少し書いておく。

生htmlの時代

htmlタグの勉強を兼ねて、生ファイルを編集してましたねぇ。それがcgiの作成に 大いに役立った。そのうちに、決まりきったタグはテンプレートを用意しておけば いいじゃんって気がついた。そんな時代が長く続いた。

piki

原稿のスタイルが決ってしまうと(プリタグ内にソースを記述、リンクを張る、見出しを 書く)、これらを簡単に記述したいぞ、となった。

mewな人がhaskellの勉強を兼ねてpikiってのを公開された。wikiの簡易版って ことで、それなりに名前が似てる。 これも長く使ってたなあ。

でも、OSを代えたりすると、その度にhaskellを 入れてコンパイルしなきゃならん。それはいいんだけど、使ってるパッケージが ずっとサポートされてるかって心配が出てきた。

org-mode

ならば、デフォで公開されてるものが安心だろう。目をつけたのがemacsのorg-mode。 これなら、emacsがインストール出来れば、執筆環境は自然に整った事になる。 OSを問わずに利用できるのが良い。そして余計なパッケージ導入の必要は全く 無し。

見出し毎に、文章を折り畳めるのも得点が高いぞ。html化は、C-c C-e h hでできる。 コードブロックは、<e してTABすれば穴が空くので、そこに書くだけ。 リンクは、C-c C-l して、リンクのURL、説明を記述するだけ。

;; org - eww
(defun org-eww ()
       "OrgファイルをHTMLにエクスポートし、ewwで開く"
       (interactive)
       (org-html-export-to-html)
       (eww-open-file (concat
                       (file-name-sans-extension buffer-file-name)
                       ".html")))

プリチェックは、こんなんでOK。これを実行すると、同一階層に、htmlファイルも 自動作成される。ewwだと、cssは無視されるんで、最終的には、firefox等で確認 するのが良さそう。ああ、cssファイルはpikiの時代に使ってたのをそのまま利用 してるんで、piki.cssだ。

markdown-mode

emacsでmarkdownやる場合、パッケージになってるmarkdown-modeが鉄板らしい。主機能は *.md ファイルの 編集だ。それに加えて、html化したり、閲覧したりも必要。そんな為の 変換器は、外部のアプリ任せ。良く使われるのは、pandocって奴らしい。 Lubuntuには、何時の間にか侵入してたぞ。外来生物(失礼だな)なんだな。 OpenBSDでもパッケージになってた。意図的に導入しないと鎮座しない。 そして、その住処を登録しないと、利用できない。

(setq markdown-command "/usr/local/bin/pandoc")

山のようにある編集コマンドを駆使して編集できたら、閲覧だな。C-c C-c p すればfirefoxが起動してhtmlを確認できる。htmlファイルとして保存したいなら C-c C-c e だ。エクスポートしろだな。

その他、impatient-modeなんてのを追加で入れると、編集具合をリアルタイムで ブラウザーから確認も可能らしい。人間の欲望って際限が無いな。だから、70,80 になっても、怪しい投資話に首をつっこみ、全財産を失なってしまうんだな。 お釈迦様も言ってるけど、足るを知るってのが大事だぞ。

markdownの流行は、githubが火付け役か。最近では、 OpenAI⁠⁠、AIコーディングエージェントをガイドするための「AGENTS.md」サイトを公開 こんな方面にも進出するぽい。

ChatGPTは、どう回答するか

grok.com に質問したのと同じのをChatGPTにも投げてみる(前回参照)。

Q: OpenBSD 7.7 で、/etc/resolv.conf が、任意の間隔で更新されます。その実行経路 を説明してください。

環境と推測は下記の通りです。

  1. NICにiwm0を使用して、WiFi接続で利用
  2. アクセスポイント若しくはNICが無線レーヤーで、接続チャネル等を変更してると推 測
  3. DHCPのリース間隔は4時間と設定されてるが、それよりずっと短いランダムな時間間 隔で更新されてる

最初の回答

OpenBSD 7.7 で /etc/resolv.conf がランダム間隔で更新される場合、典型的な経路は DHCP クライアント (dhcpleased) または resolvd がトリガーする書き換え です。 WiFi 接続 (iwm0) の場合、物理リンクの変化や AP 側の動作がトリガーになることが多く、DHCP のリース更新間隔とは無関係に発生します。


## 実行経路の概要

  1. 無線層でのイベント発生
    • iwm0 ドライバは、AP のチャンネル変更、再認証、電波減衰によるリンク一時切断・再接続などを検知します。
    • これらのイベントは net80211 サブシステムから ifconfig iwm0link state 変更としてネットワークスタックに伝達されます。
  2. netstart 系サービス → dhcpleased へ通知
    • ifstate が DOWN→UP に変わると、=/etc/hostname.iwm0= に基づき dhcpleased がそのインターフェースに対し DHCP リクエストを再送します。
    • DHCP サーバが再度リースを発行し、DNS 情報(=option domain-name-servers=)を提供。
  3. dhcpleasedresolvd へ通知
    • OpenBSD 7.7 では、=dhcpleased= は直接 /etc/resolv.conf を書き換えません。
    • 代わりに resolvd デーモンへ pledge=/=unveil 制約下で DNS サーバリストの更新要求 を送ります(UNIX ドメインソケット /dev/resolv を介して)。
    • resolvd/etc/resolv.conf を再生成し、タイムスタンプが更新されます。
  4. 結果
    • DHCP リースの有効期限(4時間)とは無関係に、/WiFi 再接続のたび/に /etc/resolv.conf が更新される。
    • 更新間隔がランダムに見えるのは、AP や NIC の無線レイヤー動作(チャネル変更、電波環境変動)による再認証が不規則だから。

## 確認方法

  • resolvd の動作ログ
doas rcctl set resolvd flags -d
doas rcctl restart resolvd
tail -f /var/log/messages

更新時刻とトリガーを確認できます。

  • dhcpleased のイベント
doas rcctl set dhcpleased flags -v
doas rcctl restart dhcpleased
tail -f /var/log/messages

再リース取得のタイミングが見えます。

  • WiFi 接続状態の変化
ifconfig iwm0
dmesg | grep iwm0

state: associated -> scanning -> associated のような変化が更新トリガー。


## まとめ図(簡易)

[iwm0 link変化]
     │
 net80211
     │
ifconfig link state change
     │
dhcpleased  --(DNS情報)-->  resolvd  --> /etc/resolv.conf 更新

もし希望があれば、この /etc/resolv.conf 更新に至る /ソースコード上の関数呼び出し経路/(=iwm= ドライバ → net80211 → ifstate → dhcpleased → resolvd)を、実際のファイル名と関数名で追跡して説明できます。 それをやると、「どのカーネルイベントがユーザー空間まで来て最終的にファイルを書き換えているか」が完全に見えます。

次の回答

了解です。OpenBSD 7.7 で /etc/resolv.conf が“ランダム”に短い間隔で書き換わる典型的な実行経路(イベントの流れ)を、iwm0 を使った Wi-Fi 環境(推測条件 1–3)に沿って説明します。

  1. 無線リンク状態の変化が発生 アクセスポイントのチャネル変更・ローミング・電波状態の悪化・省電力復帰などで、802.11 の状態が RUN⇄ASSOC/SCAN に揺れます。OpenBSD の net80211(=ieee80211(9)=)スタックは、その状態遷移に応じてインタフェースの「リンク状態」を更新します( LINK_STATE_UP/DOWN )。この変化は /routing socket/(=route(4)=)へ / RTM_IFINFO / 等の通知として流れます。([man.openbsd.org][1])
  2. dhcpleased(8) がリンク変化を受信 → DHCP 動作 dhcpleased はインタフェース状態を監視しており(AUTOCONF4 が有効な if で)、リンクが上がった/再協調したタイミングで 新規 DISCOVER/REQUESTRENEW を即座に投げます。これにより /リース時間(例: 4 時間)とは無関係に/、リンクイベントのたびに DHCP が走ることがあります。([man.openbsd.org][2])
  3. dhcpleased が学んだ DNS を “提案” として通知 dhcpleased は得た DNS サーバ(option 6)を routing socket 経由の「nameserver proposal」 としてユーザ空間へ通知します。これは route(8) nameserver と同じ経路(DNS 提案プロトコル)で送られ、=resolvd= がこれを受け取ります。OpenBSD 7.0 で route nameserver が追加され、この提案メカニズムが整備されました。([man.openbsd.org][3], [openbsd.org][4])
  4. resolvd(8) が提案を集約し /etc/resolv.conf を生成 resolvd は /routing socket を監視/し、=dhcpleased=(DHCPv4)や slaacd=(RA の RDNSS などの IPv6 DNS)、=umb(4) 等から届く /DNS 提案を優先度付きでマージ/して /etc/resolv.conf を/上書き生成/します(必要に応じてユーザの手編集行を末尾に保持)。したがって、/DHCP リースの残存時間に関係なく/、Wi-Fi の再接続や RA の更新が起きるたびに /etc/resolv.conf が更新され得ます。([man.openbsd.org][5])

まとめると: iwm0 のリンク揺れ → カーネルが RTM_IFINFO 通知 → dhcpleased が即再交渉・DNS を提案 → resolvd が `/etc/resolv.conf` を再生成 という経路で、結果として “任意(に見える)短い間隔”で書き換わります。 (FAQ でも DHCP は起動・再接続時に DNS を取得すると説明されています) ([openbsd.org][6])


## なぜ「ランダムな短い間隔」に見えるのか(推測条件との対応)

  • Wi-Fi のチャネル変更/ローミング(推測 2) AP 側のチャネル切り替えやビームフォーミング等で一瞬リンクが落ちる→再接続となり、そのたびに 1)〜4) が回るため、\/\/リース 4 時間より短い“イベント駆動”\/\/で更新されます。=ieee80211(9)= の状態機械がこれをトリガにします。([man.openbsd.org][1])
  • IPv6 の RDNSS(slaacd) 同じ SSID でも RA による RDNSS の寿命が短いと、その更新でも resolvd/etc/resolv.conf を再生成します(IPv4 DHCP のリースとは別タイムライン)。=resolvd= は /dhcpleased と slaacd の両方/の提案を取り込みます。([man.openbsd.org][5])

## 事実確認のためのオンボックス観察手順

  • routing socket の生メッセージを見る
doas route monitor

RTM_IFINFO (リンク up/down)や nameserver 提案が見えます。([man.openbsd.org][7])

  • デーモンのログを追う
doas logctl -f -s dhcpleased,resolvd,slaacd

dhcpleased の再交渉や resolvd の「writing /etc/resolv.conf」ログが並ぶはずです。 (=resolvd= は -dv で前面起動して詳細ログも可能。)([man.openbsd.org][8], [FreeBSDマニュアルページ][9])

  • DHCP トラフィックを直接見る
doas tcpdump -ni iwm0 port 67 or port 68

リンク変化の直後に DISCOVER/REQUEST/ACK が流れていれば、更新の直接原因が DHCP 再交渉と分かります。 (一般的手法のため参考文献は省略)

  • サービスの有効性を確認
rcctl ls on | egrep 'dhcpleased|resolvd|slaacd|unwind'

## 望ましい対処の方向性(必要に応じて)

  • resolvd に DNS を触らせたくないresolvd を停止し、固定の /etc/resolv.conf を置く。もしくは route nameserver <if> <addr...> で手動提案を上書きする。(=route nameserver= は提案の追加/削除が可能)([man.openbsd.org][3], [FreeBSDマニュアルページ][9])
  • 提案元を絞る → 例:=slaacd= を無効化して IPv6 の RDNSS 提案を止め、DHCPv4 のみにする(環境に応じて)。([man.openbsd.org][5])
  • Wi-Fi のリンク揺れそのものを減らす → 固定チャネルの AP 設定、混雑帯域の回避、アンテナ/電波品質の改善、=ifconfig iwm0 powersave off= の評価など(機器・環境依存)。

## 要点(箇条書き再掲)

  • iwm0 のリンク揺れ → /カーネルが RTM_IFINFO 通知/。([man.openbsd.org][7])
  • dhcpleased が状態変化を検知し /即時に DHCP を実行/。([man.openbsd.org][2])
  • dhcpleased=/=slaacd などが \/\/routing socket の「nameserver 提案」\/\/で DNS を通知。([man.openbsd.org][3])
  • resolvd が提案を /集約して /etc/resolv.conf を生成(上書き)/。([man.openbsd.org][5])

このパスが、リース 4 時間より短い/イベント駆動の更新/として現れる理由です。必要でしたら、上記の観察コマンド結果を読み解くお手伝いもします。

[1]: https://man.openbsd.org/ieee80211.9?=utm_source==chatgpt.com "ieee80211(9) - OpenBSD manual pages"

[2]: https://man.openbsd.org/OpenBSD-7.2/dhcpleased.8?=utm_source==chatgpt.com "dhcpleased(8) - OpenBSD manual pages"

[3]: https://man.openbsd.org/route?=utm_source==chatgpt.com "route(8) - OpenBSD manual pages"

[4]: https://www.openbsd.org/plus70.html?=utm_source==chatgpt.com "OpenBSD 7.0 Changelog"

[5]: https://man.openbsd.org/resolvd?=utm_source==chatgpt.com "resolvd(8) - OpenBSD manual pages"

[6]: https://www.openbsd.org/faq/faq6.html?=utm_source==chatgpt.com "OpenBSD FAQ: Networking"

[7]: https://man.openbsd.org/route.4?=utm_source==chatgpt.com "route(4) - OpenBSD manual pages"

[8]: https://man.openbsd.org/dhcpleased.8?=utm_source==chatgpt.com "dhcpleased(8) - OpenBSD manual pages"

[9]: https://man.freebsd.org/cgi/man.cgi?manpath=OpenBSD+7.7&query=resolvd&sektion=8&utm_source=chatgpt.com "resolvd(8) - FreeBSD Manual Pages"

dhcpleased

昔の名前はdhclientだったような。OpenBSD 6.9の時、独自書き下しされた奴。 それまでは外来の奴を利用してた。でも、それでは機能不足があったので、一から 開発した。

どんな風に設定されたか取得できる。これqemuが提供してる DHCPサーバーからの返答(のまとめ)。

qe$ dhcpleasectl -l em0
em0 [Bound]
        inet 10.0.2.15 netmask 255.255.255.0
        default gateway 10.0.2.2
        nameservers 10.0.2.3
        lease 24 hours
        dhcp server 10.0.2.2

リース期間が24時間と長めな設定になってる。対してVMWareでは30分になってる。 光回線からのものだと、2時間だったり、4時間だったりとまちまちなのが面白い。

これからdhcpleasedの挙動を探っていきたいけど、その前に一つ注意を。 それはオペレーションはコンソール上でやれって事。途中でネットを切断するとかも 有るので、そんな場合ssh接続じゃ具合が悪いからね。

こんな風に、起動。

qe$ doas rcctl start dhcpleased
dhcpleased(ok)

その時のサーバーとの通信を傍受。

qe$ doas tcpdump -ni em0 port 67 or port 68
tcpdump: listening on em0, link-type EN10MB
06:40:16.064286 0.0.0.0.68 > 255.255.255.255.67:  xid:0x730577d [|bootp] [tos 0x10]
06:40:16.064571 10.0.2.2.67 > 255.255.255.255.68:  xid:0x730577d Y:10.0.2.15 S:10.0.2.2 ether 52:54:00:12:34:56 [|bootp] [tos 0x10]

サーバーのIPがまだ不明なので、同一ネット上で、だれか答ってリクエスト。それに 対して応答がありましたって事だ。

でも、ちょっと内容を理解しがたいな。ええ、そんな時はwiresharkみたいな、 パケット解析器を使えってのが常道であります。でも、dhcpleasedの作者さんは 親切にも、解析器を自前提供してくれています。

qe#  /sbin/dhcpleased -d -vv
state_transition[em0] Down -> Rebooting, timo: 1
DHCPREQUEST on em0
parse_dhcp, from: 52:55:0a:00:02:02, to: ff:ff:ff:ff:ff:ff
parse_dhcp: 10.0.2.2:67 -> 255.255.255.255:68
dhcp_hdr op: Boot Reply (2)
dhcp_hdr htype: Ethernet (1)
dhcp_hdr hlen: 6
dhcp_hdr hops: 0
dhcp_hdr xid: 0x833b9595
dhcp_hdr secs: 0
dhcp_hdr flags: 0x0
dhcp_hdr ciaddr: 0.0.0.0
dhcp_hdr yiaddr: 10.0.2.15
dhcp_hdr siaddr: 10.0.2.2
dhcp_hdr giaddr: 0.0.0.0
dhcp_hdr chaddr: 52:54:00:12:34:56 (00000000000000000000)
DHO_DHCP_MESSAGE_TYPE: DHCPACK
DHO_DHCP_SERVER_IDENTIFIER: 10.0.2.2
DHO_SUBNET_MASK: 255.255.255.0
DHO_ROUTER: 10.0.2.2
DHO_DOMAIN_NAME_SERVERS: 10.0.2.3 (1/1)
DHO_DHCP_LEASE_TIME 86400s
DHO_END
DHCPACK on em0 from 52:55:0a:00:02:02/10.0.2.2 to ff:ff:ff:ff:ff:ff/255.255.255.255
adding 10.0.2.15 to em0 (lease from 10.0.2.2)
adding nameservers 10.0.2.3 (lease from 10.0.2.2 on em0)
state_transition[em0] Rebooting -> Bound, timo: 43200

リースとレンタル

アプリ名がdhcpリースとなってる。名前そのものが示すようにIPアドレス群をリースしてくれるんだな。 世の中には、似たような語句でレンタルってのが有るぞ。この違いは何?

A: リースとレンタルの違いを以下に簡潔に説明します。

### 1. 定義

  • リース: 主に長期的な契約で、特定の資産(車、機械、設備など)を一定期間借りて使用し、月々の支払いを行う仕組み。契約期間は数年単位が多く、所有権はリース会社に残る。
  • レンタル: 短期間の利用を目的に資産を借りる仕組み。契約期間は数時間から数か月と短く、柔軟性が高い。所有権はレンタル会社にある。

### 2. 主な違い

項目 リース レンタル
契約期間 長期(1~5年以上が一般的) 短期(数時間~数か月)
目的 事業用や長期的な利用(例:業務用機器、車両) 一時的な利用(例:旅行、レジャー、イベント)
費用 月額固定料金、総額は高め 短期利用のため単価は高いが総額は抑えられる
メンテナンス 契約によりリース会社が負担する場合あり 通常、利用者が責任を持つ
契約の柔軟性 契約期間中の解約は困難 柔軟に解約や延長が可能
所有権 契約終了後に購入オプションがある場合も 所有権は常にレンタル会社

### 3. 具体例

  • リース: 会社が業務用コピー機や社用車を数年間借りる。契約満了時に買い取りや返却を選択可能。
  • レンタル: 旅行中にレンタカーを数日間借りる、イベントでプロジェクターを1日だけ借りる。

### 4. メリットとデメリット

  • リースのメリット: 初期費用が抑えられ、最新設備を導入しやすい。メンテナンスが含まれる場合も。
    • デメリット: 長期契約のため中途解約が難しく、総コストが高くなる可能性。
  • レンタルのメリット: 短期間の利用に便利で、必要な時だけ使える柔軟性。
    • デメリット: 長期利用だと割高になり、メンテナンスは自己負担の場合が多い。

### 5. 選び方のポイント

  • 長期間使用する場合はリースが経済的。
  • 一時的・短期的なニーズにはレンタルが適している。

この説明によれば、DHCPレンタルの方が適切に思えるけど、どうよ? スマホなんかだと 一定期間使用後、返却するか買い取るか選べる契約が有るな。もろにリースじゃん。 リースって謳わないのは、日本人の心象に合わないからか。

from kernel

こんな風にdhcpleasedを下げて上げてみる。

qe$ doas rcctl restart dhcpleased
dhcpleased(ok)
dhcpleased(ok)

その記録が /var/log/daemon に残る。


Aug 21 07:00:39 qe dhcpleased[44100]: engine exiting
Aug 21 07:00:39 qe dhcpleased[70828]: frontend exiting
Aug 21 07:00:39 qe dhcpleased[14269]: terminating
Aug 21 07:00:43 qe dhcpleased[41449]: adding 10.0.2.15 to em0 (lease from 10.0.2.2)
Aug 21 07:00:43 qe dhcpleased[41449]: adding nameservers 10.0.2.3 (lease from 10.0.2.2 on em0)
Aug 21 07:00:43 qe resolvd[26506]: rebuilding: route proposals

遠く離れたrouteにも影響が出る。

qe$ route monitor       
got message of size 228 on Thu Aug 21 07:00:43 2025
RTM_ADD: Add Route: len 228, priority 0, table 0, if# 1, name em0, pid: 83936, seq 1, errno 17
flags:<UP,GATEWAY,STATIC,MPATH>
fmask:
use:        0   mtu:        0    expire:        0
locks:  inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA,LABEL>
 0.0.0.0 10.0.2.2 0.0.0.0 link#1 10.0.2.15 "dhcpleased"
got message of size 192 on Thu Aug 21 07:00:43 2025
RTM_ADD: Add Route: len 192, priority 3, table 0, if# 1, name em0, pid: 0, seq 0, errno 0
flags:<UP,HOST,DONE,LLINFO,CLONED>
fmask:
use:        0   mtu:        0    expire:        0
locks:  inits:
sockaddrs: <DST,GATEWAY,IFP,IFA>
 10.0.2.3 link#1 52:54:00:12:34:56 10.0.2.15
got message of size 192 on Thu Aug 21 07:00:43 2025
RTM_RESOLVE: Route created by cloning: len 192, priority 3, table 0, if# 1, name em0, pid: 0, seq 0, errno 0
flags:<UP,HOST,DONE,LLINFO,CLONED>
fmask:
use:        0   mtu:        0    expire:        0
locks:  inits:
sockaddrs: <DST,GATEWAY,IFP,IFA>
 10.0.2.3 52:55:0a:00:02:03 52:54:00:12:34:56 10.0.2.15
got message of size 228 on Thu Aug 21 07:00:43 2025
RTM_PROPOSAL: config proposal: len 228, source dhcp, table 0, if# 1, name em0, pid: 83936, seq 2, errno 0
flags:<UP,DONE>
fmask:
use:        0   mtu:        0    expire:        0
locks:  inits:
proposals: <DNS>
 INET [10.0.2.3]

もう少し過激に直接NICに触れてみる。

qe$ doas ifconfig em0 down
qe$ doas ifconfig em0 up

その時のダエモン君のログ。行儀正しくdhcpleasedを操作したのと同様だな。

Aug 22 06:03:53 qe dhcpleased[59923]: deleting nameservers 10.0.2.3 (lease from 10.0.2.2 on em0)
Aug 22 06:03:53 qe resolvd[73962]: rebuilding: route proposals
Aug 22 06:04:14 qe dhcpleased[59923]: deleting 10.0.2.15 from em0 (lease from 10.0.2.2)
Aug 22 06:04:15 qe dhcpleased[59923]: adding 10.0.2.15 to em0 (lease from 10.0.2.2)
Aug 22 06:04:15 qe dhcpleased[59923]: adding nameservers 10.0.2.3 (lease from 10.0.2.2 on em0)
Aug 22 06:04:15 qe resolvd[73962]: rebuilding: route proposals

この時のroute monitor結果をLOGし、ちょいと抜き出してみた。

qe$ grep RTM LOG | cut -b-75
RTM_IFINFO: iface status change: len 192, if# 1, name em0, link: no carrier
RTM_IFINFO: iface status change: len 192, if# 1, name em0, link: no carrier
RTM_DELETE: Delete Route: len 192, priority 131, table 0, if# 1, name em0,
RTM_DELETE: Delete Route: len 192, priority 132, table 0, if# 1, name em0,
RTM_DELETE: Delete Route: len 176, priority 129, table 0, if# 1, name em0,
RTM_DELETE: Delete Route: len 192, priority 1, table 0, if# 1, name em0, pi
RTM_DELADDR: address being removed from iface: len 96, if# 1, name em0, met
RTM_DELETE: Delete Route: len 228, priority 136, table 0, if# 1, name em0,
RTM_IFINFO: iface status change: len 192, if# 1, name em0, link: active, mt
RTM_NEWADDR: address being added to iface: len 96, if# 1, name em0, metric
RTM_ADD: Add Route: len 192, priority 1, table 0, if# 1, name em0, pid: 0,
RTM_ADD: Add Route: len 192, priority 4, table 0, if# 1, name em0, pid: 0,
RTM_ADD: Add Route: len 176, priority 1, table 0, if# 1, name em0, pid: 0,
RTM_ADD: Add Route: len 192, priority 3, table 0, if# 1, name em0, pid: 0,
RTM_ADD: Add Route: len 228, priority 8, table 0, if# 1, name em0, pid: 428
RTM_PROPOSAL: config proposal: len 228, source dhcp, table 0, if# 1, name e

なお、ユーザーランド側から見たルーチィング状態は次のようだった。

qe$ route -n show -inet
Routing tables

Internet:
Destination        Gateway            Flags   Refs      Use   Mtu  Prio Iface
default            10.0.2.2           UGS        0       73     -     8 em0
224/4              127.0.0.1          URS        0        0 32768     8 lo0
10.0.2/24          10.0.2.15          UCn        2        0     -     4 em0
10.0.2.2           52:55:0a:00:02:02  UHLch      1        2     -     3 em0
10.0.2.3           52:55:0a:00:02:03  UHLc       0       12     -     3 em0
10.0.2.15          52:54:00:12:34:56  UHLl       0       68     -     1 em0
10.0.2.255         10.0.2.15          UHb        0        0     -     1 em0
127/8              127.0.0.1          UGRS       0        0 32768     8 lo0
127.0.0.1          127.0.0.1          UHhl       1        2 32768     1 lo0

こういうバックヤードなやりとりは、カーネルを経由するそうだ。

こちらはNICの状態変化をカーネル側へ通知するんだな。./dev/pci/… とかも多数 出現してきたけど、省略した。

te$ grep LINK_STATE_UP -r .
 :
./net/if.h:#define LINK_STATE_UP                4       /* link is up */
./net/if.h:             ((_s) >= LINK_STATE_UP || (_s) == LINK_STATE_UNKNOWN)
./net/if.h:     { IFT_CARP, LINK_STATE_UP, "master" },                         \
./net/if.h:     { 0, LINK_STATE_UP, "active" },                                \
./net/if_enc.c: ifp->if_link_state = LINK_STATE_UP;
./net/if_enc.c:         nifp->if_link_state = LINK_STATE_UP;
./net/if_gre.c:                 link_state = LINK_STATE_UP;
./net/if_pair.c:                link_state = LINK_STATE_UP;
./net/if_spppsubr.c:            lstate = LINK_STATE_UP;
./net/if_vether.c:                      link_state = LINK_STATE_UP;
./net80211/ieee80211_pae_input.c:                               ieee80211_set_link_state(ic, LINK_STATE_UP);
./net80211/ieee80211_pae_input.c:                       ieee80211_set_link_state(ic, LINK_STATE_UP);
./net80211/ieee80211_pae_input.c:                       ieee80211_set_link_state(ic, LINK_STATE_UP);
./net80211/ieee80211_proto.c:                           ieee80211_set_link_state(ic, LINK_STATE_UP);
./netinet/ip_carp.c:                    sc->sc_if.if_link_state = LINK_STATE_UP;

こちらは、ルーティング情報がカーネル内で更新されたから、アプリ側(route)でも 同期してって案内送付なんだな。

te$ grep RTM_IFINFO -r .
./net/if_loop.c:                if_up(ifp);             /* send up RTM_IFINFO */
./net/route.h:#define RTM_IFINFO        0xe     /* iface going up/down etc. */
./net/rtsock.c:         case RTM_IFINFO:
./net/rtsock.c: case RTM_IFINFO:
./net/rtsock.c: case RTM_IFINFO:
./net/rtsock.c: m = rtm_msg1(RTM_IFINFO, &info);
./net/rtsock.c:         len = rtm_msg2(RTM_IFINFO, RTM_VERSION, &info, 0, w);

最後はお約束でgdbルしてみる。

(gdb) bt
#0  route_input (m0=0xd4a2e200, so0=0x0, sa_family=0 '\000')
    at /usr/src/sys/net/rtsock.c:507
#1  0xd09df67b in rtm_ifchg (ifp=0xd466d030)
    at /usr/src/sys/net/rtsock.c:1815
#2  0xd04daf32 in if_linkstate (ifp=0xd466d030)
    at /usr/src/sys/net/if.c:1792
#3  0xd04da46a in if_down (ifp=0xd466d030)
    at /usr/src/sys/net/if.c:1740
#4  0xd04dc10c in ifioctl (so=0xd4547480, cmd=2149607696,data=0xf57b54b0 "em0", p=0xd461fe18)
    at /usr/src/sys/net/if.c:2237
#5  0xd03abe16 in soo_ioctl (fp=0xd456b7e4, cmd=2149607696,data=0xf57b54b0 "em0", p=0xd461fe18)
    at /usr/src/sys/kern/sys_socket.c:134
#6  0xd0233375 in sys_ioctl (p=0xd461fe18, v=0xf57b55a0, retval=0xf57b5598)
    at /usr/src/sys/kern/sys_generic.c:509
#7  0xd06be629 in mi_syscall (p=0xd461fe18, code=<optimized out>,argp=<optimized out>, retval=<optimized out>, callp=<optimized out>)
    at /usr/src/sys/sys/syscall_mi.h:179
#8  syscall (frame=0xf57b55e0)
    at /usr/src/sys/arch/i386/i386/trap.c:558
#9  0xd0c5d81d in Xsyscall_untramp ()

README

ドナルド・トランプ 全解説 なんて本を読んでみた。

ひょっとしたら、日本の首相よりTVの露出度が高いんじゃなかろうか。それだけ 注目度がある、無茶爺。なんでこんな無茶爺が選ばれてしまったか解説されてて 、なるほどネェーでしたよ。どうも子分の副大統領がクセ者みたい。まあ、類は 友を呼ぶとも言うからね。

歴史を辿ってみると、体制の寿命は大体70年ぐらいらしい。出るべくして出て きた輩なんだな。終章は、水前寺清子の、3歩進んで2歩さがる(かも)なんて 話もあって、呆きなく読めたよ。


This year's Index

Home