Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 ALL_TESTS="standalone bridge"
0005 NUM_NETIFS=2
0006 PING_COUNT=1
0007 REQUIRE_MTOOLS=yes
0008 REQUIRE_MZ=no
0009 
0010 source lib.sh
0011 
0012 H1_IPV4="192.0.2.1"
0013 H2_IPV4="192.0.2.2"
0014 H1_IPV6="2001:db8:1::1"
0015 H2_IPV6="2001:db8:1::2"
0016 
0017 BRIDGE_ADDR="00:00:de:ad:be:ee"
0018 MACVLAN_ADDR="00:00:de:ad:be:ef"
0019 UNKNOWN_UC_ADDR1="de:ad:be:ef:ee:03"
0020 UNKNOWN_UC_ADDR2="de:ad:be:ef:ee:04"
0021 UNKNOWN_UC_ADDR3="de:ad:be:ef:ee:05"
0022 JOINED_IPV4_MC_ADDR="225.1.2.3"
0023 UNKNOWN_IPV4_MC_ADDR1="225.1.2.4"
0024 UNKNOWN_IPV4_MC_ADDR2="225.1.2.5"
0025 UNKNOWN_IPV4_MC_ADDR3="225.1.2.6"
0026 JOINED_IPV6_MC_ADDR="ff2e::0102:0304"
0027 UNKNOWN_IPV6_MC_ADDR1="ff2e::0102:0305"
0028 UNKNOWN_IPV6_MC_ADDR2="ff2e::0102:0306"
0029 UNKNOWN_IPV6_MC_ADDR3="ff2e::0102:0307"
0030 
0031 JOINED_MACV4_MC_ADDR="01:00:5e:01:02:03"
0032 UNKNOWN_MACV4_MC_ADDR1="01:00:5e:01:02:04"
0033 UNKNOWN_MACV4_MC_ADDR2="01:00:5e:01:02:05"
0034 UNKNOWN_MACV4_MC_ADDR3="01:00:5e:01:02:06"
0035 JOINED_MACV6_MC_ADDR="33:33:01:02:03:04"
0036 UNKNOWN_MACV6_MC_ADDR1="33:33:01:02:03:05"
0037 UNKNOWN_MACV6_MC_ADDR2="33:33:01:02:03:06"
0038 UNKNOWN_MACV6_MC_ADDR3="33:33:01:02:03:07"
0039 
0040 NON_IP_MC="01:02:03:04:05:06"
0041 NON_IP_PKT="00:04 48:45:4c:4f"
0042 BC="ff:ff:ff:ff:ff:ff"
0043 
0044 # Disable promisc to ensure we don't receive unknown MAC DA packets
0045 export TCPDUMP_EXTRA_FLAGS="-pl"
0046 
0047 h1=${NETIFS[p1]}
0048 h2=${NETIFS[p2]}
0049 
0050 send_non_ip()
0051 {
0052         local if_name=$1
0053         local smac=$2
0054         local dmac=$3
0055 
0056         $MZ -q $if_name "$dmac $smac $NON_IP_PKT"
0057 }
0058 
0059 send_uc_ipv4()
0060 {
0061         local if_name=$1
0062         local dmac=$2
0063 
0064         ip neigh add $H2_IPV4 lladdr $dmac dev $if_name
0065         ping_do $if_name $H2_IPV4
0066         ip neigh del $H2_IPV4 dev $if_name
0067 }
0068 
0069 check_rcv()
0070 {
0071         local if_name=$1
0072         local type=$2
0073         local pattern=$3
0074         local should_receive=$4
0075         local should_fail=
0076 
0077         [ $should_receive = true ] && should_fail=0 || should_fail=1
0078         RET=0
0079 
0080         tcpdump_show $if_name | grep -q "$pattern"
0081 
0082         check_err_fail "$should_fail" "$?" "reception"
0083 
0084         log_test "$if_name: $type"
0085 }
0086 
0087 mc_route_prepare()
0088 {
0089         local if_name=$1
0090         local vrf_name=$(master_name_get $if_name)
0091 
0092         ip route add 225.100.1.0/24 dev $if_name vrf $vrf_name
0093         ip -6 route add ff2e::/64 dev $if_name vrf $vrf_name
0094 }
0095 
0096 mc_route_destroy()
0097 {
0098         local if_name=$1
0099         local vrf_name=$(master_name_get $if_name)
0100 
0101         ip route del 225.100.1.0/24 dev $if_name vrf $vrf_name
0102         ip -6 route del ff2e::/64 dev $if_name vrf $vrf_name
0103 }
0104 
0105 run_test()
0106 {
0107         local rcv_if_name=$1
0108         local smac=$(mac_get $h1)
0109         local rcv_dmac=$(mac_get $rcv_if_name)
0110 
0111         tcpdump_start $rcv_if_name
0112 
0113         mc_route_prepare $h1
0114         mc_route_prepare $rcv_if_name
0115 
0116         send_uc_ipv4 $h1 $rcv_dmac
0117         send_uc_ipv4 $h1 $MACVLAN_ADDR
0118         send_uc_ipv4 $h1 $UNKNOWN_UC_ADDR1
0119 
0120         ip link set dev $rcv_if_name promisc on
0121         send_uc_ipv4 $h1 $UNKNOWN_UC_ADDR2
0122         mc_send $h1 $UNKNOWN_IPV4_MC_ADDR2
0123         mc_send $h1 $UNKNOWN_IPV6_MC_ADDR2
0124         ip link set dev $rcv_if_name promisc off
0125 
0126         mc_join $rcv_if_name $JOINED_IPV4_MC_ADDR
0127         mc_send $h1 $JOINED_IPV4_MC_ADDR
0128         mc_leave
0129 
0130         mc_join $rcv_if_name $JOINED_IPV6_MC_ADDR
0131         mc_send $h1 $JOINED_IPV6_MC_ADDR
0132         mc_leave
0133 
0134         mc_send $h1 $UNKNOWN_IPV4_MC_ADDR1
0135         mc_send $h1 $UNKNOWN_IPV6_MC_ADDR1
0136 
0137         ip link set dev $rcv_if_name allmulticast on
0138         send_uc_ipv4 $h1 $UNKNOWN_UC_ADDR3
0139         mc_send $h1 $UNKNOWN_IPV4_MC_ADDR3
0140         mc_send $h1 $UNKNOWN_IPV6_MC_ADDR3
0141         ip link set dev $rcv_if_name allmulticast off
0142 
0143         mc_route_destroy $rcv_if_name
0144         mc_route_destroy $h1
0145 
0146         sleep 1
0147 
0148         tcpdump_stop $rcv_if_name
0149 
0150         check_rcv $rcv_if_name "Unicast IPv4 to primary MAC address" \
0151                 "$smac > $rcv_dmac, ethertype IPv4 (0x0800)" \
0152                 true
0153 
0154         check_rcv $rcv_if_name "Unicast IPv4 to macvlan MAC address" \
0155                 "$smac > $MACVLAN_ADDR, ethertype IPv4 (0x0800)" \
0156                 true
0157 
0158         check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address" \
0159                 "$smac > $UNKNOWN_UC_ADDR1, ethertype IPv4 (0x0800)" \
0160                 false
0161 
0162         check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, promisc" \
0163                 "$smac > $UNKNOWN_UC_ADDR2, ethertype IPv4 (0x0800)" \
0164                 true
0165 
0166         check_rcv $rcv_if_name "Unicast IPv4 to unknown MAC address, allmulti" \
0167                 "$smac > $UNKNOWN_UC_ADDR3, ethertype IPv4 (0x0800)" \
0168                 false
0169 
0170         check_rcv $rcv_if_name "Multicast IPv4 to joined group" \
0171                 "$smac > $JOINED_MACV4_MC_ADDR, ethertype IPv4 (0x0800)" \
0172                 true
0173 
0174         check_rcv $rcv_if_name "Multicast IPv4 to unknown group" \
0175                 "$smac > $UNKNOWN_MACV4_MC_ADDR1, ethertype IPv4 (0x0800)" \
0176                 false
0177 
0178         check_rcv $rcv_if_name "Multicast IPv4 to unknown group, promisc" \
0179                 "$smac > $UNKNOWN_MACV4_MC_ADDR2, ethertype IPv4 (0x0800)" \
0180                 true
0181 
0182         check_rcv $rcv_if_name "Multicast IPv4 to unknown group, allmulti" \
0183                 "$smac > $UNKNOWN_MACV4_MC_ADDR3, ethertype IPv4 (0x0800)" \
0184                 true
0185 
0186         check_rcv $rcv_if_name "Multicast IPv6 to joined group" \
0187                 "$smac > $JOINED_MACV6_MC_ADDR, ethertype IPv6 (0x86dd)" \
0188                 true
0189 
0190         check_rcv $rcv_if_name "Multicast IPv6 to unknown group" \
0191                 "$smac > $UNKNOWN_MACV6_MC_ADDR1, ethertype IPv6 (0x86dd)" \
0192                 false
0193 
0194         check_rcv $rcv_if_name "Multicast IPv6 to unknown group, promisc" \
0195                 "$smac > $UNKNOWN_MACV6_MC_ADDR2, ethertype IPv6 (0x86dd)" \
0196                 true
0197 
0198         check_rcv $rcv_if_name "Multicast IPv6 to unknown group, allmulti" \
0199                 "$smac > $UNKNOWN_MACV6_MC_ADDR3, ethertype IPv6 (0x86dd)" \
0200                 true
0201 
0202         tcpdump_cleanup $rcv_if_name
0203 }
0204 
0205 h1_create()
0206 {
0207         simple_if_init $h1 $H1_IPV4/24 $H1_IPV6/64
0208 }
0209 
0210 h1_destroy()
0211 {
0212         simple_if_fini $h1 $H1_IPV4/24 $H1_IPV6/64
0213 }
0214 
0215 h2_create()
0216 {
0217         simple_if_init $h2 $H2_IPV4/24 $H2_IPV6/64
0218 }
0219 
0220 h2_destroy()
0221 {
0222         simple_if_fini $h2 $H2_IPV4/24 $H2_IPV6/64
0223 }
0224 
0225 bridge_create()
0226 {
0227         ip link add br0 type bridge
0228         ip link set br0 address $BRIDGE_ADDR
0229         ip link set br0 up
0230 
0231         ip link set $h2 master br0
0232         ip link set $h2 up
0233 
0234         simple_if_init br0 $H2_IPV4/24 $H2_IPV6/64
0235 }
0236 
0237 bridge_destroy()
0238 {
0239         simple_if_fini br0 $H2_IPV4/24 $H2_IPV6/64
0240 
0241         ip link del br0
0242 }
0243 
0244 standalone()
0245 {
0246         h1_create
0247         h2_create
0248 
0249         ip link add link $h2 name macvlan0 type macvlan mode private
0250         ip link set macvlan0 address $MACVLAN_ADDR
0251         ip link set macvlan0 up
0252 
0253         run_test $h2
0254 
0255         ip link del macvlan0
0256 
0257         h2_destroy
0258         h1_destroy
0259 }
0260 
0261 bridge()
0262 {
0263         h1_create
0264         bridge_create
0265 
0266         ip link add link br0 name macvlan0 type macvlan mode private
0267         ip link set macvlan0 address $MACVLAN_ADDR
0268         ip link set macvlan0 up
0269 
0270         run_test br0
0271 
0272         ip link del macvlan0
0273 
0274         bridge_destroy
0275         h1_destroy
0276 }
0277 
0278 cleanup()
0279 {
0280         pre_cleanup
0281         vrf_cleanup
0282 }
0283 
0284 setup_prepare()
0285 {
0286         vrf_prepare
0287         # setup_wait() needs this
0288         ip link set $h1 up
0289         ip link set $h2 up
0290 }
0291 
0292 trap cleanup EXIT
0293 
0294 setup_prepare
0295 setup_wait
0296 
0297 tests_run
0298 
0299 exit $EXIT_STATUS