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

Commit

Permalink
C library wrapper (#71)
Browse files Browse the repository at this point in the history
* feat: Created the go C Wrapper files
* Made changes to README instructions.

---------

Signed-off-by: phansGithub <[email protected]>
  • Loading branch information
phansGithub authored Oct 12, 2023
1 parent 4be1142 commit db2fd90
Show file tree
Hide file tree
Showing 3 changed files with 142 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
46 changes: 46 additions & 0 deletions pkg/cclient/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Compiling the C Library

## Creating the shared library and header files:

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

## Creating the the static library and header files:

```cmd
go build -o lib_udsclient.a -buildmode=c-archive ./cclient.go
```
- this creates the shared library and header files

## Usage

After creating the library and header files as described in the previous steps,
this is how to use the functions generated by cgo

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

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

```c
int RequestXskMapFd(char* device)
```
This requests an xskmap Fd for a specified device.
```c
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.

```c
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.
94 changes: 94 additions & 0 deletions pkg/cclient/cclient.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
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 the goclient GetClientVersion()
*/
//export GetUdsClientVersion
func GetUdsClientVersion() *C.char {
return C.CString(goclient.GetClientVersion())
}

/*
ServerVersion is an exported version for c of the goclient 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 the goclient XskMapFd()
*/
//export RequestXskMapFd
func RequestXskMapFd(device *C.char) (fd C.int) {
if device != nil {
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
}

return -1
}

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

/*
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 db2fd90

Please sign in to comment.