Monthly Archives: June 2015

Linux Network Programming

Manual Pages

getifaddrs, freeifaddrs – get interface addresses
packet – packet interface on device level

NETLINK

Generic NETLINK HowTo
Netlink Sockets in C using the 3.X linux kernel

Tutorials & Blogs

Code Snippet: getifaddrs
Get the IP address of the machine
How to get MAC address of your machine using a C program?
How to get local IP and MAC address C [duplicate]
MAC address with getifaddrs (wrong answer!!)

Code Stippet

lldpd/src/daemon/interfaces-linux.c
Get network interface’s MAC address and IP address

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/param.h>

#include <netinet/in.h>
#include <net/ethernet.h>
#include <net/if.h>

#include <linux/if_link.h>
#include <linux/if_vlan.h>
#include <linux/sockios.h>

#include <ifaddrs.h>

bool
netif_init(netif_t *netif, const char *name)
{
    bool                        result = true;
    int                         sockfd;
    struct ifaddrs             *ifas;
    struct ifaddrs             *ifa;
    struct ifreq                ifr;
    struct rtnl_link_stats     *stats;
    struct vlan_ioctl_args      ifv;
    
    /* string copy name */
    strncpy(netif->name, name, NETIF_NAME_SIZE);
    
    /* create socket (required for ioctl) */
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        LOG_ERRNO(LOG_NETWORK_INTERFACE, LOG_ERROR, errno, ("socket failed"));
        return false;
    }
    
    /* get interface addresses */
    if (getifaddrs(&ifas) != 0) {
        return false;
    }
    
    for (ifa = ifas; ifa != NULL; ifa = ifa->ifa_next) {
        if ((ifa->ifa_addr)           == NULL) continue;
        if ((ifa->ifa_flags & IFF_UP) == 0)    continue;
        
        
        /* network interface name matches */
        if (strcmp(name, ifa->ifa_name) == 0) {
            
            switch (ifa->ifa_addr->sa_family) {
                case AF_INET:   netif_add_ipv4_address(netif,      IPV4_ADDRESS(&(INADDR(ifa->ifa_addr)->sin_addr)),
                                                                   IPV4_ADDRESS(&(INADDR(ifa->ifa_netmask)->sin_addr)),
                                                                   IPV4_ADDRESS(&(INADDR(ifa->ifa_broadaddr)->sin_addr)),
                                                                   NULL);
                                break;
                
                case AF_INET6:  netif_add_ipv6_address(netif,      IPV6_ADDRESS(&(INADDR6(ifa->ifa_addr)->sin6_addr)),
                                                                   IPV6_ADDRESS(&(INADDR6(ifa->ifa_netmask)->sin6_addr)),
                                                                   IPV6_STATE_VALID);
                                break;

                case AF_PACKET: stats = ifa->ifa_data;
                                LOG_PRINTLN(LOG_NETWORK_INTERFACE, LOG_DEBUG, ("tx packet: %" PRIu32 " rx packet: %" PRIu32 " tx bytes: %" PRIu32 " rx bytes: %" PRIu32,
                                                                               stats->tx_packets, stats->rx_packets, stats->tx_bytes, stats->rx_bytes));

                                bzero((char *) &ifr, sizeof(ifr));
                                strncpy(ifr.ifr_name, netif->name, NETIF_NAME_SIZE);
                                if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) != -1) {
                                    netif_add_mac_address(netif,   MAC_ADDRESS(LLADDR(LADDR(ifr.ifr_hwaddr.sa_data))));
                                    bzero((char *) &ifv, sizeof(ifv));
                                    ifv.cmd = GET_VLAN_VID_CMD;
                                    strncpy(ifv.device1, netif->name, sizeof(ifv.device1));
                                    if (ioctl(sockfd, SIOCGIFVLAN, &ifv) != -1) {
                                        netif_add_vid(netif, ifv.u.VID);
                                    }
                                } else {
                                    LOG_PRINTLN(LOG_NETWORK_INTERFACE, LOG_ERROR, ("couldn't get MAC address"));
                                    result = false;
                                    goto netif_init_exit;
                                }
                                break;

                default:        continue;
            }
        }
    }
    
netif_init_exit:
    freeifaddrs(ifas);

    return result;
}
$ grep -r vlan_ioctl /usr/include
/usr/include/linux/if_vlan.h:/* Passed in vlan_ioctl_args structure to determine behaviour. */
/usr/include/linux/if_vlan.h:enum vlan_ioctl_cmds {
/usr/include/linux/if_vlan.h:struct vlan_ioctl_args {
/usr/include/linux/if_vlan.h:	int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */

C Macro Test with GCC

$ echo '__FreeBSD__ ' | gcc -E -
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
__FreeBSD__    <== no replacement --> no macro defined

$ echo '__linux__ ' | gcc -E -
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
1    <== replacement --> macro defined

libpcap Tutorial

$ sudo apt-get install libpcap-dev
$ cat /var/lib/dpkg/info/libpcap-dev.list 
$ cat /var/lib/dpkg/info/libpcap0.8-dev.list 

Manual Pages

pcap_dump_open
pcap_next
pcap_open_dead

Live Capture

Programming with pcap
The Sniffer’s Guide to Raw Traffic
Capturing Our First Packet

Offline Processing

Writing pcap files with fake headers?
PCAP Offline Parsing Example
Handling offline dump files

    pcap_t *pd;
    pcap_dumper_t *pdumper;

    pd = pcap_open_dead(DLT_RAW, 65535 /* snaplen */);

    /* Create the output file. */
    pdumper = pcap_dump_open(pd, "/tmp/capture.pcap");

    while (1) {
        /*
         * Create fake IP header and put UDP header
         * and payload in place
         */
        ...

        /* write packet to savefile */
        pcap_dump(pdumper, xxxx, yyyy);
    }

    pcap_close(pd);
    pcap_dump_close(pdumper);

Java jNetPCAP

API Examples
Tutorials
Offline Capture
The Main libpcap API Overview

DotNet / .NET

Pcap.Net
Handling offline dump files

Scheme pcap.egg

Schemers.org
CHICKEN Scheme
pcap.egg

Go programming language

The Go Programming Language
package pcap

PostgreSQL

Show databases

$ psql -l
or
$ psql MyDB
MyDB-# \l

                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+---------+-------+-------------------
 openerp   | pgsql | UTF8     | C       | C     |
 postgres  | pgsql | UTF8     | C       | C     |
 template0 | pgsql | UTF8     | C       | C     | =c/pgsql         +
           |       |          |         |       | pgsql=CTc/pgsql
 template1 | pgsql | UTF8     | C       | C     | =c/pgsql         +
           |       |          |         |       | pgsql=CTc/pgsql
(4 rows)

Show roles/user

MyDB-# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 openerp   |                                                | {}
 pgsql     | Superuser, Create role, Create DB, Replication | {}

Change role/user

MyDB-# alter role openerp CREATEDB;
ALTER ROLE

FreeBSD pkg Package Manager

pkg = pkgng

Using pkg for Binary Package Management
PkgPrimer

Manage Packages

How To Manage Packages on FreeBSD 10.1 with Pkg


Ports vs. Binary Packages

How to update a mix of packages and ports on FreeBSD
Exclude packages from pkg upgrade

$ pkg lock <package>

poudriere

Building Packages with Poudriere
How To Set Up a Poudriere Build System to Create Packages for your FreeBSD Servers


Clean the Database

pkg clean                    # cleans /var/cache/pkg/
rm -rf /var/cache/pkg/*      # just remove it all
pkg update -f                # forces update  of repository catalog
rm /var/db/pkg/repo-*.sqlite # removes all remote repository catalogs
pkg bootstrap -f             # forces reinstall of pkg