[glux] kernel echo

Pietro Bertera dr.iggy@iol.it
Tue, 11 Mar 2003 10:14:25 +0100


This is a multi-part message in MIME format.
--------------090901020905030900010403
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

eggià anche il kernel parla,

per chi interessa allego il codice di un semplice modulino che registra 
un netdevice e stampa delle stringhe (da kernel space) ricevetue dallo 
user land

Utilità: meno di zero, serve solo per chi vuole capire come dialogare a 
runtime con il kernel.

utilizzo:

compilare il modulo:
#gcc -Wall  -c kecho_mod.c -I/usr/src/linux/include

(-I/usr/src/linux/include non è detto che ci voglia, dipende da quali 
sorgenti avete installato)

compilare l'interfaccia in user space:
#gcc kecho.c -o kecho

installare il modulo:
#insmod kecho_mod.o

chiaccherare con il kernel:
# ./kecho weilaaa

il kernel vi rispondera' con voce da oltretomba ;) :
Sento una voce dallo UserSpace: weilaaa

(per vedere le risposte dal kernel space non dovete essere in X)

ma ciao

--------------090901020905030900010403
Content-Type: text/x-csrc;
 name="kecho.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="kecho.c"

/*
 *					Bertera Pietro 
 *		e-mail: p.bertera@valtellinux.it dr.iggy@iol.it
 *
 *					compile with:
 * gcc kechoctrl.c -o kechoctrl
 *
 *					run with:
 * kechoctrl [string]
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h> 
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <asm/types.h>

#include "kecho_mod.h"

int main(int argc, char **argv)
{
    struct my_userinfo info;
    char *ifname = "kecho";
    struct ifreq req;
    int i, sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

    if (sock < 0) {
        fprintf(stderr, "%s: socket():\n");
        exit(1);
    }

    strcpy(req.ifr_name, ifname);
    req.ifr_data = (caddr_t)&info;
	
	info.string=argv[1];

	if (ioctl(sock, PRINT, &req)<0) {
	    fprintf(stderr, "%s: ioctl():\n");
	    exit(1);
	}
	return 0;
}
--------------090901020905030900010403
Content-Type: text/x-csrc;
 name="kecho_mod.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="kecho_mod.c"

/*
 *					Bertera Pietro 
 *		e-mail: p.bertera@valtellinux.it dr.iggy@iol.it
 *
 *					compile with:
 * gcc -Wall  -c kecho.c -I/usr/src/linux/include
 *
 *					run with:
 * insmod kecho.o
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
#ifndef __KERNEL__
#  define __KERNEL__
#endif
#ifndef MODULE
#  define MODULE
#endif

#include <linux/module.h>
#include <linux/kernel.h> 
#include <linux/types.h>  

#include <linux/netdevice.h>   
#include <linux/etherdevice.h> 

#include <asm/uaccess.h>
#include "kecho_mod.h"

MODULE_LICENSE("GPL");

int my_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	struct my_userinfo info,
    *uptr = (struct my_userinfo *)ifr->ifr_data;
   

    if (!suser()) return -EPERM;

   
    if (!access_ok(VERIFY_READ, uptr, sizeof(*uptr)))
        return -EFAULT;
    copy_from_user(&info, uptr, sizeof(info));

    switch(cmd) {
      case PRINT: 
	printk("Sento una voce dallo UserSpace: %s\n", info.string);

	    return 0;

      case REPRINT: 
		return 0;

      default:
        return -ENOTTY;
    }
    return 0;
}

int my_init_dev(struct net_device *dev)
{
    dev->do_ioctl = my_ioctl;
    return 0;
}

struct net_device my_dev = {
    name: "kecho",
    init: my_init_dev,
}; 

void cleanup_module(void)
{
        unregister_netdev(&my_dev);
}

int init_module(void)
{
   int result;    

    result = register_netdev(&my_dev);
    if (result) {
        printk(KERN_ERR "kecho: can't register netdevice");
        cleanup_module();
        return result;
    }
    
    return 0; 
}
--------------090901020905030900010403
Content-Type: text/x-chdr;
 name="kecho_mod.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="kecho_mod.h"

#ifndef __MYDRV_H__
#define __MYDRV_H__

#define PRINT SIOCDEVPRIVATE
#define REPRINT (SIOCDEVPRIVATE+1)

struct my_userinfo {
    char* string;          
};

#endif
--------------090901020905030900010403--