Improve iphelper bufsize calculation
This commit is contained in:
@@ -134,12 +134,16 @@ func getBufSize() int {
|
|||||||
return bufSize
|
return bufSize
|
||||||
}
|
}
|
||||||
|
|
||||||
func increaseBufSize() int {
|
func increaseBufSize(minSize int) int {
|
||||||
bufSizeLock.Lock()
|
bufSizeLock.Lock()
|
||||||
defer bufSizeLock.Unlock()
|
defer bufSizeLock.Unlock()
|
||||||
|
|
||||||
// increase
|
// increase
|
||||||
bufSize *= 2
|
bufSize *= 2
|
||||||
|
// increase until we reach the minimum size
|
||||||
|
for bufSize < minSize {
|
||||||
|
bufSize *= 2
|
||||||
|
}
|
||||||
// not too much
|
// not too much
|
||||||
if bufSize > maxBufSize {
|
if bufSize > maxBufSize {
|
||||||
bufSize = maxBufSize
|
bufSize = maxBufSize
|
||||||
@@ -168,8 +172,8 @@ func (ipHelper *IPHelper) getTable(ipVersion, protocol uint8) (connections []*so
|
|||||||
return nil, nil, errors.New("invalid protocol")
|
return nil, nil, errors.New("invalid protocol")
|
||||||
}
|
}
|
||||||
|
|
||||||
// try max 3 times
|
// try max 5 times
|
||||||
maxTries := 3
|
maxTries := 5
|
||||||
bufSize := getBufSize()
|
bufSize := getBufSize()
|
||||||
var buf []byte
|
var buf []byte
|
||||||
|
|
||||||
@@ -201,9 +205,14 @@ func (ipHelper *IPHelper) getTable(ipVersion, protocol uint8) (connections []*so
|
|||||||
switch r1 {
|
switch r1 {
|
||||||
case winErrInsufficientBuffer:
|
case winErrInsufficientBuffer:
|
||||||
if i >= maxTries {
|
if i >= maxTries {
|
||||||
return nil, nil, fmt.Errorf("insufficient buffer error (tried %d times): [NT 0x%X] %s", i, r1, err)
|
return nil, nil, fmt.Errorf(
|
||||||
|
"insufficient buffer error (tried %d times): %s bytes required - [NT 0x%X] %s",
|
||||||
|
i, bufSize, r1, err,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
bufSize = increaseBufSize()
|
// bufSize was modified by ipHelper.getExtended*Table to hold the
|
||||||
|
// required buffer size.
|
||||||
|
bufSize = increaseBufSize(bufSize)
|
||||||
case winErrInvalidParameter:
|
case winErrInvalidParameter:
|
||||||
return nil, nil, fmt.Errorf("invalid parameter: [NT 0x%X] %s", r1, err)
|
return nil, nil, fmt.Errorf("invalid parameter: [NT 0x%X] %s", r1, err)
|
||||||
case windows.NO_ERROR:
|
case windows.NO_ERROR:
|
||||||
|
|||||||
Reference in New Issue
Block a user