ss := strings.Split(network, ":")
sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
switch ss[0] {
- case "tcp4", "udp4", "ip4":
- if so.Cookie.Family() == syscall.AF_INET {
+ case "tcp4":
+ if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_STREAM {
return nil, syscall.EHOSTUNREACH
}
- case "tcp6", "udp6", "ip6":
- if so.Cookie.Family() == syscall.AF_INET6 {
+ case "udp4":
+ if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_DGRAM {
+ return nil, syscall.EHOSTUNREACH
+ }
+ case "ip4":
+ if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_RAW {
+ return nil, syscall.EHOSTUNREACH
+ }
+ case "tcp6":
+ if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_STREAM {
+ return nil, syscall.EHOSTUNREACH
+ }
+ case "udp6":
+ if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_DGRAM {
+ return nil, syscall.EHOSTUNREACH
+ }
+ case "ip6":
+ if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_RAW {
return nil, syscall.EHOSTUNREACH
}
}