// Copyright 2016 Mikio Hara. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package tcpopt

import "time"

var options = [soMax]option{
	soNodelay:      {ianaProtocolTCP, sysTCP_NODELAY, 0},
	soMaxseg:       {ianaProtocolTCP, sysTCP_MAXSEG, 0},
	soSndbuf:       {sysSOL_SOCKET, sysSO_SNDBUF, 0},
	soRcvbuf:       {sysSOL_SOCKET, sysSO_RCVBUF, 0},
	soKeepalive:    {sysSOL_SOCKET, sysSO_KEEPALIVE, 0},
	soKeepidle:     {ianaProtocolTCP, sysTCP_KEEPIDLE, time.Second},
	soKeepintvl:    {ianaProtocolTCP, sysTCP_KEEPINTVL, time.Second},
	soKeepcnt:      {ianaProtocolTCP, sysTCP_KEEPCNT, 0},
	soCork:         {ianaProtocolTCP, sysTCP_CORK, 0},
	soNotsentLOWAT: {ianaProtocolTCP, sysTCP_NOTSENT_LOWAT, 0},
	soError:        {sysSOL_SOCKET, sysSO_ERROR, 0},
}

var parsers = map[int64]func([]byte) (Option, error){
	ianaProtocolTCP<<32 | sysTCP_NODELAY:       parseNoDelay,
	ianaProtocolTCP<<32 | sysTCP_MAXSEG:        parseMSS,
	sysSOL_SOCKET<<32 | sysSO_SNDBUF:           parseSendBuffer,
	sysSOL_SOCKET<<32 | sysSO_RCVBUF:           parseReceiveBuffer,
	sysSOL_SOCKET<<32 | sysSO_KEEPALIVE:        parseKeepAlive,
	ianaProtocolTCP<<32 | sysTCP_KEEPIDLE:      parseKeepAliveIdleInterval,
	ianaProtocolTCP<<32 | sysTCP_KEEPINTVL:     parseKeepAliveProbeInterval,
	ianaProtocolTCP<<32 | sysTCP_KEEPCNT:       parseKeepAliveProbeCount,
	ianaProtocolTCP<<32 | sysTCP_CORK:          parseCork,
	ianaProtocolTCP<<32 | sysTCP_NOTSENT_LOWAT: parseNotSentLowWMK,
	sysSOL_SOCKET<<32 | sysSO_ERROR:            parseError,
}
