This repository has been archived by the owner on Mar 20, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: Created the go C Wrapper files * Made changes to README instructions. --------- Signed-off-by: phansGithub <[email protected]>
- Loading branch information
1 parent
4be1142
commit db2fd90
Showing
3 changed files
with
142 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} | ||
} |