blob: 028ef9bcf36c2ce878093228f858bf6c607565ac [file] [log] [blame]
Hyunsun Moonf9cac592020-11-10 00:46:41 -08001#!/bin/bash -x
2
3set -o errexit
4set -o pipefail
5set -o nounset
6
7exec 3>&1
8exec &>>/var/log/$(basename $0).log
9
10PATH="$CNI_PATH:$(dirname "${BASH_SOURCE[0]}"):$PATH"
11CNI_CONF=$(cat /dev/stdin)
12
13get_peer_name() {
14 echo "$1-vdev"
15}
16
17get_mac_with_vfpci() {
Hyunsun Moon56d70922021-11-19 10:38:14 -080018 local vfdir=$(find /sys/devices/pci* -name $1)
19 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
20 local pfdir=$(find /sys/devices/pci* -name $pf)
21 local pfName=$(ls $pfdir/net/ | head -1)
22 local idx=$(ls -l $pfdir | awk -v vf=$1 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moonf9cac592020-11-10 00:46:41 -080023 local mac=$(ip link show dev $pfName | awk -v idx="$idx" '$1=="vf" && $2==idx {print substr($4,1,17)}')
24 echo $mac
25}
26
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070027add_vlan() {
28 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moon56d70922021-11-19 10:38:14 -080029 local vfdir=$(find /sys/devices/pci* -name $vfpci)
30 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
31 local pfdir=$(find /sys/devices/pci* -name $pf)
32 local pfName=$(ls $pfdir/net/ | head -1)
33 local idx=$(ls -l $pfdir | awk -v vf=$vfpci 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070034
Hyunsun Moon56d70922021-11-19 10:38:14 -080035 vlan=$(echo $CNI_CONF | jq -r '.vlan // empty')
36 if [ ! -z "$vlan" ]; then
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070037 ip link set $pfName vf $idx vlan $vlan
Hyunsun Moon56d70922021-11-19 10:38:14 -080038 fi
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070039}
40
Hyunsun Moonf9cac592020-11-10 00:46:41 -080041ipam() {
42 local plugin=$(echo $CNI_CONF | jq -r '.ipam.type')
43 local res=$(echo $"$CNI_CONF" | "$plugin" | jq -c '.')
44 echo $res
45}
46
47add_pair_ns() {
48 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moon1711b2c2021-05-07 15:31:01 -070049 mac=$(echo $CNI_CONF | jq -r '.runtimeConfig.mac // empty')
Hyunsun Moonf9cac592020-11-10 00:46:41 -080050 if [ -z "$mac" ]; then
51 mac=$(get_mac_with_vfpci $vfpci)
52 fi
53 peer=$(get_peer_name $CNI_IFNAME)
54 ip=$1
55
56 mkdir -p /var/run/netns/
57 ln -sfT $CNI_NETNS /var/run/netns/$CNI_CONTAINERID
58
59 ip netns exec $CNI_CONTAINERID ip link add $CNI_IFNAME type veth peer name $peer
60 ip netns exec $CNI_CONTAINERID ip link set $CNI_IFNAME addr $mac up alias $vfpci
61 ip netns exec $CNI_CONTAINERID ip link set $peer up
62 ip netns exec $CNI_CONTAINERID ip addr add $ip dev $CNI_IFNAME
63}
64
65delete_pair_ns() {
66 ip netns exec $CNI_CONTAINERID ip link del $CNI_IFNAME
67}
68
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070069delete_vlan() {
70 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moon56d70922021-11-19 10:38:14 -080071 local vfdir=$(find /sys/devices/pci* -name $vfpci)
72 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
73 local pfdir=$(find /sys/devices/pci* -name $pf)
74 local pfName=$(ls $pfdir/net/ | head -1)
75 local idx=$(ls -l $pfdir | awk -v vf=$vfpci 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070076
Hyunsun Moon56d70922021-11-19 10:38:14 -080077 vlan=$(echo $CNI_CONF | jq -r '.vlan // empty')
78 if [ ! -z "$vlan" ]; then
79 ip link set $pfName vf $idx vlan 0
80 fi
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070081}
82
Hyunsun Moonf9cac592020-11-10 00:46:41 -080083case $CNI_COMMAND in
84ADD)
85 res=$(ipam)
86 ip=$(echo $res | jq -r '.ips[0].address')
87 add_pair_ns $ip
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070088 add_vlan
Hyunsun Moonf9cac592020-11-10 00:46:41 -080089 echo '{"cniVersion":"0.3.1"}' | jq -c --arg ip $ip '.ips[0].address = $ip' >&3
90 ;;
91DEL)
92 set +o errexit
93 ipam
94 delete_pair_ns
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070095 delete_vlan
Hyunsun Moonf9cac592020-11-10 00:46:41 -080096 set -o errexit
97 ;;
98*)
99 echo "CNI_COMMAND=[ADD|DEL] only supported"
100 exit 1
101 ;;
102esac