// Code generated by protoc-gen-go.
// source: handshake.proto
// DO NOT EDIT!

/*
Package handshake is a generated protocol buffer package.

It is generated from these files:
	handshake.proto

It has these top-level messages:
	Setup
*/
package handshake

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

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type Setup struct {
	MinVersion        uint32 `protobuf:"varint,1,opt,name=min_version,json=minVersion" json:"min_version,omitempty"`
	MaxVersion        uint32 `protobuf:"varint,2,opt,name=max_version,json=maxVersion" json:"max_version,omitempty"`
	PeerNaclPublicKey []byte `protobuf:"bytes,3,opt,name=peer_nacl_public_key,json=peerNaclPublicKey,proto3" json:"peer_nacl_public_key,omitempty"`
	Mtu               uint64 `protobuf:"varint,4,opt,name=mtu" json:"mtu,omitempty"`
}

func (m *Setup) Reset()                    { *m = Setup{} }
func (m *Setup) String() string            { return proto.CompactTextString(m) }
func (*Setup) ProtoMessage()               {}
func (*Setup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

func init() {
	proto.RegisterType((*Setup)(nil), "handshake.Setup")
}

func init() { proto.RegisterFile("handshake.proto", fileDescriptor0) }

var fileDescriptor0 = []byte{
	// 156 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0xcf, 0x48, 0xcc, 0x4b,
	0x29, 0xce, 0x48, 0xcc, 0x4e, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x84, 0x0b, 0x28,
	0xf5, 0x30, 0x72, 0xb1, 0x06, 0xa7, 0x96, 0x94, 0x16, 0x08, 0xc9, 0x73, 0x71, 0xe7, 0x66, 0xe6,
	0xc5, 0x97, 0xa5, 0x16, 0x15, 0x67, 0xe6, 0xe7, 0x49, 0x30, 0x2a, 0x30, 0x6a, 0xf0, 0x06, 0x71,
	0x01, 0x85, 0xc2, 0x20, 0x22, 0x60, 0x05, 0x89, 0x15, 0x70, 0x05, 0x4c, 0x50, 0x05, 0x89, 0x15,
	0x30, 0x05, 0xfa, 0x5c, 0x22, 0x05, 0xa9, 0xa9, 0x45, 0xf1, 0x79, 0x89, 0xc9, 0x39, 0xf1, 0x05,
	0xa5, 0x49, 0x39, 0x99, 0xc9, 0xf1, 0xd9, 0xa9, 0x95, 0x12, 0xcc, 0x40, 0x95, 0x3c, 0x41, 0x82,
	0x20, 0x39, 0x3f, 0xa0, 0x54, 0x00, 0x58, 0xc6, 0x3b, 0xb5, 0x52, 0x48, 0x80, 0x8b, 0x39, 0xb7,
	0xa4, 0x54, 0x82, 0x05, 0x28, 0xcf, 0x12, 0x04, 0x62, 0x26, 0xb1, 0x81, 0x1d, 0x68, 0x0c, 0x08,
	0x00, 0x00, 0xff, 0xff, 0x88, 0x92, 0x36, 0xc3, 0xb3, 0x00, 0x00, 0x00,
}
