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
Signed-off-by: phansGithub <[email protected]>
- Loading branch information
1 parent
ca02f96
commit 03efbad
Showing
3 changed files
with
125 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,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. |
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,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() | ||
} | ||
} |