// Code generated by protoc-gen-go.
// source: google.golang.org/appengine/internal/socket/socket_service.proto
// DO NOT EDIT!

/*
Package socket is a generated protocol buffer package.

It is generated from these files:
	google.golang.org/appengine/internal/socket/socket_service.proto

It has these top-level messages:
	RemoteSocketServiceError
	AddressPort
	CreateSocketRequest
	CreateSocketReply
	BindRequest
	BindReply
	GetSocketNameRequest
	GetSocketNameReply
	GetPeerNameRequest
	GetPeerNameReply
	SocketOption
	SetSocketOptionsRequest
	SetSocketOptionsReply
	GetSocketOptionsRequest
	GetSocketOptionsReply
	ConnectRequest
	ConnectReply
	ListenRequest
	ListenReply
	AcceptRequest
	AcceptReply
	ShutDownRequest
	ShutDownReply
	CloseRequest
	CloseReply
	SendRequest
	SendReply
	ReceiveRequest
	ReceiveReply
	PollEvent
	PollRequest
	PollReply
	ResolveRequest
	ResolveReply
*/
package socket

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

type RemoteSocketServiceError_ErrorCode int32

const (
	RemoteSocketServiceError_SYSTEM_ERROR      RemoteSocketServiceError_ErrorCode = 1
	RemoteSocketServiceError_GAI_ERROR         RemoteSocketServiceError_ErrorCode = 2
	RemoteSocketServiceError_FAILURE           RemoteSocketServiceError_ErrorCode = 4
	RemoteSocketServiceError_PERMISSION_DENIED RemoteSocketServiceError_ErrorCode = 5
	RemoteSocketServiceError_INVALID_REQUEST   RemoteSocketServiceError_ErrorCode = 6
	RemoteSocketServiceError_SOCKET_CLOSED     RemoteSocketServiceError_ErrorCode = 7
)

var RemoteSocketServiceError_ErrorCode_name = map[int32]string{
	1: "SYSTEM_ERROR",
	2: "GAI_ERROR",
	4: "FAILURE",
	5: "PERMISSION_DENIED",
	6: "INVALID_REQUEST",
	7: "SOCKET_CLOSED",
}
var RemoteSocketServiceError_ErrorCode_value = map[string]int32{
	"SYSTEM_ERROR":      1,
	"GAI_ERROR":         2,
	"FAILURE":           4,
	"PERMISSION_DENIED": 5,
	"INVALID_REQUEST":   6,
	"SOCKET_CLOSED":     7,
}

func (x RemoteSocketServiceError_ErrorCode) Enum() *RemoteSocketServiceError_ErrorCode {
	p := new(RemoteSocketServiceError_ErrorCode)
	*p = x
	return p
}
func (x RemoteSocketServiceError_ErrorCode) String() string {
	return proto.EnumName(RemoteSocketServiceError_ErrorCode_name, int32(x))
}
func (x *RemoteSocketServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(RemoteSocketServiceError_ErrorCode_value, data, "RemoteSocketServiceError_ErrorCode")
	if err != nil {
		return err
	}
	*x = RemoteSocketServiceError_ErrorCode(value)
	return nil
}

type RemoteSocketServiceError_SystemError int32

const (
	RemoteSocketServiceError_SYS_SUCCESS         RemoteSocketServiceError_SystemError = 0
	RemoteSocketServiceError_SYS_EPERM           RemoteSocketServiceError_SystemError = 1
	RemoteSocketServiceError_SYS_ENOENT          RemoteSocketServiceError_SystemError = 2
	RemoteSocketServiceError_SYS_ESRCH           RemoteSocketServiceError_SystemError = 3
	RemoteSocketServiceError_SYS_EINTR           RemoteSocketServiceError_SystemError = 4
	RemoteSocketServiceError_SYS_EIO             RemoteSocketServiceError_SystemError = 5
	RemoteSocketServiceError_SYS_ENXIO           RemoteSocketServiceError_SystemError = 6
	RemoteSocketServiceError_SYS_E2BIG           RemoteSocketServiceError_SystemError = 7
	RemoteSocketServiceError_SYS_ENOEXEC         RemoteSocketServiceError_SystemError = 8
	RemoteSocketServiceError_SYS_EBADF           RemoteSocketServiceError_SystemError = 9
	RemoteSocketServiceError_SYS_ECHILD          RemoteSocketServiceError_SystemError = 10
	RemoteSocketServiceError_SYS_EAGAIN          RemoteSocketServiceError_SystemError = 11
	RemoteSocketServiceError_SYS_EWOULDBLOCK     RemoteSocketServiceError_SystemError = 11
	RemoteSocketServiceError_SYS_ENOMEM          RemoteSocketServiceError_SystemError = 12
	RemoteSocketServiceError_SYS_EACCES          RemoteSocketServiceError_SystemError = 13
	RemoteSocketServiceError_SYS_EFAULT          RemoteSocketServiceError_SystemError = 14
	RemoteSocketServiceError_SYS_ENOTBLK         RemoteSocketServiceError_SystemError = 15
	RemoteSocketServiceError_SYS_EBUSY           RemoteSocketServiceError_SystemError = 16
	RemoteSocketServiceError_SYS_EEXIST          RemoteSocketServiceError_SystemError = 17
	RemoteSocketServiceError_SYS_EXDEV           RemoteSocketServiceError_SystemError = 18
	RemoteSocketServiceError_SYS_ENODEV          RemoteSocketServiceError_SystemError = 19
	RemoteSocketServiceError_SYS_ENOTDIR         RemoteSocketServiceError_SystemError = 20
	RemoteSocketServiceError_SYS_EISDIR          RemoteSocketServiceError_SystemError = 21
	RemoteSocketServiceError_SYS_EINVAL          RemoteSocketServiceError_SystemError = 22
	RemoteSocketServiceError_SYS_ENFILE          RemoteSocketServiceError_SystemError = 23
	RemoteSocketServiceError_SYS_EMFILE          RemoteSocketServiceError_SystemError = 24
	RemoteSocketServiceError_SYS_ENOTTY          RemoteSocketServiceError_SystemError = 25
	RemoteSocketServiceError_SYS_ETXTBSY         RemoteSocketServiceError_SystemError = 26
	RemoteSocketServiceError_SYS_EFBIG           RemoteSocketServiceError_SystemError = 27
	RemoteSocketServiceError_SYS_ENOSPC          RemoteSocketServiceError_SystemError = 28
	RemoteSocketServiceError_SYS_ESPIPE          RemoteSocketServiceError_SystemError = 29
	RemoteSocketServiceError_SYS_EROFS           RemoteSocketServiceError_SystemError = 30
	RemoteSocketServiceError_SYS_EMLINK          RemoteSocketServiceError_SystemError = 31
	RemoteSocketServiceError_SYS_EPIPE           RemoteSocketServiceError_SystemError = 32
	RemoteSocketServiceError_SYS_EDOM            RemoteSocketServiceError_SystemError = 33
	RemoteSocketServiceError_SYS_ERANGE          RemoteSocketServiceError_SystemError = 34
	RemoteSocketServiceError_SYS_EDEADLK         RemoteSocketServiceError_SystemError = 35
	RemoteSocketServiceError_SYS_EDEADLOCK       RemoteSocketServiceError_SystemError = 35
	RemoteSocketServiceError_SYS_ENAMETOOLONG    RemoteSocketServiceError_SystemError = 36
	RemoteSocketServiceError_SYS_ENOLCK          RemoteSocketServiceError_SystemError = 37
	RemoteSocketServiceError_SYS_ENOSYS          RemoteSocketServiceError_SystemError = 38
	RemoteSocketServiceError_SYS_ENOTEMPTY       RemoteSocketServiceError_SystemError = 39
	RemoteSocketServiceError_SYS_ELOOP           RemoteSocketServiceError_SystemError = 40
	RemoteSocketServiceError_SYS_ENOMSG          RemoteSocketServiceError_SystemError = 42
	RemoteSocketServiceError_SYS_EIDRM           RemoteSocketServiceError_SystemError = 43
	RemoteSocketServiceError_SYS_ECHRNG          RemoteSocketServiceError_SystemError = 44
	RemoteSocketServiceError_SYS_EL2NSYNC        RemoteSocketServiceError_SystemError = 45
	RemoteSocketServiceError_SYS_EL3HLT          RemoteSocketServiceError_SystemError = 46
	RemoteSocketServiceError_SYS_EL3RST          RemoteSocketServiceError_SystemError = 47
	RemoteSocketServiceError_SYS_ELNRNG          RemoteSocketServiceError_SystemError = 48
	RemoteSocketServiceError_SYS_EUNATCH         RemoteSocketServiceError_SystemError = 49
	RemoteSocketServiceError_SYS_ENOCSI          RemoteSocketServiceError_SystemError = 50
	RemoteSocketServiceError_SYS_EL2HLT          RemoteSocketServiceError_SystemError = 51
	RemoteSocketServiceError_SYS_EBADE           RemoteSocketServiceError_SystemError = 52
	RemoteSocketServiceError_SYS_EBADR           RemoteSocketServiceError_SystemError = 53
	RemoteSocketServiceError_SYS_EXFULL          RemoteSocketServiceError_SystemError = 54
	RemoteSocketServiceError_SYS_ENOANO          RemoteSocketServiceError_SystemError = 55
	RemoteSocketServiceError_SYS_EBADRQC         RemoteSocketServiceError_SystemError = 56
	RemoteSocketServiceError_SYS_EBADSLT         RemoteSocketServiceError_SystemError = 57
	RemoteSocketServiceError_SYS_EBFONT          RemoteSocketServiceError_SystemError = 59
	RemoteSocketServiceError_SYS_ENOSTR          RemoteSocketServiceError_SystemError = 60
	RemoteSocketServiceError_SYS_ENODATA         RemoteSocketServiceError_SystemError = 61
	RemoteSocketServiceError_SYS_ETIME           RemoteSocketServiceError_SystemError = 62
	RemoteSocketServiceError_SYS_ENOSR           RemoteSocketServiceError_SystemError = 63
	RemoteSocketServiceError_SYS_ENONET          RemoteSocketServiceError_SystemError = 64
	RemoteSocketServiceError_SYS_ENOPKG          RemoteSocketServiceError_SystemError = 65
	RemoteSocketServiceError_SYS_EREMOTE         RemoteSocketServiceError_SystemError = 66
	RemoteSocketServiceError_SYS_ENOLINK         RemoteSocketServiceError_SystemError = 67
	RemoteSocketServiceError_SYS_EADV            RemoteSocketServiceError_SystemError = 68
	RemoteSocketServiceError_SYS_ESRMNT          RemoteSocketServiceError_SystemError = 69
	RemoteSocketServiceError_SYS_ECOMM           RemoteSocketServiceError_SystemError = 70
	RemoteSocketServiceError_SYS_EPROTO          RemoteSocketServiceError_SystemError = 71
	RemoteSocketServiceError_SYS_EMULTIHOP       RemoteSocketServiceError_SystemError = 72
	RemoteSocketServiceError_SYS_EDOTDOT         RemoteSocketServiceError_SystemError = 73
	RemoteSocketServiceError_SYS_EBADMSG         RemoteSocketServiceError_SystemError = 74
	RemoteSocketServiceError_SYS_EOVERFLOW       RemoteSocketServiceError_SystemError = 75
	RemoteSocketServiceError_SYS_ENOTUNIQ        RemoteSocketServiceError_SystemError = 76
	RemoteSocketServiceError_SYS_EBADFD          RemoteSocketServiceError_SystemError = 77
	RemoteSocketServiceError_SYS_EREMCHG         RemoteSocketServiceError_SystemError = 78
	RemoteSocketServiceError_SYS_ELIBACC         RemoteSocketServiceError_SystemError = 79
	RemoteSocketServiceError_SYS_ELIBBAD         RemoteSocketServiceError_SystemError = 80
	RemoteSocketServiceError_SYS_ELIBSCN         RemoteSocketServiceError_SystemError = 81
	RemoteSocketServiceError_SYS_ELIBMAX         RemoteSocketServiceError_SystemError = 82
	RemoteSocketServiceError_SYS_ELIBEXEC        RemoteSocketServiceError_SystemError = 83
	RemoteSocketServiceError_SYS_EILSEQ          RemoteSocketServiceError_SystemError = 84
	RemoteSocketServiceError_SYS_ERESTART        RemoteSocketServiceError_SystemError = 85
	RemoteSocketServiceError_SYS_ESTRPIPE        RemoteSocketServiceError_SystemError = 86
	RemoteSocketServiceError_SYS_EUSERS          RemoteSocketServiceError_SystemError = 87
	RemoteSocketServiceError_SYS_ENOTSOCK        RemoteSocketServiceError_SystemError = 88
	RemoteSocketServiceError_SYS_EDESTADDRREQ    RemoteSocketServiceError_SystemError = 89
	RemoteSocketServiceError_SYS_EMSGSIZE        RemoteSocketServiceError_SystemError = 90
	RemoteSocketServiceError_SYS_EPROTOTYPE      RemoteSocketServiceError_SystemError = 91
	RemoteSocketServiceError_SYS_ENOPROTOOPT     RemoteSocketServiceError_SystemError = 92
	RemoteSocketServiceError_SYS_EPROTONOSUPPORT RemoteSocketServiceError_SystemError = 93
	RemoteSocketServiceError_SYS_ESOCKTNOSUPPORT RemoteSocketServiceError_SystemError = 94
	RemoteSocketServiceError_SYS_EOPNOTSUPP      RemoteSocketServiceError_SystemError = 95
	RemoteSocketServiceError_SYS_ENOTSUP         RemoteSocketServiceError_SystemError = 95
	RemoteSocketServiceError_SYS_EPFNOSUPPORT    RemoteSocketServiceError_SystemError = 96
	RemoteSocketServiceError_SYS_EAFNOSUPPORT    RemoteSocketServiceError_SystemError = 97
	RemoteSocketServiceError_SYS_EADDRINUSE      RemoteSocketServiceError_SystemError = 98
	RemoteSocketServiceError_SYS_EADDRNOTAVAIL   RemoteSocketServiceError_SystemError = 99
	RemoteSocketServiceError_SYS_ENETDOWN        RemoteSocketServiceError_SystemError = 100
	RemoteSocketServiceError_SYS_ENETUNREACH     RemoteSocketServiceError_SystemError = 101
	RemoteSocketServiceError_SYS_ENETRESET       RemoteSocketServiceError_SystemError = 102
	RemoteSocketServiceError_SYS_ECONNABORTED    RemoteSocketServiceError_SystemError = 103
	RemoteSocketServiceError_SYS_ECONNRESET      RemoteSocketServiceError_SystemError = 104
	RemoteSocketServiceError_SYS_ENOBUFS         RemoteSocketServiceError_SystemError = 105
	RemoteSocketServiceError_SYS_EISCONN         RemoteSocketServiceError_SystemError = 106
	RemoteSocketServiceError_SYS_ENOTCONN        RemoteSocketServiceError_SystemError = 107
	RemoteSocketServiceError_SYS_ESHUTDOWN       RemoteSocketServiceError_SystemError = 108
	RemoteSocketServiceError_SYS_ETOOMANYREFS    RemoteSocketServiceError_SystemError = 109
	RemoteSocketServiceError_SYS_ETIMEDOUT       RemoteSocketServiceError_SystemError = 110
	RemoteSocketServiceError_SYS_ECONNREFUSED    RemoteSocketServiceError_SystemError = 111
	RemoteSocketServiceError_SYS_EHOSTDOWN       RemoteSocketServiceError_SystemError = 112
	RemoteSocketServiceError_SYS_EHOSTUNREACH    RemoteSocketServiceError_SystemError = 113
	RemoteSocketServiceError_SYS_EALREADY        RemoteSocketServiceError_SystemError = 114
	RemoteSocketServiceError_SYS_EINPROGRESS     RemoteSocketServiceError_SystemError = 115
	RemoteSocketServiceError_SYS_ESTALE          RemoteSocketServiceError_SystemError = 116
	RemoteSocketServiceError_SYS_EUCLEAN         RemoteSocketServiceError_SystemError = 117
	RemoteSocketServiceError_SYS_ENOTNAM         RemoteSocketServiceError_SystemError = 118
	RemoteSocketServiceError_SYS_ENAVAIL         RemoteSocketServiceError_SystemError = 119
	RemoteSocketServiceError_SYS_EISNAM          RemoteSocketServiceError_SystemError = 120
	RemoteSocketServiceError_SYS_EREMOTEIO       RemoteSocketServiceError_SystemError = 121
	RemoteSocketServiceError_SYS_EDQUOT          RemoteSocketServiceError_SystemError = 122
	RemoteSocketServiceError_SYS_ENOMEDIUM       RemoteSocketServiceError_SystemError = 123
	RemoteSocketServiceError_SYS_EMEDIUMTYPE     RemoteSocketServiceError_SystemError = 124
	RemoteSocketServiceError_SYS_ECANCELED       RemoteSocketServiceError_SystemError = 125
	RemoteSocketServiceError_SYS_ENOKEY          RemoteSocketServiceError_SystemError = 126
	RemoteSocketServiceError_SYS_EKEYEXPIRED     RemoteSocketServiceError_SystemError = 127
	RemoteSocketServiceError_SYS_EKEYREVOKED     RemoteSocketServiceError_SystemError = 128
	RemoteSocketServiceError_SYS_EKEYREJECTED    RemoteSocketServiceError_SystemError = 129
	RemoteSocketServiceError_SYS_EOWNERDEAD      RemoteSocketServiceError_SystemError = 130
	RemoteSocketServiceError_SYS_ENOTRECOVERABLE RemoteSocketServiceError_SystemError = 131
	RemoteSocketServiceError_SYS_ERFKILL         RemoteSocketServiceError_SystemError = 132
)

var RemoteSocketServiceError_SystemError_name = map[int32]string{
	0:  "SYS_SUCCESS",
	1:  "SYS_EPERM",
	2:  "SYS_ENOENT",
	3:  "SYS_ESRCH",
	4:  "SYS_EINTR",
	5:  "SYS_EIO",
	6:  "SYS_ENXIO",
	7:  "SYS_E2BIG",
	8:  "SYS_ENOEXEC",
	9:  "SYS_EBADF",
	10: "SYS_ECHILD",
	11: "SYS_EAGAIN",
	// Duplicate value: 11: "SYS_EWOULDBLOCK",
	12: "SYS_ENOMEM",
	13: "SYS_EACCES",
	14: "SYS_EFAULT",
	15: "SYS_ENOTBLK",
	16: "SYS_EBUSY",
	17: "SYS_EEXIST",
	18: "SYS_EXDEV",
	19: "SYS_ENODEV",
	20: "SYS_ENOTDIR",
	21: "SYS_EISDIR",
	22: "SYS_EINVAL",
	23: "SYS_ENFILE",
	24: "SYS_EMFILE",
	25: "SYS_ENOTTY",
	26: "SYS_ETXTBSY",
	27: "SYS_EFBIG",
	28: "SYS_ENOSPC",
	29: "SYS_ESPIPE",
	30: "SYS_EROFS",
	31: "SYS_EMLINK",
	32: "SYS_EPIPE",
	33: "SYS_EDOM",
	34: "SYS_ERANGE",
	35: "SYS_EDEADLK",
	// Duplicate value: 35: "SYS_EDEADLOCK",
	36: "SYS_ENAMETOOLONG",
	37: "SYS_ENOLCK",
	38: "SYS_ENOSYS",
	39: "SYS_ENOTEMPTY",
	40: "SYS_ELOOP",
	42: "SYS_ENOMSG",
	43: "SYS_EIDRM",
	44: "SYS_ECHRNG",
	45: "SYS_EL2NSYNC",
	46: "SYS_EL3HLT",
	47: "SYS_EL3RST",
	48: "SYS_ELNRNG",
	49: "SYS_EUNATCH",
	50: "SYS_ENOCSI",
	51: "SYS_EL2HLT",
	52: "SYS_EBADE",
	53: "SYS_EBADR",
	54: "SYS_EXFULL",
	55: "SYS_ENOANO",
	56: "SYS_EBADRQC",
	57: "SYS_EBADSLT",
	59: "SYS_EBFONT",
	60: "SYS_ENOSTR",
	61: "SYS_ENODATA",
	62: "SYS_ETIME",
	63: "SYS_ENOSR",
	64: "SYS_ENONET",
	65: "SYS_ENOPKG",
	66: "SYS_EREMOTE",
	67: "SYS_ENOLINK",
	68: "SYS_EADV",
	69: "SYS_ESRMNT",
	70: "SYS_ECOMM",
	71: "SYS_EPROTO",
	72: "SYS_EMULTIHOP",
	73: "SYS_EDOTDOT",
	74: "SYS_EBADMSG",
	75: "SYS_EOVERFLOW",
	76: "SYS_ENOTUNIQ",
	77: "SYS_EBADFD",
	78: "SYS_EREMCHG",
	79: "SYS_ELIBACC",
	80: "SYS_ELIBBAD",
	81: "SYS_ELIBSCN",
	82: "SYS_ELIBMAX",
	83: "SYS_ELIBEXEC",
	84: "SYS_EILSEQ",
	85: "SYS_ERESTART",
	86: "SYS_ESTRPIPE",
	87: "SYS_EUSERS",
	88: "SYS_ENOTSOCK",
	89: "SYS_EDESTADDRREQ",
	90: "SYS_EMSGSIZE",
	91: "SYS_EPROTOTYPE",
	92: "SYS_ENOPROTOOPT",
	93: "SYS_EPROTONOSUPPORT",
	94: "SYS_ESOCKTNOSUPPORT",
	95: "SYS_EOPNOTSUPP",
	// Duplicate value: 95: "SYS_ENOTSUP",
	96:  "SYS_EPFNOSUPPORT",
	97:  "SYS_EAFNOSUPPORT",
	98:  "SYS_EADDRINUSE",
	99:  "SYS_EADDRNOTAVAIL",
	100: "SYS_ENETDOWN",
	101: "SYS_ENETUNREACH",
	102: "SYS_ENETRESET",
	103: "SYS_ECONNABORTED",
	104: "SYS_ECONNRESET",
	105: "SYS_ENOBUFS",
	106: "SYS_EISCONN",
	107: "SYS_ENOTCONN",
	108: "SYS_ESHUTDOWN",
	109: "SYS_ETOOMANYREFS",
	110: "SYS_ETIMEDOUT",
	111: "SYS_ECONNREFUSED",
	112: "SYS_EHOSTDOWN",
	113: "SYS_EHOSTUNREACH",
	114: "SYS_EALREADY",
	115: "SYS_EINPROGRESS",
	116: "SYS_ESTALE",
	117: "SYS_EUCLEAN",
	118: "SYS_ENOTNAM",
	119: "SYS_ENAVAIL",
	120: "SYS_EISNAM",
	121: "SYS_EREMOTEIO",
	122: "SYS_EDQUOT",
	123: "SYS_ENOMEDIUM",
	124: "SYS_EMEDIUMTYPE",
	125: "SYS_ECANCELED",
	126: "SYS_ENOKEY",
	127: "SYS_EKEYEXPIRED",
	128: "SYS_EKEYREVOKED",
	129: "SYS_EKEYREJECTED",
	130: "SYS_EOWNERDEAD",
	131: "SYS_ENOTRECOVERABLE",
	132: "SYS_ERFKILL",
}
var RemoteSocketServiceError_SystemError_value = map[string]int32{
	"SYS_SUCCESS":         0,
	"SYS_EPERM":           1,
	"SYS_ENOENT":          2,
	"SYS_ESRCH":           3,
	"SYS_EINTR":           4,
	"SYS_EIO":             5,
	"SYS_ENXIO":           6,
	"SYS_E2BIG":           7,
	"SYS_ENOEXEC":         8,
	"SYS_EBADF":           9,
	"SYS_ECHILD":          10,
	"SYS_EAGAIN":          11,
	"SYS_EWOULDBLOCK":     11,
	"SYS_ENOMEM":          12,
	"SYS_EACCES":          13,
	"SYS_EFAULT":          14,
	"SYS_ENOTBLK":         15,
	"SYS_EBUSY":           16,
	"SYS_EEXIST":          17,
	"SYS_EXDEV":           18,
	"SYS_ENODEV":          19,
	"SYS_ENOTDIR":         20,
	"SYS_EISDIR":          21,
	"SYS_EINVAL":          22,
	"SYS_ENFILE":          23,
	"SYS_EMFILE":          24,
	"SYS_ENOTTY":          25,
	"SYS_ETXTBSY":         26,
	"SYS_EFBIG":           27,
	"SYS_ENOSPC":          28,
	"SYS_ESPIPE":          29,
	"SYS_EROFS":           30,
	"SYS_EMLINK":          31,
	"SYS_EPIPE":           32,
	"SYS_EDOM":            33,
	"SYS_ERANGE":          34,
	"SYS_EDEADLK":         35,
	"SYS_EDEADLOCK":       35,
	"SYS_ENAMETOOLONG":    36,
	"SYS_ENOLCK":          37,
	"SYS_ENOSYS":          38,
	"SYS_ENOTEMPTY":       39,
	"SYS_ELOOP":           40,
	"SYS_ENOMSG":          42,
	"SYS_EIDRM":           43,
	"SYS_ECHRNG":          44,
	"SYS_EL2NSYNC":        45,
	"SYS_EL3HLT":          46,
	"SYS_EL3RST":          47,
	"SYS_ELNRNG":          48,
	"SYS_EUNATCH":         49,
	"SYS_ENOCSI":          50,
	"SYS_EL2HLT":          51,
	"SYS_EBADE":           52,
	"SYS_EBADR":           53,
	"SYS_EXFULL":          54,
	"SYS_ENOANO":          55,
	"SYS_EBADRQC":         56,
	"SYS_EBADSLT":         57,
	"SYS_EBFONT":          59,
	"SYS_ENOSTR":          60,
	"SYS_ENODATA":         61,
	"SYS_ETIME":           62,
	"SYS_ENOSR":           63,
	"SYS_ENONET":          64,
	"SYS_ENOPKG":          65,
	"SYS_EREMOTE":         66,
	"SYS_ENOLINK":         67,
	"SYS_EADV":            68,
	"SYS_ESRMNT":          69,
	"SYS_ECOMM":           70,
	"SYS_EPROTO":          71,
	"SYS_EMULTIHOP":       72,
	"SYS_EDOTDOT":         73,
	"SYS_EBADMSG":         74,
	"SYS_EOVERFLOW":       75,
	"SYS_ENOTUNIQ":        76,
	"SYS_EBADFD":          77,
	"SYS_EREMCHG":         78,
	"SYS_ELIBACC":         79,
	"SYS_ELIBBAD":         80,
	"SYS_ELIBSCN":         81,
	"SYS_ELIBMAX":         82,
	"SYS_ELIBEXEC":        83,
	"SYS_EILSEQ":          84,
	"SYS_ERESTART":        85,
	"SYS_ESTRPIPE":        86,
	"SYS_EUSERS":          87,
	"SYS_ENOTSOCK":        88,
	"SYS_EDESTADDRREQ":    89,
	"SYS_EMSGSIZE":        90,
	"SYS_EPROTOTYPE":      91,
	"SYS_ENOPROTOOPT":     92,
	"SYS_EPROTONOSUPPORT": 93,
	"SYS_ESOCKTNOSUPPORT": 94,
	"SYS_EOPNOTSUPP":      95,
	"SYS_ENOTSUP":         95,
	"SYS_EPFNOSUPPORT":    96,
	"SYS_EAFNOSUPPORT":    97,
	"SYS_EADDRINUSE":      98,
	"SYS_EADDRNOTAVAIL":   99,
	"SYS_ENETDOWN":        100,
	"SYS_ENETUNREACH":     101,
	"SYS_ENETRESET":       102,
	"SYS_ECONNABORTED":    103,
	"SYS_ECONNRESET":      104,
	"SYS_ENOBUFS":         105,
	"SYS_EISCONN":         106,
	"SYS_ENOTCONN":        107,
	"SYS_ESHUTDOWN":       108,
	"SYS_ETOOMANYREFS":    109,
	"SYS_ETIMEDOUT":       110,
	"SYS_ECONNREFUSED":    111,
	"SYS_EHOSTDOWN":       112,
	"SYS_EHOSTUNREACH":    113,
	"SYS_EALREADY":        114,
	"SYS_EINPROGRESS":     115,
	"SYS_ESTALE":          116,
	"SYS_EUCLEAN":         117,
	"SYS_ENOTNAM":         118,
	"SYS_ENAVAIL":         119,
	"SYS_EISNAM":          120,
	"SYS_EREMOTEIO":       121,
	"SYS_EDQUOT":          122,
	"SYS_ENOMEDIUM":       123,
	"SYS_EMEDIUMTYPE":     124,
	"SYS_ECANCELED":       125,
	"SYS_ENOKEY":          126,
	"SYS_EKEYEXPIRED":     127,
	"SYS_EKEYREVOKED":     128,
	"SYS_EKEYREJECTED":    129,
	"SYS_EOWNERDEAD":      130,
	"SYS_ENOTRECOVERABLE": 131,
	"SYS_ERFKILL":         132,
}

func (x RemoteSocketServiceError_SystemError) Enum() *RemoteSocketServiceError_SystemError {
	p := new(RemoteSocketServiceError_SystemError)
	*p = x
	return p
}
func (x RemoteSocketServiceError_SystemError) String() string {
	return proto.EnumName(RemoteSocketServiceError_SystemError_name, int32(x))
}
func (x *RemoteSocketServiceError_SystemError) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(RemoteSocketServiceError_SystemError_value, data, "RemoteSocketServiceError_SystemError")
	if err != nil {
		return err
	}
	*x = RemoteSocketServiceError_SystemError(value)
	return nil
}

type CreateSocketRequest_SocketFamily int32

const (
	CreateSocketRequest_IPv4 CreateSocketRequest_SocketFamily = 1
	CreateSocketRequest_IPv6 CreateSocketRequest_SocketFamily = 2
)

var CreateSocketRequest_SocketFamily_name = map[int32]string{
	1: "IPv4",
	2: "IPv6",
}
var CreateSocketRequest_SocketFamily_value = map[string]int32{
	"IPv4": 1,
	"IPv6": 2,
}

func (x CreateSocketRequest_SocketFamily) Enum() *CreateSocketRequest_SocketFamily {
	p := new(CreateSocketRequest_SocketFamily)
	*p = x
	return p
}
func (x CreateSocketRequest_SocketFamily) String() string {
	return proto.EnumName(CreateSocketRequest_SocketFamily_name, int32(x))
}
func (x *CreateSocketRequest_SocketFamily) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(CreateSocketRequest_SocketFamily_value, data, "CreateSocketRequest_SocketFamily")
	if err != nil {
		return err
	}
	*x = CreateSocketRequest_SocketFamily(value)
	return nil
}

type CreateSocketRequest_SocketProtocol int32

const (
	CreateSocketRequest_TCP CreateSocketRequest_SocketProtocol = 1
	CreateSocketRequest_UDP CreateSocketRequest_SocketProtocol = 2
)

var CreateSocketRequest_SocketProtocol_name = map[int32]string{
	1: "TCP",
	2: "UDP",
}
var CreateSocketRequest_SocketProtocol_value = map[string]int32{
	"TCP": 1,
	"UDP": 2,
}

func (x CreateSocketRequest_SocketProtocol) Enum() *CreateSocketRequest_SocketProtocol {
	p := new(CreateSocketRequest_SocketProtocol)
	*p = x
	return p
}
func (x CreateSocketRequest_SocketProtocol) String() string {
	return proto.EnumName(CreateSocketRequest_SocketProtocol_name, int32(x))
}
func (x *CreateSocketRequest_SocketProtocol) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(CreateSocketRequest_SocketProtocol_value, data, "CreateSocketRequest_SocketProtocol")
	if err != nil {
		return err
	}
	*x = CreateSocketRequest_SocketProtocol(value)
	return nil
}

type SocketOption_SocketOptionLevel int32

const (
	SocketOption_SOCKET_SOL_IP     SocketOption_SocketOptionLevel = 0
	SocketOption_SOCKET_SOL_SOCKET SocketOption_SocketOptionLevel = 1
	SocketOption_SOCKET_SOL_TCP    SocketOption_SocketOptionLevel = 6
	SocketOption_SOCKET_SOL_UDP    SocketOption_SocketOptionLevel = 17
)

var SocketOption_SocketOptionLevel_name = map[int32]string{
	0:  "SOCKET_SOL_IP",
	1:  "SOCKET_SOL_SOCKET",
	6:  "SOCKET_SOL_TCP",
	17: "SOCKET_SOL_UDP",
}
var SocketOption_SocketOptionLevel_value = map[string]int32{
	"SOCKET_SOL_IP":     0,
	"SOCKET_SOL_SOCKET": 1,
	"SOCKET_SOL_TCP":    6,
	"SOCKET_SOL_UDP":    17,
}

func (x SocketOption_SocketOptionLevel) Enum() *SocketOption_SocketOptionLevel {
	p := new(SocketOption_SocketOptionLevel)
	*p = x
	return p
}
func (x SocketOption_SocketOptionLevel) String() string {
	return proto.EnumName(SocketOption_SocketOptionLevel_name, int32(x))
}
func (x *SocketOption_SocketOptionLevel) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(SocketOption_SocketOptionLevel_value, data, "SocketOption_SocketOptionLevel")
	if err != nil {
		return err
	}
	*x = SocketOption_SocketOptionLevel(value)
	return nil
}

type SocketOption_SocketOptionName int32

const (
	SocketOption_SOCKET_SO_DEBUG         SocketOption_SocketOptionName = 1
	SocketOption_SOCKET_SO_REUSEADDR     SocketOption_SocketOptionName = 2
	SocketOption_SOCKET_SO_TYPE          SocketOption_SocketOptionName = 3
	SocketOption_SOCKET_SO_ERROR         SocketOption_SocketOptionName = 4
	SocketOption_SOCKET_SO_DONTROUTE     SocketOption_SocketOptionName = 5
	SocketOption_SOCKET_SO_BROADCAST     SocketOption_SocketOptionName = 6
	SocketOption_SOCKET_SO_SNDBUF        SocketOption_SocketOptionName = 7
	SocketOption_SOCKET_SO_RCVBUF        SocketOption_SocketOptionName = 8
	SocketOption_SOCKET_SO_KEEPALIVE     SocketOption_SocketOptionName = 9
	SocketOption_SOCKET_SO_OOBINLINE     SocketOption_SocketOptionName = 10
	SocketOption_SOCKET_SO_LINGER        SocketOption_SocketOptionName = 13
	SocketOption_SOCKET_SO_RCVTIMEO      SocketOption_SocketOptionName = 20
	SocketOption_SOCKET_SO_SNDTIMEO      SocketOption_SocketOptionName = 21
	SocketOption_SOCKET_IP_TOS           SocketOption_SocketOptionName = 1
	SocketOption_SOCKET_IP_TTL           SocketOption_SocketOptionName = 2
	SocketOption_SOCKET_IP_HDRINCL       SocketOption_SocketOptionName = 3
	SocketOption_SOCKET_IP_OPTIONS       SocketOption_SocketOptionName = 4
	SocketOption_SOCKET_TCP_NODELAY      SocketOption_SocketOptionName = 1
	SocketOption_SOCKET_TCP_MAXSEG       SocketOption_SocketOptionName = 2
	SocketOption_SOCKET_TCP_CORK         SocketOption_SocketOptionName = 3
	SocketOption_SOCKET_TCP_KEEPIDLE     SocketOption_SocketOptionName = 4
	SocketOption_SOCKET_TCP_KEEPINTVL    SocketOption_SocketOptionName = 5
	SocketOption_SOCKET_TCP_KEEPCNT      SocketOption_SocketOptionName = 6
	SocketOption_SOCKET_TCP_SYNCNT       SocketOption_SocketOptionName = 7
	SocketOption_SOCKET_TCP_LINGER2      SocketOption_SocketOptionName = 8
	SocketOption_SOCKET_TCP_DEFER_ACCEPT SocketOption_SocketOptionName = 9
	SocketOption_SOCKET_TCP_WINDOW_CLAMP SocketOption_SocketOptionName = 10
	SocketOption_SOCKET_TCP_INFO         SocketOption_SocketOptionName = 11
	SocketOption_SOCKET_TCP_QUICKACK     SocketOption_SocketOptionName = 12
)

var SocketOption_SocketOptionName_name = map[int32]string{
	1:  "SOCKET_SO_DEBUG",
	2:  "SOCKET_SO_REUSEADDR",
	3:  "SOCKET_SO_TYPE",
	4:  "SOCKET_SO_ERROR",
	5:  "SOCKET_SO_DONTROUTE",
	6:  "SOCKET_SO_BROADCAST",
	7:  "SOCKET_SO_SNDBUF",
	8:  "SOCKET_SO_RCVBUF",
	9:  "SOCKET_SO_KEEPALIVE",
	10: "SOCKET_SO_OOBINLINE",
	13: "SOCKET_SO_LINGER",
	20: "SOCKET_SO_RCVTIMEO",
	21: "SOCKET_SO_SNDTIMEO",
	// Duplicate value: 1: "SOCKET_IP_TOS",
	// Duplicate value: 2: "SOCKET_IP_TTL",
	// Duplicate value: 3: "SOCKET_IP_HDRINCL",
	// Duplicate value: 4: "SOCKET_IP_OPTIONS",
	// Duplicate value: 1: "SOCKET_TCP_NODELAY",
	// Duplicate value: 2: "SOCKET_TCP_MAXSEG",
	// Duplicate value: 3: "SOCKET_TCP_CORK",
	// Duplicate value: 4: "SOCKET_TCP_KEEPIDLE",
	// Duplicate value: 5: "SOCKET_TCP_KEEPINTVL",
	// Duplicate value: 6: "SOCKET_TCP_KEEPCNT",
	// Duplicate value: 7: "SOCKET_TCP_SYNCNT",
	// Duplicate value: 8: "SOCKET_TCP_LINGER2",
	// Duplicate value: 9: "SOCKET_TCP_DEFER_ACCEPT",
	// Duplicate value: 10: "SOCKET_TCP_WINDOW_CLAMP",
	11: "SOCKET_TCP_INFO",
	12: "SOCKET_TCP_QUICKACK",
}
var SocketOption_SocketOptionName_value = map[string]int32{
	"SOCKET_SO_DEBUG":         1,
	"SOCKET_SO_REUSEADDR":     2,
	"SOCKET_SO_TYPE":          3,
	"SOCKET_SO_ERROR":         4,
	"SOCKET_SO_DONTROUTE":     5,
	"SOCKET_SO_BROADCAST":     6,
	"SOCKET_SO_SNDBUF":        7,
	"SOCKET_SO_RCVBUF":        8,
	"SOCKET_SO_KEEPALIVE":     9,
	"SOCKET_SO_OOBINLINE":     10,
	"SOCKET_SO_LINGER":        13,
	"SOCKET_SO_RCVTIMEO":      20,
	"SOCKET_SO_SNDTIMEO":      21,
	"SOCKET_IP_TOS":           1,
	"SOCKET_IP_TTL":           2,
	"SOCKET_IP_HDRINCL":       3,
	"SOCKET_IP_OPTIONS":       4,
	"SOCKET_TCP_NODELAY":      1,
	"SOCKET_TCP_MAXSEG":       2,
	"SOCKET_TCP_CORK":         3,
	"SOCKET_TCP_KEEPIDLE":     4,
	"SOCKET_TCP_KEEPINTVL":    5,
	"SOCKET_TCP_KEEPCNT":      6,
	"SOCKET_TCP_SYNCNT":       7,
	"SOCKET_TCP_LINGER2":      8,
	"SOCKET_TCP_DEFER_ACCEPT": 9,
	"SOCKET_TCP_WINDOW_CLAMP": 10,
	"SOCKET_TCP_INFO":         11,
	"SOCKET_TCP_QUICKACK":     12,
}

func (x SocketOption_SocketOptionName) Enum() *SocketOption_SocketOptionName {
	p := new(SocketOption_SocketOptionName)
	*p = x
	return p
}
func (x SocketOption_SocketOptionName) String() string {
	return proto.EnumName(SocketOption_SocketOptionName_name, int32(x))
}
func (x *SocketOption_SocketOptionName) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(SocketOption_SocketOptionName_value, data, "SocketOption_SocketOptionName")
	if err != nil {
		return err
	}
	*x = SocketOption_SocketOptionName(value)
	return nil
}

type ShutDownRequest_How int32

const (
	ShutDownRequest_SOCKET_SHUT_RD   ShutDownRequest_How = 1
	ShutDownRequest_SOCKET_SHUT_WR   ShutDownRequest_How = 2
	ShutDownRequest_SOCKET_SHUT_RDWR ShutDownRequest_How = 3
)

var ShutDownRequest_How_name = map[int32]string{
	1: "SOCKET_SHUT_RD",
	2: "SOCKET_SHUT_WR",
	3: "SOCKET_SHUT_RDWR",
}
var ShutDownRequest_How_value = map[string]int32{
	"SOCKET_SHUT_RD":   1,
	"SOCKET_SHUT_WR":   2,
	"SOCKET_SHUT_RDWR": 3,
}

func (x ShutDownRequest_How) Enum() *ShutDownRequest_How {
	p := new(ShutDownRequest_How)
	*p = x
	return p
}
func (x ShutDownRequest_How) String() string {
	return proto.EnumName(ShutDownRequest_How_name, int32(x))
}
func (x *ShutDownRequest_How) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(ShutDownRequest_How_value, data, "ShutDownRequest_How")
	if err != nil {
		return err
	}
	*x = ShutDownRequest_How(value)
	return nil
}

type ReceiveRequest_Flags int32

const (
	ReceiveRequest_MSG_OOB  ReceiveRequest_Flags = 1
	ReceiveRequest_MSG_PEEK ReceiveRequest_Flags = 2
)

var ReceiveRequest_Flags_name = map[int32]string{
	1: "MSG_OOB",
	2: "MSG_PEEK",
}
var ReceiveRequest_Flags_value = map[string]int32{
	"MSG_OOB":  1,
	"MSG_PEEK": 2,
}

func (x ReceiveRequest_Flags) Enum() *ReceiveRequest_Flags {
	p := new(ReceiveRequest_Flags)
	*p = x
	return p
}
func (x ReceiveRequest_Flags) String() string {
	return proto.EnumName(ReceiveRequest_Flags_name, int32(x))
}
func (x *ReceiveRequest_Flags) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(ReceiveRequest_Flags_value, data, "ReceiveRequest_Flags")
	if err != nil {
		return err
	}
	*x = ReceiveRequest_Flags(value)
	return nil
}

type PollEvent_PollEventFlag int32

const (
	PollEvent_SOCKET_POLLNONE   PollEvent_PollEventFlag = 0
	PollEvent_SOCKET_POLLIN     PollEvent_PollEventFlag = 1
	PollEvent_SOCKET_POLLPRI    PollEvent_PollEventFlag = 2
	PollEvent_SOCKET_POLLOUT    PollEvent_PollEventFlag = 4
	PollEvent_SOCKET_POLLERR    PollEvent_PollEventFlag = 8
	PollEvent_SOCKET_POLLHUP    PollEvent_PollEventFlag = 16
	PollEvent_SOCKET_POLLNVAL   PollEvent_PollEventFlag = 32
	PollEvent_SOCKET_POLLRDNORM PollEvent_PollEventFlag = 64
	PollEvent_SOCKET_POLLRDBAND PollEvent_PollEventFlag = 128
	PollEvent_SOCKET_POLLWRNORM PollEvent_PollEventFlag = 256
	PollEvent_SOCKET_POLLWRBAND PollEvent_PollEventFlag = 512
	PollEvent_SOCKET_POLLMSG    PollEvent_PollEventFlag = 1024
	PollEvent_SOCKET_POLLREMOVE PollEvent_PollEventFlag = 4096
	PollEvent_SOCKET_POLLRDHUP  PollEvent_PollEventFlag = 8192
)

var PollEvent_PollEventFlag_name = map[int32]string{
	0:    "SOCKET_POLLNONE",
	1:    "SOCKET_POLLIN",
	2:    "SOCKET_POLLPRI",
	4:    "SOCKET_POLLOUT",
	8:    "SOCKET_POLLERR",
	16:   "SOCKET_POLLHUP",
	32:   "SOCKET_POLLNVAL",
	64:   "SOCKET_POLLRDNORM",
	128:  "SOCKET_POLLRDBAND",
	256:  "SOCKET_POLLWRNORM",
	512:  "SOCKET_POLLWRBAND",
	1024: "SOCKET_POLLMSG",
	4096: "SOCKET_POLLREMOVE",
	8192: "SOCKET_POLLRDHUP",
}
var PollEvent_PollEventFlag_value = map[string]int32{
	"SOCKET_POLLNONE":   0,
	"SOCKET_POLLIN":     1,
	"SOCKET_POLLPRI":    2,
	"SOCKET_POLLOUT":    4,
	"SOCKET_POLLERR":    8,
	"SOCKET_POLLHUP":    16,
	"SOCKET_POLLNVAL":   32,
	"SOCKET_POLLRDNORM": 64,
	"SOCKET_POLLRDBAND": 128,
	"SOCKET_POLLWRNORM": 256,
	"SOCKET_POLLWRBAND": 512,
	"SOCKET_POLLMSG":    1024,
	"SOCKET_POLLREMOVE": 4096,
	"SOCKET_POLLRDHUP":  8192,
}

func (x PollEvent_PollEventFlag) Enum() *PollEvent_PollEventFlag {
	p := new(PollEvent_PollEventFlag)
	*p = x
	return p
}
func (x PollEvent_PollEventFlag) String() string {
	return proto.EnumName(PollEvent_PollEventFlag_name, int32(x))
}
func (x *PollEvent_PollEventFlag) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(PollEvent_PollEventFlag_value, data, "PollEvent_PollEventFlag")
	if err != nil {
		return err
	}
	*x = PollEvent_PollEventFlag(value)
	return nil
}

type ResolveReply_ErrorCode int32

const (
	ResolveReply_SOCKET_EAI_ADDRFAMILY ResolveReply_ErrorCode = 1
	ResolveReply_SOCKET_EAI_AGAIN      ResolveReply_ErrorCode = 2
	ResolveReply_SOCKET_EAI_BADFLAGS   ResolveReply_ErrorCode = 3
	ResolveReply_SOCKET_EAI_FAIL       ResolveReply_ErrorCode = 4
	ResolveReply_SOCKET_EAI_FAMILY     ResolveReply_ErrorCode = 5
	ResolveReply_SOCKET_EAI_MEMORY     ResolveReply_ErrorCode = 6
	ResolveReply_SOCKET_EAI_NODATA     ResolveReply_ErrorCode = 7
	ResolveReply_SOCKET_EAI_NONAME     ResolveReply_ErrorCode = 8
	ResolveReply_SOCKET_EAI_SERVICE    ResolveReply_ErrorCode = 9
	ResolveReply_SOCKET_EAI_SOCKTYPE   ResolveReply_ErrorCode = 10
	ResolveReply_SOCKET_EAI_SYSTEM     ResolveReply_ErrorCode = 11
	ResolveReply_SOCKET_EAI_BADHINTS   ResolveReply_ErrorCode = 12
	ResolveReply_SOCKET_EAI_PROTOCOL   ResolveReply_ErrorCode = 13
	ResolveReply_SOCKET_EAI_OVERFLOW   ResolveReply_ErrorCode = 14
	ResolveReply_SOCKET_EAI_MAX        ResolveReply_ErrorCode = 15
)

var ResolveReply_ErrorCode_name = map[int32]string{
	1:  "SOCKET_EAI_ADDRFAMILY",
	2:  "SOCKET_EAI_AGAIN",
	3:  "SOCKET_EAI_BADFLAGS",
	4:  "SOCKET_EAI_FAIL",
	5:  "SOCKET_EAI_FAMILY",
	6:  "SOCKET_EAI_MEMORY",
	7:  "SOCKET_EAI_NODATA",
	8:  "SOCKET_EAI_NONAME",
	9:  "SOCKET_EAI_SERVICE",
	10: "SOCKET_EAI_SOCKTYPE",
	11: "SOCKET_EAI_SYSTEM",
	12: "SOCKET_EAI_BADHINTS",
	13: "SOCKET_EAI_PROTOCOL",
	14: "SOCKET_EAI_OVERFLOW",
	15: "SOCKET_EAI_MAX",
}
var ResolveReply_ErrorCode_value = map[string]int32{
	"SOCKET_EAI_ADDRFAMILY": 1,
	"SOCKET_EAI_AGAIN":      2,
	"SOCKET_EAI_BADFLAGS":   3,
	"SOCKET_EAI_FAIL":       4,
	"SOCKET_EAI_FAMILY":     5,
	"SOCKET_EAI_MEMORY":     6,
	"SOCKET_EAI_NODATA":     7,
	"SOCKET_EAI_NONAME":     8,
	"SOCKET_EAI_SERVICE":    9,
	"SOCKET_EAI_SOCKTYPE":   10,
	"SOCKET_EAI_SYSTEM":     11,
	"SOCKET_EAI_BADHINTS":   12,
	"SOCKET_EAI_PROTOCOL":   13,
	"SOCKET_EAI_OVERFLOW":   14,
	"SOCKET_EAI_MAX":        15,
}

func (x ResolveReply_ErrorCode) Enum() *ResolveReply_ErrorCode {
	p := new(ResolveReply_ErrorCode)
	*p = x
	return p
}
func (x ResolveReply_ErrorCode) String() string {
	return proto.EnumName(ResolveReply_ErrorCode_name, int32(x))
}
func (x *ResolveReply_ErrorCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(ResolveReply_ErrorCode_value, data, "ResolveReply_ErrorCode")
	if err != nil {
		return err
	}
	*x = ResolveReply_ErrorCode(value)
	return nil
}

type RemoteSocketServiceError struct {
	SystemError      *int32  `protobuf:"varint,1,opt,name=system_error,def=0" json:"system_error,omitempty"`
	ErrorDetail      *string `protobuf:"bytes,2,opt,name=error_detail" json:"error_detail,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *RemoteSocketServiceError) Reset()         { *m = RemoteSocketServiceError{} }
func (m *RemoteSocketServiceError) String() string { return proto.CompactTextString(m) }
func (*RemoteSocketServiceError) ProtoMessage()    {}

const Default_RemoteSocketServiceError_SystemError int32 = 0

func (m *RemoteSocketServiceError) GetSystemError() int32 {
	if m != nil && m.SystemError != nil {
		return *m.SystemError
	}
	return Default_RemoteSocketServiceError_SystemError
}

func (m *RemoteSocketServiceError) GetErrorDetail() string {
	if m != nil && m.ErrorDetail != nil {
		return *m.ErrorDetail
	}
	return ""
}

type AddressPort struct {
	Port             *int32  `protobuf:"varint,1,req,name=port" json:"port,omitempty"`
	PackedAddress    []byte  `protobuf:"bytes,2,opt,name=packed_address" json:"packed_address,omitempty"`
	HostnameHint     *string `protobuf:"bytes,3,opt,name=hostname_hint" json:"hostname_hint,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *AddressPort) Reset()         { *m = AddressPort{} }
func (m *AddressPort) String() string { return proto.CompactTextString(m) }
func (*AddressPort) ProtoMessage()    {}

func (m *AddressPort) GetPort() int32 {
	if m != nil && m.Port != nil {
		return *m.Port
	}
	return 0
}

func (m *AddressPort) GetPackedAddress() []byte {
	if m != nil {
		return m.PackedAddress
	}
	return nil
}

func (m *AddressPort) GetHostnameHint() string {
	if m != nil && m.HostnameHint != nil {
		return *m.HostnameHint
	}
	return ""
}

type CreateSocketRequest struct {
	Family           *CreateSocketRequest_SocketFamily   `protobuf:"varint,1,req,name=family,enum=appengine.CreateSocketRequest_SocketFamily" json:"family,omitempty"`
	Protocol         *CreateSocketRequest_SocketProtocol `protobuf:"varint,2,req,name=protocol,enum=appengine.CreateSocketRequest_SocketProtocol" json:"protocol,omitempty"`
	SocketOptions    []*SocketOption                     `protobuf:"bytes,3,rep,name=socket_options" json:"socket_options,omitempty"`
	ProxyExternalIp  *AddressPort                        `protobuf:"bytes,4,opt,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	ListenBacklog    *int32                              `protobuf:"varint,5,opt,name=listen_backlog,def=0" json:"listen_backlog,omitempty"`
	RemoteIp         *AddressPort                        `protobuf:"bytes,6,opt,name=remote_ip" json:"remote_ip,omitempty"`
	AppId            *string                             `protobuf:"bytes,9,opt,name=app_id" json:"app_id,omitempty"`
	ProjectId        *int64                              `protobuf:"varint,10,opt,name=project_id" json:"project_id,omitempty"`
	XXX_unrecognized []byte                              `json:"-"`
}

func (m *CreateSocketRequest) Reset()         { *m = CreateSocketRequest{} }
func (m *CreateSocketRequest) String() string { return proto.CompactTextString(m) }
func (*CreateSocketRequest) ProtoMessage()    {}

const Default_CreateSocketRequest_ListenBacklog int32 = 0

func (m *CreateSocketRequest) GetFamily() CreateSocketRequest_SocketFamily {
	if m != nil && m.Family != nil {
		return *m.Family
	}
	return CreateSocketRequest_IPv4
}

func (m *CreateSocketRequest) GetProtocol() CreateSocketRequest_SocketProtocol {
	if m != nil && m.Protocol != nil {
		return *m.Protocol
	}
	return CreateSocketRequest_TCP
}

func (m *CreateSocketRequest) GetSocketOptions() []*SocketOption {
	if m != nil {
		return m.SocketOptions
	}
	return nil
}

func (m *CreateSocketRequest) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

func (m *CreateSocketRequest) GetListenBacklog() int32 {
	if m != nil && m.ListenBacklog != nil {
		return *m.ListenBacklog
	}
	return Default_CreateSocketRequest_ListenBacklog
}

func (m *CreateSocketRequest) GetRemoteIp() *AddressPort {
	if m != nil {
		return m.RemoteIp
	}
	return nil
}

func (m *CreateSocketRequest) GetAppId() string {
	if m != nil && m.AppId != nil {
		return *m.AppId
	}
	return ""
}

func (m *CreateSocketRequest) GetProjectId() int64 {
	if m != nil && m.ProjectId != nil {
		return *m.ProjectId
	}
	return 0
}

type CreateSocketReply struct {
	SocketDescriptor *string                   `protobuf:"bytes,1,opt,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	ServerAddress    *AddressPort              `protobuf:"bytes,3,opt,name=server_address" json:"server_address,omitempty"`
	ProxyExternalIp  *AddressPort              `protobuf:"bytes,4,opt,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	XXX_extensions   map[int32]proto.Extension `json:"-"`
	XXX_unrecognized []byte                    `json:"-"`
}

func (m *CreateSocketReply) Reset()         { *m = CreateSocketReply{} }
func (m *CreateSocketReply) String() string { return proto.CompactTextString(m) }
func (*CreateSocketReply) ProtoMessage()    {}

var extRange_CreateSocketReply = []proto.ExtensionRange{
	{1000, 536870911},
}

func (*CreateSocketReply) ExtensionRangeArray() []proto.ExtensionRange {
	return extRange_CreateSocketReply
}
func (m *CreateSocketReply) ExtensionMap() map[int32]proto.Extension {
	if m.XXX_extensions == nil {
		m.XXX_extensions = make(map[int32]proto.Extension)
	}
	return m.XXX_extensions
}

func (m *CreateSocketReply) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *CreateSocketReply) GetServerAddress() *AddressPort {
	if m != nil {
		return m.ServerAddress
	}
	return nil
}

func (m *CreateSocketReply) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

type BindRequest struct {
	SocketDescriptor *string      `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	ProxyExternalIp  *AddressPort `protobuf:"bytes,2,req,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *BindRequest) Reset()         { *m = BindRequest{} }
func (m *BindRequest) String() string { return proto.CompactTextString(m) }
func (*BindRequest) ProtoMessage()    {}

func (m *BindRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *BindRequest) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

type BindReply struct {
	ProxyExternalIp  *AddressPort `protobuf:"bytes,1,opt,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *BindReply) Reset()         { *m = BindReply{} }
func (m *BindReply) String() string { return proto.CompactTextString(m) }
func (*BindReply) ProtoMessage()    {}

func (m *BindReply) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

type GetSocketNameRequest struct {
	SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *GetSocketNameRequest) Reset()         { *m = GetSocketNameRequest{} }
func (m *GetSocketNameRequest) String() string { return proto.CompactTextString(m) }
func (*GetSocketNameRequest) ProtoMessage()    {}

func (m *GetSocketNameRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

type GetSocketNameReply struct {
	ProxyExternalIp  *AddressPort `protobuf:"bytes,2,opt,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *GetSocketNameReply) Reset()         { *m = GetSocketNameReply{} }
func (m *GetSocketNameReply) String() string { return proto.CompactTextString(m) }
func (*GetSocketNameReply) ProtoMessage()    {}

func (m *GetSocketNameReply) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

type GetPeerNameRequest struct {
	SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *GetPeerNameRequest) Reset()         { *m = GetPeerNameRequest{} }
func (m *GetPeerNameRequest) String() string { return proto.CompactTextString(m) }
func (*GetPeerNameRequest) ProtoMessage()    {}

func (m *GetPeerNameRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

type GetPeerNameReply struct {
	PeerIp           *AddressPort `protobuf:"bytes,2,opt,name=peer_ip" json:"peer_ip,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *GetPeerNameReply) Reset()         { *m = GetPeerNameReply{} }
func (m *GetPeerNameReply) String() string { return proto.CompactTextString(m) }
func (*GetPeerNameReply) ProtoMessage()    {}

func (m *GetPeerNameReply) GetPeerIp() *AddressPort {
	if m != nil {
		return m.PeerIp
	}
	return nil
}

type SocketOption struct {
	Level            *SocketOption_SocketOptionLevel `protobuf:"varint,1,req,name=level,enum=appengine.SocketOption_SocketOptionLevel" json:"level,omitempty"`
	Option           *SocketOption_SocketOptionName  `protobuf:"varint,2,req,name=option,enum=appengine.SocketOption_SocketOptionName" json:"option,omitempty"`
	Value            []byte                          `protobuf:"bytes,3,req,name=value" json:"value,omitempty"`
	XXX_unrecognized []byte                          `json:"-"`
}

func (m *SocketOption) Reset()         { *m = SocketOption{} }
func (m *SocketOption) String() string { return proto.CompactTextString(m) }
func (*SocketOption) ProtoMessage()    {}

func (m *SocketOption) GetLevel() SocketOption_SocketOptionLevel {
	if m != nil && m.Level != nil {
		return *m.Level
	}
	return SocketOption_SOCKET_SOL_IP
}

func (m *SocketOption) GetOption() SocketOption_SocketOptionName {
	if m != nil && m.Option != nil {
		return *m.Option
	}
	return SocketOption_SOCKET_SO_DEBUG
}

func (m *SocketOption) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

type SetSocketOptionsRequest struct {
	SocketDescriptor *string         `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	Options          []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"`
	XXX_unrecognized []byte          `json:"-"`
}

func (m *SetSocketOptionsRequest) Reset()         { *m = SetSocketOptionsRequest{} }
func (m *SetSocketOptionsRequest) String() string { return proto.CompactTextString(m) }
func (*SetSocketOptionsRequest) ProtoMessage()    {}

func (m *SetSocketOptionsRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *SetSocketOptionsRequest) GetOptions() []*SocketOption {
	if m != nil {
		return m.Options
	}
	return nil
}

type SetSocketOptionsReply struct {
	XXX_unrecognized []byte `json:"-"`
}

func (m *SetSocketOptionsReply) Reset()         { *m = SetSocketOptionsReply{} }
func (m *SetSocketOptionsReply) String() string { return proto.CompactTextString(m) }
func (*SetSocketOptionsReply) ProtoMessage()    {}

type GetSocketOptionsRequest struct {
	SocketDescriptor *string         `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	Options          []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"`
	XXX_unrecognized []byte          `json:"-"`
}

func (m *GetSocketOptionsRequest) Reset()         { *m = GetSocketOptionsRequest{} }
func (m *GetSocketOptionsRequest) String() string { return proto.CompactTextString(m) }
func (*GetSocketOptionsRequest) ProtoMessage()    {}

func (m *GetSocketOptionsRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *GetSocketOptionsRequest) GetOptions() []*SocketOption {
	if m != nil {
		return m.Options
	}
	return nil
}

type GetSocketOptionsReply struct {
	Options          []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"`
	XXX_unrecognized []byte          `json:"-"`
}

func (m *GetSocketOptionsReply) Reset()         { *m = GetSocketOptionsReply{} }
func (m *GetSocketOptionsReply) String() string { return proto.CompactTextString(m) }
func (*GetSocketOptionsReply) ProtoMessage()    {}

func (m *GetSocketOptionsReply) GetOptions() []*SocketOption {
	if m != nil {
		return m.Options
	}
	return nil
}

type ConnectRequest struct {
	SocketDescriptor *string      `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	RemoteIp         *AddressPort `protobuf:"bytes,2,req,name=remote_ip" json:"remote_ip,omitempty"`
	TimeoutSeconds   *float64     `protobuf:"fixed64,3,opt,name=timeout_seconds,def=-1" json:"timeout_seconds,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *ConnectRequest) Reset()         { *m = ConnectRequest{} }
func (m *ConnectRequest) String() string { return proto.CompactTextString(m) }
func (*ConnectRequest) ProtoMessage()    {}

const Default_ConnectRequest_TimeoutSeconds float64 = -1

func (m *ConnectRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *ConnectRequest) GetRemoteIp() *AddressPort {
	if m != nil {
		return m.RemoteIp
	}
	return nil
}

func (m *ConnectRequest) GetTimeoutSeconds() float64 {
	if m != nil && m.TimeoutSeconds != nil {
		return *m.TimeoutSeconds
	}
	return Default_ConnectRequest_TimeoutSeconds
}

type ConnectReply struct {
	ProxyExternalIp  *AddressPort              `protobuf:"bytes,1,opt,name=proxy_external_ip" json:"proxy_external_ip,omitempty"`
	XXX_extensions   map[int32]proto.Extension `json:"-"`
	XXX_unrecognized []byte                    `json:"-"`
}

func (m *ConnectReply) Reset()         { *m = ConnectReply{} }
func (m *ConnectReply) String() string { return proto.CompactTextString(m) }
func (*ConnectReply) ProtoMessage()    {}

var extRange_ConnectReply = []proto.ExtensionRange{
	{1000, 536870911},
}

func (*ConnectReply) ExtensionRangeArray() []proto.ExtensionRange {
	return extRange_ConnectReply
}
func (m *ConnectReply) ExtensionMap() map[int32]proto.Extension {
	if m.XXX_extensions == nil {
		m.XXX_extensions = make(map[int32]proto.Extension)
	}
	return m.XXX_extensions
}

func (m *ConnectReply) GetProxyExternalIp() *AddressPort {
	if m != nil {
		return m.ProxyExternalIp
	}
	return nil
}

type ListenRequest struct {
	SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	Backlog          *int32  `protobuf:"varint,2,req,name=backlog" json:"backlog,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *ListenRequest) Reset()         { *m = ListenRequest{} }
func (m *ListenRequest) String() string { return proto.CompactTextString(m) }
func (*ListenRequest) ProtoMessage()    {}

func (m *ListenRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *ListenRequest) GetBacklog() int32 {
	if m != nil && m.Backlog != nil {
		return *m.Backlog
	}
	return 0
}

type ListenReply struct {
	XXX_unrecognized []byte `json:"-"`
}

func (m *ListenReply) Reset()         { *m = ListenReply{} }
func (m *ListenReply) String() string { return proto.CompactTextString(m) }
func (*ListenReply) ProtoMessage()    {}

type AcceptRequest struct {
	SocketDescriptor *string  `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	TimeoutSeconds   *float64 `protobuf:"fixed64,2,opt,name=timeout_seconds,def=-1" json:"timeout_seconds,omitempty"`
	XXX_unrecognized []byte   `json:"-"`
}

func (m *AcceptRequest) Reset()         { *m = AcceptRequest{} }
func (m *AcceptRequest) String() string { return proto.CompactTextString(m) }
func (*AcceptRequest) ProtoMessage()    {}

const Default_AcceptRequest_TimeoutSeconds float64 = -1

func (m *AcceptRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *AcceptRequest) GetTimeoutSeconds() float64 {
	if m != nil && m.TimeoutSeconds != nil {
		return *m.TimeoutSeconds
	}
	return Default_AcceptRequest_TimeoutSeconds
}

type AcceptReply struct {
	NewSocketDescriptor []byte       `protobuf:"bytes,2,opt,name=new_socket_descriptor" json:"new_socket_descriptor,omitempty"`
	RemoteAddress       *AddressPort `protobuf:"bytes,3,opt,name=remote_address" json:"remote_address,omitempty"`
	XXX_unrecognized    []byte       `json:"-"`
}

func (m *AcceptReply) Reset()         { *m = AcceptReply{} }
func (m *AcceptReply) String() string { return proto.CompactTextString(m) }
func (*AcceptReply) ProtoMessage()    {}

func (m *AcceptReply) GetNewSocketDescriptor() []byte {
	if m != nil {
		return m.NewSocketDescriptor
	}
	return nil
}

func (m *AcceptReply) GetRemoteAddress() *AddressPort {
	if m != nil {
		return m.RemoteAddress
	}
	return nil
}

type ShutDownRequest struct {
	SocketDescriptor *string              `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	How              *ShutDownRequest_How `protobuf:"varint,2,req,name=how,enum=appengine.ShutDownRequest_How" json:"how,omitempty"`
	SendOffset       *int64               `protobuf:"varint,3,req,name=send_offset" json:"send_offset,omitempty"`
	XXX_unrecognized []byte               `json:"-"`
}

func (m *ShutDownRequest) Reset()         { *m = ShutDownRequest{} }
func (m *ShutDownRequest) String() string { return proto.CompactTextString(m) }
func (*ShutDownRequest) ProtoMessage()    {}

func (m *ShutDownRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *ShutDownRequest) GetHow() ShutDownRequest_How {
	if m != nil && m.How != nil {
		return *m.How
	}
	return ShutDownRequest_SOCKET_SHUT_RD
}

func (m *ShutDownRequest) GetSendOffset() int64 {
	if m != nil && m.SendOffset != nil {
		return *m.SendOffset
	}
	return 0
}

type ShutDownReply struct {
	XXX_unrecognized []byte `json:"-"`
}

func (m *ShutDownReply) Reset()         { *m = ShutDownReply{} }
func (m *ShutDownReply) String() string { return proto.CompactTextString(m) }
func (*ShutDownReply) ProtoMessage()    {}

type CloseRequest struct {
	SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	SendOffset       *int64  `protobuf:"varint,2,opt,name=send_offset,def=-1" json:"send_offset,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *CloseRequest) Reset()         { *m = CloseRequest{} }
func (m *CloseRequest) String() string { return proto.CompactTextString(m) }
func (*CloseRequest) ProtoMessage()    {}

const Default_CloseRequest_SendOffset int64 = -1

func (m *CloseRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *CloseRequest) GetSendOffset() int64 {
	if m != nil && m.SendOffset != nil {
		return *m.SendOffset
	}
	return Default_CloseRequest_SendOffset
}

type CloseReply struct {
	XXX_unrecognized []byte `json:"-"`
}

func (m *CloseReply) Reset()         { *m = CloseReply{} }
func (m *CloseReply) String() string { return proto.CompactTextString(m) }
func (*CloseReply) ProtoMessage()    {}

type SendRequest struct {
	SocketDescriptor *string      `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	Data             []byte       `protobuf:"bytes,2,req,name=data" json:"data,omitempty"`
	StreamOffset     *int64       `protobuf:"varint,3,req,name=stream_offset" json:"stream_offset,omitempty"`
	Flags            *int32       `protobuf:"varint,4,opt,name=flags,def=0" json:"flags,omitempty"`
	SendTo           *AddressPort `protobuf:"bytes,5,opt,name=send_to" json:"send_to,omitempty"`
	TimeoutSeconds   *float64     `protobuf:"fixed64,6,opt,name=timeout_seconds,def=-1" json:"timeout_seconds,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *SendRequest) Reset()         { *m = SendRequest{} }
func (m *SendRequest) String() string { return proto.CompactTextString(m) }
func (*SendRequest) ProtoMessage()    {}

const Default_SendRequest_Flags int32 = 0
const Default_SendRequest_TimeoutSeconds float64 = -1

func (m *SendRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *SendRequest) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *SendRequest) GetStreamOffset() int64 {
	if m != nil && m.StreamOffset != nil {
		return *m.StreamOffset
	}
	return 0
}

func (m *SendRequest) GetFlags() int32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return Default_SendRequest_Flags
}

func (m *SendRequest) GetSendTo() *AddressPort {
	if m != nil {
		return m.SendTo
	}
	return nil
}

func (m *SendRequest) GetTimeoutSeconds() float64 {
	if m != nil && m.TimeoutSeconds != nil {
		return *m.TimeoutSeconds
	}
	return Default_SendRequest_TimeoutSeconds
}

type SendReply struct {
	DataSent         *int32 `protobuf:"varint,1,opt,name=data_sent" json:"data_sent,omitempty"`
	XXX_unrecognized []byte `json:"-"`
}

func (m *SendReply) Reset()         { *m = SendReply{} }
func (m *SendReply) String() string { return proto.CompactTextString(m) }
func (*SendReply) ProtoMessage()    {}

func (m *SendReply) GetDataSent() int32 {
	if m != nil && m.DataSent != nil {
		return *m.DataSent
	}
	return 0
}

type ReceiveRequest struct {
	SocketDescriptor *string  `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	DataSize         *int32   `protobuf:"varint,2,req,name=data_size" json:"data_size,omitempty"`
	Flags            *int32   `protobuf:"varint,3,opt,name=flags,def=0" json:"flags,omitempty"`
	TimeoutSeconds   *float64 `protobuf:"fixed64,5,opt,name=timeout_seconds,def=-1" json:"timeout_seconds,omitempty"`
	XXX_unrecognized []byte   `json:"-"`
}

func (m *ReceiveRequest) Reset()         { *m = ReceiveRequest{} }
func (m *ReceiveRequest) String() string { return proto.CompactTextString(m) }
func (*ReceiveRequest) ProtoMessage()    {}

const Default_ReceiveRequest_Flags int32 = 0
const Default_ReceiveRequest_TimeoutSeconds float64 = -1

func (m *ReceiveRequest) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *ReceiveRequest) GetDataSize() int32 {
	if m != nil && m.DataSize != nil {
		return *m.DataSize
	}
	return 0
}

func (m *ReceiveRequest) GetFlags() int32 {
	if m != nil && m.Flags != nil {
		return *m.Flags
	}
	return Default_ReceiveRequest_Flags
}

func (m *ReceiveRequest) GetTimeoutSeconds() float64 {
	if m != nil && m.TimeoutSeconds != nil {
		return *m.TimeoutSeconds
	}
	return Default_ReceiveRequest_TimeoutSeconds
}

type ReceiveReply struct {
	StreamOffset     *int64       `protobuf:"varint,2,opt,name=stream_offset" json:"stream_offset,omitempty"`
	Data             []byte       `protobuf:"bytes,3,opt,name=data" json:"data,omitempty"`
	ReceivedFrom     *AddressPort `protobuf:"bytes,4,opt,name=received_from" json:"received_from,omitempty"`
	BufferSize       *int32       `protobuf:"varint,5,opt,name=buffer_size" json:"buffer_size,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *ReceiveReply) Reset()         { *m = ReceiveReply{} }
func (m *ReceiveReply) String() string { return proto.CompactTextString(m) }
func (*ReceiveReply) ProtoMessage()    {}

func (m *ReceiveReply) GetStreamOffset() int64 {
	if m != nil && m.StreamOffset != nil {
		return *m.StreamOffset
	}
	return 0
}

func (m *ReceiveReply) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *ReceiveReply) GetReceivedFrom() *AddressPort {
	if m != nil {
		return m.ReceivedFrom
	}
	return nil
}

func (m *ReceiveReply) GetBufferSize() int32 {
	if m != nil && m.BufferSize != nil {
		return *m.BufferSize
	}
	return 0
}

type PollEvent struct {
	SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor" json:"socket_descriptor,omitempty"`
	RequestedEvents  *int32  `protobuf:"varint,2,req,name=requested_events" json:"requested_events,omitempty"`
	ObservedEvents   *int32  `protobuf:"varint,3,req,name=observed_events" json:"observed_events,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

func (m *PollEvent) Reset()         { *m = PollEvent{} }
func (m *PollEvent) String() string { return proto.CompactTextString(m) }
func (*PollEvent) ProtoMessage()    {}

func (m *PollEvent) GetSocketDescriptor() string {
	if m != nil && m.SocketDescriptor != nil {
		return *m.SocketDescriptor
	}
	return ""
}

func (m *PollEvent) GetRequestedEvents() int32 {
	if m != nil && m.RequestedEvents != nil {
		return *m.RequestedEvents
	}
	return 0
}

func (m *PollEvent) GetObservedEvents() int32 {
	if m != nil && m.ObservedEvents != nil {
		return *m.ObservedEvents
	}
	return 0
}

type PollRequest struct {
	Events           []*PollEvent `protobuf:"bytes,1,rep,name=events" json:"events,omitempty"`
	TimeoutSeconds   *float64     `protobuf:"fixed64,2,opt,name=timeout_seconds,def=-1" json:"timeout_seconds,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *PollRequest) Reset()         { *m = PollRequest{} }
func (m *PollRequest) String() string { return proto.CompactTextString(m) }
func (*PollRequest) ProtoMessage()    {}

const Default_PollRequest_TimeoutSeconds float64 = -1

func (m *PollRequest) GetEvents() []*PollEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

func (m *PollRequest) GetTimeoutSeconds() float64 {
	if m != nil && m.TimeoutSeconds != nil {
		return *m.TimeoutSeconds
	}
	return Default_PollRequest_TimeoutSeconds
}

type PollReply struct {
	Events           []*PollEvent `protobuf:"bytes,2,rep,name=events" json:"events,omitempty"`
	XXX_unrecognized []byte       `json:"-"`
}

func (m *PollReply) Reset()         { *m = PollReply{} }
func (m *PollReply) String() string { return proto.CompactTextString(m) }
func (*PollReply) ProtoMessage()    {}

func (m *PollReply) GetEvents() []*PollEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

type ResolveRequest struct {
	Name             *string                            `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
	AddressFamilies  []CreateSocketRequest_SocketFamily `protobuf:"varint,2,rep,name=address_families,enum=appengine.CreateSocketRequest_SocketFamily" json:"address_families,omitempty"`
	XXX_unrecognized []byte                             `json:"-"`
}

func (m *ResolveRequest) Reset()         { *m = ResolveRequest{} }
func (m *ResolveRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveRequest) ProtoMessage()    {}

func (m *ResolveRequest) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *ResolveRequest) GetAddressFamilies() []CreateSocketRequest_SocketFamily {
	if m != nil {
		return m.AddressFamilies
	}
	return nil
}

type ResolveReply struct {
	PackedAddress    [][]byte `protobuf:"bytes,2,rep,name=packed_address" json:"packed_address,omitempty"`
	CanonicalName    *string  `protobuf:"bytes,3,opt,name=canonical_name" json:"canonical_name,omitempty"`
	Aliases          []string `protobuf:"bytes,4,rep,name=aliases" json:"aliases,omitempty"`
	XXX_unrecognized []byte   `json:"-"`
}

func (m *ResolveReply) Reset()         { *m = ResolveReply{} }
func (m *ResolveReply) String() string { return proto.CompactTextString(m) }
func (*ResolveReply) ProtoMessage()    {}

func (m *ResolveReply) GetPackedAddress() [][]byte {
	if m != nil {
		return m.PackedAddress
	}
	return nil
}

func (m *ResolveReply) GetCanonicalName() string {
	if m != nil && m.CanonicalName != nil {
		return *m.CanonicalName
	}
	return ""
}

func (m *ResolveReply) GetAliases() []string {
	if m != nil {
		return m.Aliases
	}
	return nil
}

func init() {
}
