@@ -31,9 +31,17 @@ type Server struct {
3131 // tun device wrap
3232 iface * Interface
3333
34+ // snd buffer
35+ sndq []chan * sendReq
36+
3437 vpcInstance vpc.IVPC
3538}
3639
40+ type sendReq struct {
41+ buf []byte
42+ conn net.Conn
43+ }
44+
3745type peerConn struct {
3846 addr string
3947 // conn *net.UDPConn
@@ -44,12 +52,19 @@ type peerConn struct {
4452}
4553
4654func NewServer (laddr , key string , iface * Interface ) * Server {
47- return & Server {
55+ s := & Server {
4856 laddr : laddr ,
4957 key : key ,
5058 peerConns : make (map [string ]* peerConn ),
5159 iface : iface ,
60+ sndq : make ([]chan * sendReq , 1000 ),
61+ }
62+
63+ for i := 0 ; i < 1000 ; i ++ {
64+ s .sndq [i ] = make (chan * sendReq , 10000 )
65+ go s .writePeer (s .sndq [i ])
5266 }
67+ return s
5368}
5469
5570func (s * Server ) SetRegistry (r * Registry ) {
@@ -166,9 +181,35 @@ func (s *Server) readLocal() {
166181 buf = append (buf , plen ... )
167182 buf = append (buf , pkt ... )
168183
184+ idx := time33 (dst ) % uint64 (len (s .sndq ))
185+ select {
186+ case s .sndq [idx ] <- & sendReq {buf , peer }:
187+ default :
188+ peer .SetWriteDeadline (time .Now ().Add (time .Second * 3 ))
189+ nw , err := peer .Write (buf )
190+ peer .SetWriteDeadline (time.Time {})
191+ if err != nil {
192+ log .Error ("write to peer %s fail %v" , dst , err )
193+ continue
194+ }
195+
196+ if nw != len (buf ) {
197+ log .Error ("stream write not full" )
198+ continue
199+ }
200+ }
201+ }
202+ }
203+
204+ func (s * Server ) writePeer (sndq chan * sendReq ) {
205+ for req := range sndq {
206+ peer := req .conn
207+ buf := req .buf
208+ peer .SetWriteDeadline (time .Now ().Add (time .Second * 3 ))
169209 nw , err := peer .Write (buf )
210+ peer .SetWriteDeadline (time.Time {})
170211 if err != nil {
171- log .Error ("write to peer %s fail %v" , dst , err )
212+ log .Error ("write to peer fail %v" , err )
172213 continue
173214 }
174215
@@ -403,3 +444,13 @@ func (s *Server) DelRoute(msg *codec.DelRouteMsg) {
403444 ListenAddr : msg .Nexthop ,
404445 })
405446}
447+
448+ func time33 (s string ) uint64 {
449+ var hash uint64 = 5381
450+
451+ for _ , c := range s {
452+ hash = ((hash << 5 ) + hash ) + uint64 (c )
453+ }
454+
455+ return hash
456+ }
0 commit comments