1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build !plan9
6
7package net
8
9import (
10	"net/internal/socktest"
11	"strings"
12	"syscall"
13)
14
15func enableSocketConnect() {
16	sw.Set(socktest.FilterConnect, nil)
17}
18
19func disableSocketConnect(network string) {
20	net, _, _ := strings.Cut(network, ":")
21	sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
22		switch net {
23		case "tcp4":
24			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_STREAM {
25				return nil, syscall.EHOSTUNREACH
26			}
27		case "udp4":
28			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_DGRAM {
29				return nil, syscall.EHOSTUNREACH
30			}
31		case "ip4":
32			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_RAW {
33				return nil, syscall.EHOSTUNREACH
34			}
35		case "tcp6":
36			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_STREAM {
37				return nil, syscall.EHOSTUNREACH
38			}
39		case "udp6":
40			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_DGRAM {
41				return nil, syscall.EHOSTUNREACH
42			}
43		case "ip6":
44			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_RAW {
45				return nil, syscall.EHOSTUNREACH
46			}
47		}
48		return nil, nil
49	})
50}
51