Refactor GoVPP
[govpp.git] / adapter / vppapiclient / vppapiclient_adapter.go
index c77d7f1..7aafa55 100644 (file)
@@ -28,7 +28,7 @@ package vppapiclient
 #include <arpa/inet.h>
 #include <vpp-api/client/vppapiclient.h>
 
-extern void go_msg_callback(uint16_t, uint32_t, void*, size_t);
+extern void go_msg_callback(uint16_t msg_id, uint32_t context, void* data, size_t size);
 
 typedef struct __attribute__((__packed__)) _req_header {
     uint16_t msg_id;
@@ -38,7 +38,7 @@ typedef struct __attribute__((__packed__)) _req_header {
 
 typedef struct __attribute__((__packed__)) _reply_header {
     uint16_t msg_id;
-    uint32_t context;
+    uint32_t context; // currently not all reply messages contain context field
 } reply_header_t;
 
 static void
@@ -49,23 +49,23 @@ govpp_msg_callback (unsigned char *data, int size)
 }
 
 static int
-govpp_connect (char *shm)
+govpp_send(uint32_t context, void *data, size_t size)
 {
-    return vac_connect("govpp", shm, govpp_msg_callback, 32);
+       req_header_t *header = ((req_header_t *)data);
+       header->context = htonl(context);
+    return vac_write(data, size);
 }
 
 static int
-govvp_disconnect()
+govpp_connect (char *shm)
 {
-    return vac_disconnect();
+    return vac_connect("govpp", shm, govpp_msg_callback, 32);
 }
 
 static int
-govpp_send(uint32_t context, void *data, size_t size)
+govvp_disconnect()
 {
-       req_header_t *header = ((req_header_t *)data);
-       header->context = htonl(context);
-    return vac_write(data, size);
+    return vac_disconnect();
 }
 
 static uint32_t
@@ -79,6 +79,7 @@ import "C"
 import (
        "fmt"
        "os"
+       "path/filepath"
        "reflect"
        "unsafe"
 
@@ -98,7 +99,7 @@ const (
 // vppAPIClientAdapter is the opaque context of the adapter.
 type vppAPIClientAdapter struct {
        shmPrefix string
-       callback  func(context uint32, msgId uint16, data []byte)
+       callback  adapter.MsgCallback
 }
 
 var vppClient *vppAPIClientAdapter // global vpp API client adapter context
@@ -138,6 +139,7 @@ func (a *vppAPIClientAdapter) GetMsgID(msgName string, msgCrc string) (uint16, e
 
        msgID := uint16(C.govpp_get_msg_index(nameAndCrc))
        if msgID == ^uint16(0) {
+               // VPP does not know this message
                return msgID, fmt.Errorf("unknown message: %v (crc: %v)", msgName, msgCrc)
        }
 
@@ -154,40 +156,41 @@ func (a *vppAPIClientAdapter) SendMsg(context uint32, data []byte) error {
 }
 
 // SetMsgCallback sets a callback function that will be called by the adapter whenever a message comes from VPP.
-func (a *vppAPIClientAdapter) SetMsgCallback(cb func(context uint32, msgID uint16, data []byte)) {
+func (a *vppAPIClientAdapter) SetMsgCallback(cb adapter.MsgCallback) {
        a.callback = cb
 }
 
 // WaitReady blocks until shared memory for sending
 // binary api calls is present on the file system.
 func (a *vppAPIClientAdapter) WaitReady() error {
-       watcher, err := fsnotify.NewWatcher()
-       if err != nil {
-               return err
-       }
-       defer watcher.Close()
-
-       err = watcher.Add(watchedFolder)
-       if err != nil {
-               return err
-       }
-       // Path to the shared memory segment with prefix, if set
+       // Path to the shared memory segment
        var path string
        if a.shmPrefix == "" {
-               path = watchedFolder + watchedFile
+               path = filepath.Join(watchedFolder, watchedFile)
        } else {
-               path = watchedFolder + a.shmPrefix + "-" + watchedFile
-       }
-       if fileExists(path) {
-               return nil
+               path = filepath.Join(watchedFolder, a.shmPrefix+"-"+watchedFile)
        }
 
-       for {
-               ev := <-watcher.Events
-               if ev.Name == path && (ev.Op&fsnotify.Create) == fsnotify.Create {
-                       break
+       // Watch folder if file does not exist yet
+       if !fileExists(path) {
+               watcher, err := fsnotify.NewWatcher()
+               if err != nil {
+                       return err
+               }
+               defer watcher.Close()
+
+               if err := watcher.Add(watchedFolder); err != nil {
+                       return err
+               }
+
+               for {
+                       ev := <-watcher.Events
+                       if ev.Name == path && (ev.Op&fsnotify.Create) == fsnotify.Create {
+                               break
+                       }
                }
        }
+
        return nil
 }
 
@@ -206,5 +209,5 @@ func go_msg_callback(msgID C.uint16_t, context C.uint32_t, data unsafe.Pointer,
        slice := &reflect.SliceHeader{Data: uintptr(data), Len: int(size), Cap: int(size)}
        byteArr := *(*[]byte)(unsafe.Pointer(slice))
 
-       vppClient.callback(uint32(context), uint16(msgID), byteArr)
-}
\ No newline at end of file
+       vppClient.callback(uint16(msgID), uint32(context), byteArr)
+}