gfcp_readloop_generic.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright © 2021 Jeffrey H. Johnson <trnsz@pobox.com>.
  2. // Copyright © 2015 Daniel Fu <daniel820313@gmail.com>.
  3. // Copyright © 2019 Loki 'l0k18' Verloren <stalker.loki@protonmail.ch>.
  4. // Copyright © 2021 Gridfinity, LLC. <admin@gridfinity.com>.
  5. //
  6. // All rights reserved.
  7. //
  8. // All use of this code is governed by the MIT license.
  9. // The complete license is available in the LICENSE file.
  10. //go:build !linux
  11. // +build !linux
  12. package gfcp
  13. import (
  14. "sync/atomic"
  15. )
  16. func (
  17. s *UDPSession,
  18. ) readLoop() {
  19. buf := make(
  20. []byte,
  21. GFcpMtuLimit,
  22. )
  23. var src string
  24. for {
  25. if n, addr, err := s.conn.ReadFrom(
  26. buf,
  27. ); err == nil {
  28. if src == "" {
  29. src = addr.String()
  30. } else if addr.String() != src {
  31. atomic.AddUint64(
  32. &DefaultSnsi.GFcpInputErrors,
  33. 1,
  34. )
  35. continue
  36. }
  37. if n >= s.headerSize+GfcpOverhead {
  38. s.packetInput(
  39. buf[:n],
  40. )
  41. } else {
  42. atomic.AddUint64(
  43. &DefaultSnsi.GFcpInputErrors,
  44. 1,
  45. )
  46. }
  47. } else {
  48. s.chReadError <- err
  49. return
  50. }
  51. }
  52. }
  53. func (
  54. l *Listener,
  55. ) monitor() {
  56. buf := make(
  57. []byte,
  58. GFcpMtuLimit,
  59. )
  60. for {
  61. if n, from, err := l.conn.ReadFrom(
  62. buf,
  63. ); err == nil {
  64. if n >= l.headerSize+GfcpOverhead {
  65. l.packetInput(
  66. buf[:n],
  67. from,
  68. )
  69. } else {
  70. atomic.AddUint64(
  71. &DefaultSnsi.GFcpInputErrors,
  72. 1,
  73. )
  74. }
  75. } else {
  76. return
  77. }
  78. }
  79. }