Slide 1

Slide 1 text

3日間で作る フルスクラッチHTTPサーバー on STM32F767 Nucleo VTb(@PiBVT)

Slide 2

Slide 2 text

目次 ● 自己紹介等 ● 今回作ったもの ● そもそもの経緯 ● STM32F767 Nucleoとは? ● 全体の設計 ● 自作プロトコルスタックについて ● 専用プロキシについて ● HTTPサーバーについて ● 色々動かす ● 今後の展望 ● おわりに

Slide 3

Slide 3 text

自己紹介等 ● VTb(@PiBVT) ● プログラミング歴2年の初心者 ● 最近の悩みはオブジェクト指向言語・データ構造 ● C++分からん

Slide 4

Slide 4 text

今回作ったもの STM32F767 Nucleo上で動くHTTP(over UDP)サーバーon自作プロトコルスタック ● なぜTCPじゃない? => TCPを3日で実装できるほどプロじゃないから。 ● なぜマイコン上? => なんとなく。楽しそうだったから。 ● lwIPって知ってる? => 知ってるけど自作した。楽しそうだったから。 ● 何の意味があるの? => 意味なんて無いです。楽しそうだったから。 ● アホですか? => はい。アホです。 楽しさだけを追い求めました。

Slide 5

Slide 5 text

そもそもの経緯 1. 去年のセキュキャン後、自作OS上にHTTP サーバーを実装した(デバドラから) 2. 当然のことながらまともに動作しない 3. ならベアメタルしやすい環境で一度練習しとこ 4. 時間なかった 5. せや、over UDPにしたろ 6. なんか動いた

Slide 6

Slide 6 text

STM32F767 Nucleoとは? ● STM32F767ZIとST-Linkを搭載したボード ● ARMな32bitマイコン(ARM Cortex-M7) ● RAM:512KB ROM:2MB ● 専用の開発環境(TrueStudio, SW4STM32) とUSB経由の書き込み ● PICやAVRに比べて高性能 ● ミドルウェアも充実(lwIP,FreeRTOS等) ● 割と安い(2000~3000円程度) https://www.st.com/ja/evaluation-tools/nucleo-f767zi.htmlより

Slide 7

Slide 7 text

全体の設計 ● TCPの実装は間に合わないため、専用プロキシでTCP ⇔ UDPの変換を行う ● F767上ではUDPを処理する ● HTMLはF767上でハードコーディング(FSは間に合わない)

Slide 8

Slide 8 text

自作プロトコルスタックについて ● 1to1で接続している状況で必要な最低限 なものだけを実装 ● ARP : MAC ⇔ IPアドレスの変換に必要 ● IP : ICMP, UDPの通信に必要 ● ICMP : pingは打てるようにしておきたい ● UDP : HTTPの通信に必要 OSみたいにカーネルスレッドとしては動かず、 main関数内でethernet_if_rx()が無限に回り、 上の層の関数を叩くだけ。 my

Slide 9

Slide 9 text

自作プロトコルスタックについて -ARP- ● RFC 826を参考にした(https://tools.ietf.org/html/rfc826) ● 唯一全ての機能を実装してある ● ARP Requestを受け取ると、ARP Replyを返す簡単なもの

Slide 10

Slide 10 text

自作プロトコルスタックについて -ICMP- ● RFC 792を参考にした(https://tools.ietf.org/html/rfc792) ● pingに必要なEchoとEcho Replyのみ実装 ● Linuxのpingはタイムスタンプも織り込む必要があるようだが、適当に受信した EchoのタイムスタンプをコピーしてEcho Replyに入れた。

Slide 11

Slide 11 text

自作プロトコルスタックについて -UDP- ● RFC 768を参考にした(https://tools.ietf.org/html/rfc768) ● UDP自体は完全な実装だが、IPv4の実装がガバガバ。 ● HTTPサーバー側から叩きやすいようにAPIを整備した(つもり)

Slide 12

Slide 12 text

専用プロキシについて ● TCP ⇔ UDPの変換を行う超手抜きなプロキシ ● 実質サーバーな気もするが気にしたら負け。

Slide 13

Slide 13 text

HTTPサーバーについて ● index.htmlだけしか存在しない ● それ以外は全て404 Not Found ● ハードコーディングされた文字列を送り返すだけ。 ● 時間なかったんや。許して。

Slide 14

Slide 14 text

色々動かす ● arp-scanでF7を探してみる ● pingで反応があるか確認 ● curlでとりあえずHello Worldを確認 ● firefoxで見てみる

Slide 15

Slide 15 text

今後の展望 ● やっぱりTCPは動かしたい。 ● BSDソケットぽいものにしたい。 ● FAT読めるようにしてSDカードからHTMLファイル読み出したい。 ● 他の処理も同時にしたい。 結論:自作OSしよう

Slide 16

Slide 16 text

おわりに ● 既存のプロトコルスタックはすごい! ● TCP/IPはすごい! ● 最近のマイコンはすごい! ● ソースコードはさすがに今のままでは公開しません....