{"id":28915876,"url":"https://github.com/seantywork/gpiosk","last_synced_at":"2026-04-13T17:33:12.093Z","repository":{"id":300322217,"uuid":"1005882057","full_name":"seantywork/gpiosk","owner":"seantywork","description":"GPIO based Linux netdevice kernel module","archived":false,"fork":false,"pushed_at":"2025-11-17T01:12:38.000Z","size":4084,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-17T01:20:45.299Z","etag":null,"topics":["gpio","kernel","linux","networking","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seantywork.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-21T02:28:21.000Z","updated_at":"2025-11-17T01:12:42.000Z","dependencies_parsed_at":"2025-06-21T03:34:09.661Z","dependency_job_id":"42bc6c6a-a830-4b26-8d4a-ba26b679762c","html_url":"https://github.com/seantywork/gpiosk","commit_stats":null,"previous_names":["seantywork/gpiosk"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/seantywork/gpiosk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seantywork%2Fgpiosk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seantywork%2Fgpiosk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seantywork%2Fgpiosk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seantywork%2Fgpiosk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seantywork","download_url":"https://codeload.github.com/seantywork/gpiosk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seantywork%2Fgpiosk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31762568,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gpio","kernel","linux","networking","raspberry-pi"],"created_at":"2025-06-21T23:06:33.723Z","updated_at":"2026-04-13T17:33:12.086Z","avatar_url":"https://github.com/seantywork.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gpiosk\n\nGPIO based Linux netdevice kernel module\n\n![thumbnail](docs/blueprint.jpg)\n\n- [what is this?](#what-is-this)\n- [specification](#specification)\n- [documentation](#documentation)\n- [how to](#how-to)\n- [xdp feature](#xdp-feature)\n\n# what is this?\n\nThis kernel module is no different from a plain old Linux networking interface...\\\nexcept it uses GPIO to send and receive data\n\n### interface info\n\n```shell\n# on rpi1\n# ip a\n15: geth0: \u003cBROADCAST,MULTICAST,UP,LOWER_UP\u003e mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000\n    link/ether 47:45:54:48:30:36 brd ff:ff:ff:ff:ff:ff\n    inet 10.10.0.1/24 scope global geth0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::4545:54ff:fe48:3036/64 scope link \n       valid_lft forever preferred_lft forever\n\n```\n\n```shell\n\n# on rpi2\n# ip a\n\n1: geth0: \u003cBROADCAST,MULTICAST,UP,LOWER_UP\u003e mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000\n    link/ether 47:45:54:48:30:33 brd ff:ff:ff:ff:ff:ff\n    inet 10.10.0.2/24 scope global geth0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::4545:54ff:fe48:3033/64 scope link \n       valid_lft forever preferred_lft forever\n\n```\n\n### example: tcp communication using nc\n```shell\n# on rpi2\n$ nc -l 10.10.0.2 9999\nhelllo\necho\nbye\n```\n\n```shell\n# on rpi1\n$ nc 10.10.0.2 9999\nhelllo\necho\nbye\n\n```\n\n# specification\n\nSo far, I only tested it on my raspberry pi 4b with spec below\n\n```shell\n# lscpu\nArchitecture:             aarch64\n  CPU op-mode(s):         32-bit, 64-bit\n  Byte Order:             Little Endian\nCPU(s):                   4\n  On-line CPU(s) list:    0-3\nVendor ID:                ARM\n  Model name:             Cortex-A72\n    Model:                3\n    Thread(s) per core:   1\n    Core(s) per cluster:  4\n    Socket(s):            -\n    Cluster(s):           1\n    Stepping:             r0p3\n    CPU(s) scaling MHz:   33%\n    CPU max MHz:          1800.0000\n    CPU min MHz:          600.0000\n    BogoMIPS:             108.00\n    Flags:                fp asimd evtstrm crc32 cpuid\n```\n\n```shell\n# uname -a\nLinux raspberrypi 6.12.25+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.25-1+rpt1 (2025-04-30) aarch64 GNU/Linux\n```\n# documentation\n\nRefer to the following [how to](#how-to) section\n\n~~- [version 1.0](https://medium.com/@seantywork/gpiosk-introducing-my-gpio-based-linux-socket-kernel-module-bba2d114236e)~~\n\n# how to\n\n1. physical wiring\n\n- blueprint\n\n![blueprint](docs/blueprint.jpg)\n\n- actual\n\n![actual](docs/actual.jpg)\n\n2. build\n\n```shell\nmake\n```\n\n3. insmod\n\n```shell\n# hwid should be an interger ranging from 1 to 9\n# and should be set differently for each host\n# because `gpiosk` module uses it to set hw addr \nsudo insmod gpiosk.ko hwid=$HWID\n```\n\n\n# xdp feature\n\n\n### install xdp-tools\n\n```shell\ncd xdp-prog\n\n./install.sh\n\n```\n\n### build sample xdp programs\n\n```shell\ncd xdp-prog\n\nmake\n\n```\n\n### example: allowing tcp communication\n\n```shell\n# on rpi2\n$ cd xdp-prog\n$ sudo xdp-loader load -m native -s xdp_prog geth0 \"xdp_pass.o\"\n$ nc -l 10.10.0.2 9999\n\n# on rpi2, terminal 2\nsudo dmesg -wH\n\n```\n\n\n```shell\n# on rpi1\n$ nc 10.10.0.1 9999\n\n\n```\n\n```shell\n\n# on rpi2, terminal 2\n[  +0.000035] entered xmit\n[  +0.000004] entered hw tx\n[  +0.000003] eth src: 47:45:54:48:30:33\n[  +0.000005] eth dst: 47:45:54:48:30:36\n[  +0.000004] src: 0a0a0002:09999\n[  +0.000004] dst: 0a0a0001:37512\n[  +0.048151] exiting xmit\n[  +0.000006] npackets smaller than budget\n[  +0.000004] napi complete\n[  +0.000003] polling end\n[  +0.223525] napi interrupt\n[  +0.000010] napi receive\n[  +0.000002] napi interrupt end\n[  +0.000009] polling\n[  +0.000005] geth: XDP_PASS # \u003c------- here you can see the traffic is allowed by the sample program\n\n```\n\n```shell\n# unload\n\n$ sudo xdp-loader unload geth0 -a\n\n```\n\n### example: blocking tcp communication\n\n```shell\n# on rpi2\n$ cd xdp-prog\n$ sudo xdp-loader load -m native -s xdp_prog geth0 \"xdp_drop.o\"\n$ nc -l 10.10.0.2 9999\n\n# on rpi2, terminal 2\nsudo dmesg -wH\n\n```\n\n\n```shell\n# on rpi1\n$ nc 10.10.0.1 9999\n\n\n```\n\n```shell\n\n# on rpi2, terminal 2\n[Sep15 01:48] napi interrupt\n[  +0.000013] napi receive\n[  +0.000003] napi interrupt end\n[  +0.000013] polling\n[  +0.000008] geth: XDP_DROP # \u003c---------- here you can see the traffic is blocked by the sample program\n\n\n```\n\n```shell\n# unload\n\n$ sudo xdp-loader unload geth0 -a\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseantywork%2Fgpiosk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseantywork%2Fgpiosk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseantywork%2Fgpiosk/lists"}