Last Updated or created 2023-01-04
Above is a picture of a Box with leds which lightup when certain network packets are seen on the network.
It is connected to the parallel port of a PC (using port 0x3bc)
Makefile:
CC=gcc CCOPT=-O2 -I/usr/include/pcap LIBS=-lpcap all: netled netled: netled.c $(CC) $(CCOPT) -o netled netled.c $(LIBS)
netled.c code ( older version, i will upload a newer if found)
#include <stdio.h>
#include <pcap.h>
#include <netinet/in.h>
#include <sys/io.h>
#include <sys/time.h>
#include <signal.h>
#include "ether.h"
#include "ethertype.h"
#include "ip.h"
#include "tcp.h"
#define LP_PORT 0x3bc
#define CAPLEN 64
#define DELAY 30000
char *program_name;
static pcap_t *pd;
const u_char *snapend;
u_char leds = 0;
int mode = 0;
long packets;
void do_leds() {
mode ^= 1;
if(!leds && mode) return;
if(mode) {
outb(leds, LP_PORT);
leds = 0;
}
else {
outb(0, LP_PORT);
}
}
int do_tcp(register const u_char *bp) {
register const struct tcphdr *tp;
u_int16_t sport, dport;
tp = (struct tcphdr *)bp;
sport = ntohs(tp->th_sport);
dport = ntohs(tp->th_dport);
if (sport == 22 || dport == 22) {
leds |= 8;
}
return;
}
int do_ip(register const u_char *bp, register u_int length) {
register const struct ip *ip;
register u_int hlen, len, len0, off;
register const u_char *cp;
ip = (const struct ip *)bp;
if ((u_char *)(ip + 1) > snapend ||
length < sizeof (struct ip)) {
return;
}
hlen = IP_HL(ip) * 4;
if (hlen < sizeof (struct ip)) {
fprintf(stderr, "bad-hlen %d\n", hlen);
return;
}
len = ntohs(ip->ip_len);
if (length < len)
(void)printf("truncated-ip - %d bytes missing!",
len - length);
len -= hlen;
len0 = len;
off = ntohs(ip->ip_off);
if ((off & 0x1fff) == 0) {
cp = (const u_char *)ip + hlen;
switch(ip->ip_p) {
case IPPROTO_TCP:
// fprintf(stderr, "TCP!\n");
leds |= 128;
do_tcp(cp);
break;
case IPPROTO_UDP:
// fprintf(stderr, "UDP!\n");
leds |= 64;
break;
case IPPROTO_ICMP:
// fprintf(stderr, "ICMP!\n");
leds |= 32;
break;
default:
fprintf(stderr, "HUH? [ip_proto: %i]\n", ip->ip_p);
break;
}
}
}
void handler(u_char *user, const struct pcap_pkthdr *h, const u_char *p) {
u_int caplen = h->caplen;
u_int length = h->len;
u_short ether_type;
register const struct ether_header *ep;
u_short extracted_ethertype;
if (caplen < ETHER_HDRLEN) {
printf("c: [%d] e: [%d]\n", caplen, ETHER_HDRLEN);
return;
}
ep = (struct ether_header *)p;
ether_type = ntohs(ep->ether_type);
snapend = p + caplen;
p += ETHER_HDRLEN;
length -= ETHER_HDRLEN;
if (ether_type > ETHERMTU) {
switch (ether_type) {
case ETHERTYPE_ARP:
case ETHERTYPE_REVARP:
// leds |= 8;
// fprintf(stderr, "(R)ARP\n");
break;
case ETHERTYPE_IP:
// fprintf(stderr, "IP!\n");
do_ip(p, length);
break;
default:
fprintf(stderr, "HUH? [et: %i]\n", ether_type);
}
}
}
int main(int argc, char *argv[]) {
char *device;
char ebuf[PCAP_ERRBUF_SIZE];
register char *cp;
u_char *pcap_userdata;
void *sig_old;
struct itimerval timer_old, timer_new;
if ((cp = (char *)strrchr(argv[0], '/')) != NULL)
program_name = cp + 1;
else
program_name = argv[0];
if(ioperm(LP_PORT,3,1))
error("IOPEEEEERM!\n");
sig_old = signal(SIGALRM, do_leds);
if (sig_old == SIG_ERR)
error("SIGNAAAAAAAAAAAAAL!\n");
timer_new.it_value.tv_usec = DELAY;
timer_new.it_value.tv_sec = 0;
timer_new.it_interval.tv_usec = DELAY;
timer_new.it_interval.tv_sec = 0;
if(setitimer(ITIMER_REAL, &timer_new, &timer_old))
error("SETITIMEEEEEER!\n");
device = pcap_lookupdev(ebuf);
if (device == NULL)
error("%s", ebuf);
pd = pcap_open_live(device, CAPLEN, 1, 1000, ebuf);
if (pd == NULL)
error("%s", ebuf);
if (pcap_loop(pd, -1, handler, pcap_userdata) < 0) {
(void)fprintf(stderr, "%s: pcap_loop: %s\n",
program_name, pcap_geterr(pd));
exit(1);
}
return 0;
}

