summaryrefslogtreecommitdiff
path: root/meta-google/recipes-google/networking/gbmc-bridge.bb
blob: 09bf2ae663a17f5c76f9aa702c6bb191f25901a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
SUMMARY = "Configures the gbmc bridge and filter rules"
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"

inherit systemd

FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI += " \
  file://-bmc-gbmcbr.netdev \
  file://-bmc-gbmcbr.network.in \
  file://-bmc-gbmcbrdummy.netdev \
  file://-bmc-gbmcbrdummy.network \
  file://+-bmc-gbmcbrusb.network \
  file://ipmi.service.in \
  file://50-gbmc-br.rules \
  file://gbmc-br-ula.sh \
  file://gbmc-br-from-ra.sh \
  file://gbmc-br-ensure-ra.sh \
  file://gbmc-br-ensure-ra.service \
  file://gbmc-br-gw-src.sh \
  file://gbmc-br-nft.sh \
  file://gbmc-br-dhcp.sh \
  file://50-gbmc-psu-hardreset.sh \
  file://gbmc-br-dhcp.service \
  file://gbmc-br-dhcp-term.sh \
  file://gbmc-br-dhcp-term.service \
  file://gbmc-br-lib.sh \
  file://gbmc-br-load-ip.service \
  file://gbmc-start-dhcp.sh \
  file://50-gbmc-br-cn-redirect.rules \
  "

FILES:${PN}:append = " \
  ${datadir}/gbmc-ip-monitor \
  ${datadir}/gbmc-br-dhcp \
  ${datadir}/gbmc-br-lib.sh \
  ${systemd_unitdir}/network \
  ${sysconfdir}/nftables \
  ${sysconfdir}/avahi/services \
  "

RDEPENDS:${PN}:append = " \
  bash \
  dhcp-done \
  gbmc-ip-monitor \
  mstpd-mstpd \
  network-sh \
  ndisc6-rdisc6 \
  nftables-systemd \
  "

SYSTEMD_SERVICE:${PN} += " \
  gbmc-br-ensure-ra.service \
  gbmc-br-dhcp.service \
  gbmc-br-dhcp-term.service \
  gbmc-br-load-ip.service \
  "

GBMC_BR_MAC_ADDR ?= ""

# Generated via https://cd34.com/rfc4193/ based on a MAC from a machine I own
# and we allocated it downstream. Intended to only be used within a complete
# system of multiple network endpoints.
GBMC_ULA_PREFIX = "fdb5:0481:10ce:0"

def mac_to_eui64(mac):
  if not mac:
    return ''
  b = [int(c, 16) for c in mac.split(':')]
  b[0] ^= 2
  b.insert(3, 0xfe)
  b.insert(3, 0xff)
  idx = range(0, len(b)-1, 2)
  return ':'.join([format((b[i] << 8) + b[i+1], '04x') for i in idx])

GBMC_BRIDGE_INTFS ?= ""

ethernet_bridge_install() {
  # install udev rules if any
  if [ -z "${GBMC_BRIDGE_INTFS}"]; then
    return
  fi
  cat /dev/null > ${WORKDIR}/-ether-bridge.network
  echo "[Match]" >> ${WORKDIR}/-ether-bridge.network
  echo "Name=${GBMC_BRIDGE_INTFS}" >>  ${WORKDIR}/-ether-bridge.network
  echo "[Network]" >> ${WORKDIR}/-ether-bridge.network
  echo "Bridge=gbmcbr" >> ${WORKDIR}/-ether-bridge.network

  install -d ${D}/${sysconfdir}/systemd/network
  install -m 0644 ${WORKDIR}/-ether-bridge.network ${D}/${sysconfdir}/systemd/network/
}

do_install() {
  netdir=${D}${systemd_unitdir}/network
  install -d -m0755 $netdir

  if [ ! -z "${GBMC_BR_MAC_ADDR}" ]; then
    sfx='${@mac_to_eui64(GBMC_BR_MAC_ADDR)}'
    addr="[Address]\nAddress=${GBMC_ULA_PREFIX}:$sfx/64\nPreferredLifetime=0\n"
    addr="$addr[Address]\nAddress=fe80::$sfx/64\nPreferredLifetime=0"
    sed -i "s,@ADDR@,$addr," ${WORKDIR}/-bmc-gbmcbr.network.in
  else
    sed -i '/@ADDR@/d' ${WORKDIR}/-bmc-gbmcbr.network.in
  fi

  ethernet_bridge_install

  install -m0644 ${WORKDIR}/-bmc-gbmcbr.netdev $netdir/
  install -m0644 ${WORKDIR}/-bmc-gbmcbr.network.in $netdir/-bmc-gbmcbr.network
  install -m0644 ${WORKDIR}/-bmc-gbmcbrdummy.netdev $netdir/
  install -m0644 ${WORKDIR}/-bmc-gbmcbrdummy.network $netdir/
  install -m0644 ${WORKDIR}/+-bmc-gbmcbrusb.network $netdir/

  nftables_dir=${D}${sysconfdir}/nftables
  install -d -m0755 "$nftables_dir"
  install -m0644 ${WORKDIR}/50-gbmc-br.rules $nftables_dir/
  install -m0644 ${WORKDIR}/50-gbmc-br-cn-redirect.rules $nftables_dir/

  avahi_dir=${D}${sysconfdir}/avahi/services
  install -d -m 0755 "$avahi_dir"
  sed -i 's,@MACHINE@,${MACHINE},g' ${WORKDIR}/ipmi.service.in
  sed -i 's,@EXTRA_ATTRS@,,g' ${WORKDIR}/ipmi.service.in
  sed 's,@NAME@,bmc,g' ${WORKDIR}/ipmi.service.in >${avahi_dir}/bmc.ipmi.service
  sed 's,@NAME@,${MACHINE}-bmc,g' ${WORKDIR}/ipmi.service.in >${avahi_dir}/${MACHINE}-bmc.ipmi.service

  mondir=${D}${datadir}/gbmc-ip-monitor
  install -d -m0755 "$mondir"
  install -m0644 ${WORKDIR}/gbmc-br-ula.sh "$mondir"/
  install -m0644 ${WORKDIR}/gbmc-br-from-ra.sh "$mondir"/
  install -m0644 ${WORKDIR}/gbmc-br-gw-src.sh "$mondir"/
  install -m0644 ${WORKDIR}/gbmc-br-nft.sh "$mondir"/

  install -d -m0755 ${D}${libexecdir}
  install -m0755 ${WORKDIR}/gbmc-br-ensure-ra.sh ${D}${libexecdir}/
  install -m0755 ${WORKDIR}/gbmc-br-dhcp.sh ${D}${libexecdir}/
  install -m0755 ${WORKDIR}/gbmc-br-dhcp-term.sh ${D}${libexecdir}/
  install -d -m0755 ${D}${systemd_system_unitdir}
  install -m0644 ${WORKDIR}/gbmc-br-ensure-ra.service ${D}${systemd_system_unitdir}/
  install -m0644 ${WORKDIR}/gbmc-br-dhcp.service ${D}${systemd_system_unitdir}/
  install -m0644 ${WORKDIR}/gbmc-br-dhcp-term.service ${D}${systemd_system_unitdir}/
  install -m0644 ${WORKDIR}/gbmc-br-load-ip.service ${D}${systemd_system_unitdir}/
  install -d -m0755 ${D}${datadir}/gbmc-br-dhcp
  install -m0644 ${WORKDIR}/50-gbmc-psu-hardreset.sh ${D}${datadir}/gbmc-br-dhcp/

  install -m0644 ${WORKDIR}/gbmc-br-lib.sh ${D}${datadir}/

  install -d ${D}/${bindir}
  install -m0755 ${WORKDIR}/gbmc-start-dhcp.sh ${D}${bindir}/
}

do_rm_work:prepend() {
  # HACK: Work around broken do_rm_work not properly calling rm with `--`
  # It doesn't like filenames that start with `-`
  rm -rf -- ${WORKDIR}/-*
}