Merge pull request #124425 from aroradaman/fix-agnhost-sctp

Fix agnhost sctp
This commit is contained in:
Kubernetes Prow Robot 2024-04-22 10:06:20 -07:00 committed by GitHub
commit 122816f894
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 8 deletions

View File

@ -1 +1 @@
2.49 2.50

View File

@ -47,12 +47,14 @@ var (
timeout time.Duration timeout time.Duration
protocol string protocol string
udpData string udpData string
sctpData string
) )
func init() { func init() {
CmdConnect.Flags().DurationVar(&timeout, "timeout", time.Duration(0), "Maximum time before returning an error") CmdConnect.Flags().DurationVar(&timeout, "timeout", time.Duration(0), "Maximum time before returning an error")
CmdConnect.Flags().StringVar(&protocol, "protocol", "tcp", "The protocol to use to perform the connection, can be tcp, udp or sctp") CmdConnect.Flags().StringVar(&protocol, "protocol", "tcp", "The protocol to use to perform the connection, can be tcp, udp or sctp")
CmdConnect.Flags().StringVar(&udpData, "udp-data", "hostname", "The UDP payload send to the server") CmdConnect.Flags().StringVar(&udpData, "udp-data", "hostname", "The UDP payload send to the server")
CmdConnect.Flags().StringVar(&sctpData, "sctp-data", "hostname", "The SCTP payload send to the server")
} }
func main(cmd *cobra.Command, args []string) { func main(cmd *cobra.Command, args []string) {
@ -63,7 +65,7 @@ func main(cmd *cobra.Command, args []string) {
case "udp": case "udp":
connectUDP(dest, timeout, udpData) connectUDP(dest, timeout, udpData)
case "sctp": case "sctp":
connectSCTP(dest, timeout) connectSCTP(dest, timeout, sctpData)
default: default:
fmt.Fprint(os.Stderr, "Unsupported protocol\n", protocol) fmt.Fprint(os.Stderr, "Unsupported protocol\n", protocol)
os.Exit(1) os.Exit(1)
@ -103,7 +105,11 @@ func connectTCP(dest string, timeout time.Duration) {
os.Exit(1) os.Exit(1)
} }
func connectSCTP(dest string, timeout time.Duration) { func connectSCTP(dest string, timeout time.Duration, data string) {
var (
buf = make([]byte, 1024)
conn *sctp.SCTPConn
)
addr, err := sctp.ResolveSCTPAddr("sctp", dest) addr, err := sctp.ResolveSCTPAddr("sctp", dest)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "DNS: %v\n", err) fmt.Fprintf(os.Stderr, "DNS: %v\n", err)
@ -114,11 +120,24 @@ func connectSCTP(dest string, timeout time.Duration) {
errCh := make(chan error) errCh := make(chan error)
go func() { go func() {
conn, err := sctp.DialSCTP("sctp", nil, addr) conn, err = sctp.DialSCTP("sctp", nil, addr)
if err == nil { if err != nil {
conn.Close() errCh <- err
return
}
defer func() {
errCh <- conn.Close()
}()
if _, err = conn.Write([]byte(fmt.Sprintf("%s\n", data))); err != nil {
errCh <- err
return
}
if _, err = conn.Read(buf); err != nil {
errCh <- err
return
} }
errCh <- err
}() }()
select { select {

View File

@ -693,7 +693,11 @@ func startSCTPServer(sctpPort int) {
for { for {
conn, err := listener.AcceptSCTP() conn, err := listener.AcceptSCTP()
assertNoError(err, fmt.Sprintf("failed accepting SCTP connections")) assertNoError(err, fmt.Sprintf("failed accepting SCTP connections"))
clientAddress := conn.RemoteAddr().String() remoteAddr, err := conn.SCTPRemoteAddr(0)
if err != nil {
assertNoError(err, "failed to get SCTP client remote address")
}
clientAddress := remoteAddr.String()
n, err := conn.Read(buf) n, err := conn.Read(buf)
assertNoError(err, fmt.Sprintf("failed to read from SCTP client %s", clientAddress)) assertNoError(err, fmt.Sprintf("failed to read from SCTP client %s", clientAddress))
receivedText := strings.ToLower(strings.TrimSpace(string(buf[0:n]))) receivedText := strings.ToLower(strings.TrimSpace(string(buf[0:n])))