Skip to content
This repository has been archived by the owner on Mar 20, 2024. It is now read-only.

Commit

Permalink
feat: Created the go C Wrapper files
Browse files Browse the repository at this point in the history
Signed-off-by: phansGithub <[email protected]>
  • Loading branch information
phansGithub committed Aug 3, 2023
1 parent ca02f96 commit 03efbad
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 0 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ require (
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
github.com/google/gofuzz v1.1.0
github.com/google/uuid v1.3.0
github.com/intel/afxdp-plugins-for-kubernetes/pkg/goclient v0.0.0
github.com/intel/afxdp-plugins-for-kubernetes/pkg/subfunctions v0.0.0
github.com/pkg/errors v0.9.1
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1
Expand All @@ -22,3 +23,4 @@ require (
)

replace github.com/intel/afxdp-plugins-for-kubernetes/pkg/subfunctions => ./pkg/subfunctions
replace github.com/intel/afxdp-plugins-for-kubernetes/pkg/goclient => ./pkg/goclient
36 changes: 36 additions & 0 deletions pkg/cclient/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Compiling the C Library

## Creating the .h and the .so files:


```go build -o lib_udsclient.so -buildmode=c-shared cclient.go```
- this creates .h and .so files from the cclient.go file.


## Creating the .h and the .a files:

```go build -o lib_udsclient.a -buildmode=c-archive ./cclient.go```
- this creates .h and .a files



## Next steps

After creating the .h and/or the .a and the .o files as described in the previous steps,
this is how to use the functions generated by cgo

``` char* GetUdsClientVersion()```
This returns the version of our handshake on your local machine/client.

```char* GetUdsServerVersion()```
This returns the version of our handshake on the server/host.

```int RequestXskMapFd(char* device)```
This requests an Xsk map Fd for a specifed device.

```int RequestBusyPoll(int busyTimeout, int busyBudget, int fd)```
This requests a busy poll for a specific device by using it's fd, and specifying a timeout and a budget.

```void CleanUpConnection()```
After all the other functions are called, this needs to be called after all the work you need to do is done,
so that the connection to the Uds can be cleaned up.
87 changes: 87 additions & 0 deletions pkg/cclient/cclient.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package main

import (
"C"
"fmt"
"os"

"github.com/intel/afxdp-plugins-for-kubernetes/internal/uds"
"github.com/intel/afxdp-plugins-for-kubernetes/pkg/goclient"
)

func main() {
// Needed for cgo to generate the .h
}

var cleaner uds.CleanupFunc

/*
GetClientVersion is an exported version for c of goclient's GetClientVersion()
*/
//export GetUdsClientVersion
func GetUdsClientVersion() *C.char {
return C.CString(goclient.GetClientVersion())
}

/*
ServerVersion is an exported version for c of goclient's GetServerVersion()
*/
//export GetUdsServerVersion
func GetUdsServerVersion() *C.char {
response, function, err := goclient.GetServerVersion()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
function()
return C.CString("-1")
}

cleaner = function

return C.CString(response)
}

/*
GetXskMapFd is an exported version for c of goclient's XskMapFd()
*/
//export RequestXskMapFd
func RequestXskMapFd(device *C.char) (fd C.int) {
fdVal, function, err := goclient.RequestXSKmapFD(C.GoString(device))
fd = C.int(fdVal)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
function()
return -1
}

cleaner = function

return fd
}

/*
RequestBusyPoll is an exported version for c of goclient's RequestBusyPoll()
*/
//export RequestBusyPoll
func RequestBusyPoll(busyTimeout, busyBudget, fd C.int) C.int {
function, err := goclient.RequestBusyPoll(int(busyTimeout), int(busyBudget), int(fd))
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
function()
return -1
}
cleaner = function
return 0
}

/*
CleanUpConnection an explicit exported cgo function to cleanup a connection after calling any of the other functions.
Pass in one of the available function names to clean up the connection after use.
*/
//export CleanUpConnection
func CleanUpConnection() {
if cleaner == nil {
fmt.Println("No cleanup function available to call")
} else {
cleaner()
}
}

0 comments on commit 03efbad

Please sign in to comment.