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

C library wrapper #71

Merged
merged 2 commits into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Creating the .h and the .so files:
## Creating the shared library and header files:



garyloug marked this conversation as resolved.
Show resolved Hide resolved
```go build -o lib_udsclient.so -buildmode=c-shared cclient.go```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
```go build -o lib_udsclient.so -buildmode=c-shared cclient.go```
```cmd
go build -o lib_udsclient.so -buildmode=c-shared cclient.go
Again I'm surprised the linter didn't flag this

- this creates .h and .so files from the cclient.go file.


## Creating the .h and the .a files:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Creating the .h and the .a files:
## Creating the static library and header files:


```go build -o lib_udsclient.a -buildmode=c-archive ./cclient.go```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
```go build -o lib_udsclient.a -buildmode=c-archive ./cclient.go```
```cmd
go build -o lib_udsclient.a -buildmode=c-archive ./cclient.go

- this creates .h and .a files



## Usage

After creating the .h and/or the .a and the .o files as described in the previous steps,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
After creating the .h and/or the .a and the .o files as described in the previous steps,
After creating the library and header files as described in the previous steps,

this is how to use the functions generated by cgo

``` char* GetUdsClientVersion()```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
``` char* GetUdsClientVersion()```
``` c
char* GetUdsClientVersion()

and the same for all the function signatures below Or make them a header

### char* GetUdsClientVersion()

This returns the version of our handshake on your local machine/client.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This returns the version of our handshake on your local machine/client.
This returns the version of the handshake on your local machine/client.


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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This returns the version of our handshake on the server/host.
This returns the version of the handshake on the server/host.


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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This requests an Xsk map Fd for a specifed device.
This requests an xskmap Fd for a specified 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.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
so that the connection to the Uds can be cleaned up.
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"
)
garyloug marked this conversation as resolved.
Show resolved Hide resolved

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

var cleaner uds.CleanupFunc

/*
GetClientVersion is an exported version for c of goclient's GetClientVersion()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
GetClientVersion is an exported version for c of goclient's GetClientVersion()
GetClientVersion is an exported version for c of the goclient GetClientVersion()

same throughout the file... I don't think goclient's is grammatically correct

*/
//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))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should you check device isn't Nil before passing it along to RequestXSKmapFD

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))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should probably do some param error checking before calling RequestBusyPoll

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()
}
}
Loading