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 が、任意の間隔で更新されます。その実行経路 を説明してください。
環境と推測は下記の通りです。
- NICにiwm0を使用して、WiFi接続で利用
- アクセスポイント若しくはNICが無線レーヤーで、接続チャネル等を変更してると推 測
- DHCPのリース間隔は4時間と設定されてるが、それよりずっと短いランダムな時間間 隔で更新されてる
最初の回答
OpenBSD 7.7 で /etc/resolv.conf
がランダム間隔で更新される場合、典型的な経路は DHCP クライアント (dhcpleased
) または resolvd
がトリガーする書き換え です。
WiFi 接続 (iwm0
) の場合、物理リンクの変化や AP 側の動作がトリガーになることが多く、DHCP のリース更新間隔とは無関係に発生します。
## 実行経路の概要
- 無線層でのイベント発生
iwm0
ドライバは、AP のチャンネル変更、再認証、電波減衰によるリンク一時切断・再接続などを検知します。- これらのイベントは
net80211
サブシステムからifconfig iwm0
のlink state
変更としてネットワークスタックに伝達されます。
netstart
系サービス →dhcpleased
へ通知ifstate
が DOWN→UP に変わると、=/etc/hostname.iwm0= に基づきdhcpleased
がそのインターフェースに対し DHCP リクエストを再送します。- DHCP サーバが再度リースを発行し、DNS 情報(=option domain-name-servers=)を提供。
dhcpleased
→resolvd
へ通知- OpenBSD 7.7 では、=dhcpleased= は直接
/etc/resolv.conf
を書き換えません。 - 代わりに
resolvd
デーモンへpledge=/=unveil
制約下で DNS サーバリストの更新要求 を送ります(UNIX ドメインソケット/dev/resolv
を介して)。 resolvd
が/etc/resolv.conf
を再生成し、タイムスタンプが更新されます。
- OpenBSD 7.7 では、=dhcpleased= は直接
- 結果
- DHCP リースの有効期限(4時間)とは無関係に、/WiFi 再接続のたび/に
/etc/resolv.conf
が更新される。 - 更新間隔がランダムに見えるのは、AP や NIC の無線レイヤー動作(チャネル変更、電波環境変動)による再認証が不規則だから。
- DHCP リースの有効期限(4時間)とは無関係に、/WiFi 再接続のたび/に
## 確認方法
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)に沿って説明します。
- 無線リンク状態の変化が発生
アクセスポイントのチャネル変更・ローミング・電波状態の悪化・省電力復帰などで、802.11 の状態が
RUN⇄ASSOC/SCAN
に揺れます。OpenBSD の net80211(=ieee80211(9)=)スタックは、その状態遷移に応じてインタフェースの「リンク状態」を更新します(LINK_STATE_UP/DOWN
)。この変化は /routing socket/(=route(4)=)へ /RTM_IFINFO
/ 等の通知として流れます。([man.openbsd.org][1]) - dhcpleased(8) がリンク変化を受信 → DHCP 動作
dhcpleased
はインタフェース状態を監視しており(AUTOCONF4 が有効な if で)、リンクが上がった/再協調したタイミングで 新規 DISCOVER/REQUEST や RENEW を即座に投げます。これにより /リース時間(例: 4 時間)とは無関係に/、リンクイベントのたびに DHCP が走ることがあります。([man.openbsd.org][2]) - 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]) - 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歩さがる(かも)なんて 話もあって、呆きなく読めたよ。