X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=api%2Fbinapi.go;h=1b07a7e0f740e156f941bcd70841ce327204e739;hb=5de7f6b85458615fa592a335d45c546397f32c9a;hp=04fdc9ee299ea78c4cf1e3ab9338c84ea696c10e;hpb=df67791c6ffc96331f75aec7d3addfe2efca7739;p=govpp.git diff --git a/api/binapi.go b/api/binapi.go index 04fdc9e..1b07a7e 100644 --- a/api/binapi.go +++ b/api/binapi.go @@ -15,15 +15,18 @@ package api import ( - "fmt" + "path" "reflect" ) -// MessageType represents the type of a VPP message. -// Note: this is currently derived from the message header (fields), -// and in many cases it does not represent the actual type of VPP message. -// This means that some replies can be identified as requests, etc. -// TODO: use services to identify type of message +// GoVppAPIPackageIsVersionX is referenced from generated binapi files +// to assert that that code is compatible with this version of the GoVPP api package. +const ( + GoVppAPIPackageIsVersion1 = true + GoVppAPIPackageIsVersion2 = true +) + +// MessageType represents the type of a VPP message derived from message header fields. type MessageType int const ( @@ -56,32 +59,27 @@ type DataType interface { } var ( - registeredMessageTypes = make(map[reflect.Type]string) - registeredMessages = make(map[string]Message) + registeredMessages = make(map[string]map[string]Message) + registeredMessageTypes = make(map[string]map[reflect.Type]string) ) // RegisterMessage is called from generated code to register message. func RegisterMessage(x Message, name string) { - typ := reflect.TypeOf(x) - namecrc := x.GetMessageName() + "_" + x.GetCrcString() - if _, ok := registeredMessageTypes[typ]; ok { - panic(fmt.Errorf("govpp: message type %v already registered as %s (%s)", typ, name, namecrc)) + binapiPath := path.Dir(reflect.TypeOf(x).Elem().PkgPath()) + if _, ok := registeredMessages[binapiPath]; !ok { + registeredMessages[binapiPath] = make(map[string]Message) + registeredMessageTypes[binapiPath] = make(map[reflect.Type]string) } - registeredMessages[namecrc] = x - registeredMessageTypes[typ] = name + registeredMessages[binapiPath][x.GetMessageName()+"_"+x.GetCrcString()] = x + registeredMessageTypes[binapiPath][reflect.TypeOf(x)] = name } // GetRegisteredMessages returns list of all registered messages. -func GetRegisteredMessages() map[string]Message { +func GetRegisteredMessages() map[string]map[string]Message { return registeredMessages } // GetRegisteredMessageTypes returns list of all registered message types. -func GetRegisteredMessageTypes() map[reflect.Type]string { +func GetRegisteredMessageTypes() map[string]map[reflect.Type]string { return registeredMessageTypes } - -// GoVppAPIPackageIsVersionX is referenced from generated binapi files -// to assert that that code is compatible with this version of the GoVPP api package. -const GoVppAPIPackageIsVersion1 = true -const GoVppAPIPackageIsVersion2 = true