EdgeRouter 4/6用 ndppd 0.2.5コンパイル

投稿者: | 10月 15, 2025

近頃ネットワークの調子が悪い。ログを見てみたら、接続に失敗しているBGPとndppdがloをつかもうとしているのを発見。AIにログを見てもらったら、ndppd古くない?と確かに古い。しかし、最新版も古い。一応最新版の0.2.5にしてみた。0.2.6もあるのだが、コンパイルしてみたら、0.2.4だった。なんなん

 

閑話休題

 

眠いので、メモのコピペ。コンパイラーのアーキテクチャを変えれば、EdgeRouter X用のバイナリもできると思う。

環境は、Ubuntu Server 24.04

Ubuntu 24.04 amd64
apt update
apt -y upgrade
apt -y install -y net-tools git vim make gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64
git clone -b master https://github.com/DanielAdolfsson/ndppd.git
cd ndppd
cp Makefile Makefile-edge
vim Makefile-edge
 
EdgeRouter Xでは、多分以下か?

apt -y install net-tools git vim make gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64

もちろん、この後のMakefileもそれなりに書き換える必要はあるが。EdgeRouter Xも持っているけど試していない。せっかくEdgeRouter XをもっているのにIPv6を使っていない知り合いはゴロゴロいる。

 
Makefile-edgeを書き換え。OBJS    = ${OBJS} src/nd-netlink.o Gitの元のファイルはスペルミスのような気がする。。。多分、前作ったやつはごっそりオブジェクトが欠損していたような。
EdgeRouter 4/6のCPUに最適化をしている。
以下を修正
CXXFLAGS = -Ofast -pipe -fno-strict-aliasing -ffunction-sections -fdata-sections \
-march=octeon -mtune=octeon -mabi=64
PREFIX = /config/ndppd/local
CXX = /usr/bin/mips64-linux-gnuabi64-g++
以下を PKG_CONFIGの次の行に追加
LDFLAGS = -static -Wl,–gc-sections
 
以下
OBJ = ${OBJ} src/nd-netlink.o
OBJS = ${OBJS} src/nd-netlink.o
に変更
 
コンパイル
必要じゃないけどストリップしてみた。
make -f Makefile-edge
file ./ndppd
mips64-linux-gnuabi64-strip -s ndppd
file ./ndppd
 
起動スクリプトは以下。loを掴まないようにしているつもりだが、やはり掴んじゃう。
~# cat /config/ndppd/ndppd.initscript
#!/bin/sh
 
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != “$INIT_D_SCRIPT_SOURCED” ] ; then
set “$0” “$@”; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
 
# Wait until any of the candidate uplink IFs is UP and has IPv6 LLA (fe80::).
pre_start() {
# List candidate uplink interfaces here (first match wins).
IFACES=”eth0″
MAX_WAIT=180 # seconds; increase if your WAN takes longer
 
echo “Waiting for uplink interface (state=UP, IPv6 LLA present)…”
i=0
READY_IF=””
 
while :; do
for IF in $IFACES; do
ip link show dev “$IF” >/dev/null 2>&1 || continue
LINK_UP=”$(ip link show dev “$IF” 2>/dev/null | grep -q ‘state UP’ && echo yes || echo no)”
HAS_LLA=”$(ip -6 addr show dev “$IF” 2>/dev/null | grep -qi ‘fe80::’ && echo yes || echo no)”
if [ “$LINK_UP” = “yes” ] && [ “$HAS_LLA” = “yes” ]; then
READY_IF=”$IF”
break
fi
done
[ -n “$READY_IF” ] && break
 
i=$((i+1))
if [ “$i” -ge “$MAX_WAIT” ]; then
echo “WARN: No ready IF after ${MAX_WAIT}s. Continuing anyway.”
break # Do NOT return non-zero; we still start ndppd
fi
sleep 1
done
 
if [ -n “$READY_IF” ]; then
echo “OK: $READY_IF is UP and has IPv6 LLA.”
else
echo “NOTE: Starting ndppd although no IF reported ready yet.”
fi
}
 
DESC=”NDP Proxy Daemon”
PIDFILE=/run/ndppd.pid
CONFIGFILE=/config/ndppd/ndppd.conf
DAEMON=/config/ndppd/local/sbin/ndppd
 
# Use only options supported by ndppd 0.2.5.
# -d : debug/foreground (works fine with init script)
# -v : verbose logs
# -c : config file
# -p : pid file
DAEMON_ARGS=”-d -v -c $CONFIGFILE -p $PIDFILE”
 
ndppd.confは割愛。
というか、IPv6ベタ書きなので個人情報。
 
とりあえず、ニコニコ動いていそう。少なくともAWSとOCIにはIPv6でログインできたので。

コメントを残す