gfcp_readloop_generic.go 1.3 KB

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