blob: 0f37779c42b0b64cad6aa18fcd969030ce6ae3b3 [file] [log] [blame]
Hyunsun Moonf9cac592020-11-10 00:46:41 -08001#!/bin/bash -x
2
Ajay Lotan Thakur8ff4a2c2022-08-05 12:49:33 -06003# Copyright 2022-present Open Networking Foundation
4#
5# SPDX-License-Identifier: Apache-2.0
6
7
Hyunsun Moonf9cac592020-11-10 00:46:41 -08008set -o errexit
9set -o pipefail
10set -o nounset
11
12exec 3>&1
13exec &>>/var/log/$(basename $0).log
14
15PATH="$CNI_PATH:$(dirname "${BASH_SOURCE[0]}"):$PATH"
16CNI_CONF=$(cat /dev/stdin)
17
18get_peer_name() {
19 echo "$1-vdev"
20}
21
22get_mac_with_vfpci() {
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070023 local vfdir=$(find /sys/devices/pci* -name $1 | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080024 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070025 local pfdir=$(find /sys/devices/pci* -name $pf | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080026 local pfName=$(ls $pfdir/net/ | head -1)
27 local idx=$(ls -l $pfdir | awk -v vf=$1 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moonf9cac592020-11-10 00:46:41 -080028 local mac=$(ip link show dev $pfName | awk -v idx="$idx" '$1=="vf" && $2==idx {print substr($4,1,17)}')
29 echo $mac
30}
31
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070032add_vlan() {
33 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070034 local vfdir=$(find /sys/devices/pci* -name $vfpci | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080035 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070036 local pfdir=$(find /sys/devices/pci* -name $pf | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080037 local pfName=$(ls $pfdir/net/ | head -1)
38 local idx=$(ls -l $pfdir | awk -v vf=$vfpci 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070039
Hyunsun Moon56d70922021-11-19 10:38:14 -080040 vlan=$(echo $CNI_CONF | jq -r '.vlan // empty')
41 if [ ! -z "$vlan" ]; then
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070042 ip link set $pfName vf $idx vlan $vlan
Hyunsun Moon56d70922021-11-19 10:38:14 -080043 fi
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070044}
45
Hyunsun Moonf9cac592020-11-10 00:46:41 -080046ipam() {
47 local plugin=$(echo $CNI_CONF | jq -r '.ipam.type')
48 local res=$(echo $"$CNI_CONF" | "$plugin" | jq -c '.')
49 echo $res
50}
51
52add_pair_ns() {
53 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moon1711b2c2021-05-07 15:31:01 -070054 mac=$(echo $CNI_CONF | jq -r '.runtimeConfig.mac // empty')
Hyunsun Moonf9cac592020-11-10 00:46:41 -080055 if [ -z "$mac" ]; then
56 mac=$(get_mac_with_vfpci $vfpci)
57 fi
58 peer=$(get_peer_name $CNI_IFNAME)
59 ip=$1
60
61 mkdir -p /var/run/netns/
62 ln -sfT $CNI_NETNS /var/run/netns/$CNI_CONTAINERID
63
64 ip netns exec $CNI_CONTAINERID ip link add $CNI_IFNAME type veth peer name $peer
65 ip netns exec $CNI_CONTAINERID ip link set $CNI_IFNAME addr $mac up alias $vfpci
66 ip netns exec $CNI_CONTAINERID ip link set $peer up
67 ip netns exec $CNI_CONTAINERID ip addr add $ip dev $CNI_IFNAME
68}
69
70delete_pair_ns() {
71 ip netns exec $CNI_CONTAINERID ip link del $CNI_IFNAME
72}
73
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070074delete_vlan() {
75 vfpci=$(echo $CNI_CONF | jq -r '.deviceID')
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070076 local vfdir=$(find /sys/devices/pci* -name $vfpci | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080077 local pf=$(readlink $vfdir/physfn | awk '{print substr($1,4)}')
Hyunsun Moonfa4c8e42022-04-11 23:29:26 -070078 local pfdir=$(find /sys/devices/pci* -name $pf | grep -v iommu)
Hyunsun Moon56d70922021-11-19 10:38:14 -080079 local pfName=$(ls $pfdir/net/ | head -1)
80 local idx=$(ls -l $pfdir | awk -v vf=$vfpci 'substr($11,4)==vf {print substr($9,7)}')
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070081
Hyunsun Moon56d70922021-11-19 10:38:14 -080082 vlan=$(echo $CNI_CONF | jq -r '.vlan // empty')
83 if [ ! -z "$vlan" ]; then
84 ip link set $pfName vf $idx vlan 0
85 fi
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070086}
87
Hyunsun Moonf9cac592020-11-10 00:46:41 -080088case $CNI_COMMAND in
89ADD)
90 res=$(ipam)
91 ip=$(echo $res | jq -r '.ips[0].address')
92 add_pair_ns $ip
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -070093 add_vlan
Hyunsun Moonf9cac592020-11-10 00:46:41 -080094 echo '{"cniVersion":"0.3.1"}' | jq -c --arg ip $ip '.ips[0].address = $ip' >&3
95 ;;
96DEL)
97 set +o errexit
98 ipam
99 delete_pair_ns
Hyunsun Moon6d8b21b2021-05-20 18:12:09 -0700100 delete_vlan
Hyunsun Moonf9cac592020-11-10 00:46:41 -0800101 set -o errexit
102 ;;
103*)
104 echo "CNI_COMMAND=[ADD|DEL] only supported"
105 exit 1
106 ;;
107esac