This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
modikai-edns-svcb-https/method/combined.go

124 lines
2.6 KiB
Go

package method
import (
"edns_svcb/utils"
"fmt"
"log"
"sync"
"github.com/miekg/dns"
)
type CombinedResult struct {
Alive bool
EDNSSupport bool
SVCBSupport bool
HTTPSSupport bool
Err error
}
func CombinedMeasurement(ip_pool chan string, result_pool chan CombinedResult, routine_num int, wg *sync.WaitGroup, logger *log.Logger) {
for i := 0; i < routine_num; i++ {
wg.Add(1)
go CombinedTestRoutine(ip_pool, result_pool, wg, logger)
}
}
func CombinedTestRoutine(ip_pool chan string, result_pool chan CombinedResult, wg *sync.WaitGroup, logger *log.Logger) {
for {
if ip, ok := <-ip_pool; ok {
addr := ip + ":53"
res := CombinedTest(addr)
result_pool <- res
if res.Err != nil {
logger.Printf("%v : failed ( %v )", ip, res.Err)
} else {
logger.Printf("%v : alive %v edns %v svcb %v https %v", ip, res.Alive, res.EDNSSupport, res.SVCBSupport, res.HTTPSSupport)
}
} else {
break
}
}
wg.Done()
}
func CombinedTest(addr string) CombinedResult {
result := CombinedResult{}
_, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.com", RD: true})
if err != nil {
return CombinedResult{Err: err}
}
result.Alive = true
//edns support
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.com", EDNS: true, RD: true})
if err == nil {
if len(res.Extra) > 0 {
if _, ok := res.Extra[0].(*dns.OPT); ok {
result.EDNSSupport = true
}
}
} else {
result.Err = err
return result
}
// svcb support
res, err = utils.DNSQuery(addr, utils.DNSOptions{Domain: "_dns.resolver.arpa", Qtype: dns.TypeSVCB, RD: true})
if err == nil {
if len(res.Answer) > 0 {
if _, ok := res.Answer[0].(*dns.SVCB); ok {
result.SVCBSupport = true
}
}
} else {
result.Err = err
return result
}
// https support
res, err = utils.DNSQuery(addr, utils.DNSOptions{Domain: "blog.cloudflare.com", Qtype: dns.TypeHTTPS, RD: true})
if err == nil {
if len(res.Answer) > 0 {
if _, ok := res.Answer[0].(*dns.HTTPS); ok {
result.HTTPSSupport = true
}
}
} else {
result.Err = err
return result
}
return result
}
func CombinedResultProcess(result_pool chan CombinedResult, wg *sync.WaitGroup) {
alive_cnt := 0
edns_cnt := 0
svcb_cnt := 0
https_cnt := 0
for {
if res, ok := <-result_pool; ok {
if res.Err != nil {
continue
}
if res.Alive {
alive_cnt++
}
if res.EDNSSupport {
edns_cnt++
}
if res.SVCBSupport {
svcb_cnt++
}
if res.HTTPSSupport {
https_cnt++
}
} else {
break
}
}
fmt.Printf("EDNS support Test: alive %v edns %v svcb %v https %v\n", alive_cnt, edns_cnt, svcb_cnt, https_cnt)
wg.Done()
}