VIDEOS 》 Linux Kernel /proc Interface
/proc is one of the most popular kernel to user-space interface which you can leverage to add an interface to your Kernel code such as Kernel modules, Kernel Device Drivers, etc. Personally I prefer /proc interface than other alternatives such as /sysfs, ioctl() and so on for my personal Kernel modules/stack.
So here is my detailed multi-episode Youtube video series on /sysfs Interface.
I also conduct sessions/classes on Systems and Network software programming and architecture. If you are interested, click HERE for more details.
IMPORTANT NOTE: None of these sample code published in the below episodes will no longer work in a modern recent kernel versions (i.e especially those which are released after 2019 or so). So here are my video episodes performing a live kernel module code porting of episode - 191 Linux Kernel /proc Interface - create and read /proc file. If you want to make the other episode sample demo code to work then you just follow and repeat these steps.
Download this episode my entire kernel module sample code, make file, clean script HERE.
Download this episode my entire kernel module sample code, make file, clean script HERE.
Download this episode my entire kernel module sample code, make file, clean script HERE.
And here is the same source code for a quick reference.
/* proc_example.c * Author: Kiran Kankipati * Updated: 22-feb-2017 */ #include <linux/kernel.h> #include <linux/types.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/string.h> #include <linux/init.h> #include <linux/net.h> #include <linux/netdevice.h> #include <linux/socket.h> #include <linux/sockios.h> #include <linux/inet.h> #include <linux/inetdevice.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/icmp.h> #include <linux/proc_fs.h> #include <linux/netlink.h> #include <linux/mroute.h> #include <net/checksum.h> #include <net/inet_ecn.h> #include <net/xfrm.h> #include <net/route.h> #include <net/sock.h> #include <net/ip.h> #include <net/tcp.h> #include <net/arp.h> #include <net/udp.h> #include <net/icmp.h> #include <net/inetpeer.h> #include <net/protocol.h> #include <net/flow.h> #include <asm/types.h> struct proc_dir_entry *tlc_proc_a; static ssize_t tlc_proc_a_read(struct file *fp, char *buf, size_t len, loff_t * off) { static int finished=0; if(finished) {finished=0;return 0;} finished=1; //int abc=100; //strcpy(buf, "abc: %d\n", abc); //sprintf(buf, "abc: %d\n", abc); memset(buf,0xaa,10); //return strlen(buf); return 10; } static struct file_operations tlc_proc_a_fops = { .owner=THIS_MODULE, .read=tlc_proc_a_read, }; static int hello_init(void) { tlc_proc_a = proc_create( "tlc_proc_a", 0444, NULL, &tlc_proc_a_fops); if(tlc_proc_a==NULL) { printk(KERN_ALERT "Error: Could not initialize %s\n", "tlc_proc_a"); } return 0; } static void hello_exit(void) { remove_proc_entry("tlc_proc_a", NULL); } module_init(hello_init); module_exit(hello_exit);
Download this episode my entire kernel module sample code, make file, clean script HERE.
And here is the same source code for a quick reference.
/* proc_example.c - write /proc file * Author: Kiran Kankipati * Updated: 23-feb-2017 */ #include <linux/kernel.h> #include <linux/types.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/string.h> #include <linux/init.h> #include <linux/net.h> #include <linux/netdevice.h> #include <linux/socket.h> #include <linux/sockios.h> #include <linux/inet.h> #include <linux/inetdevice.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/icmp.h> #include <linux/proc_fs.h> #include <linux/netlink.h> #include <linux/mroute.h> #include <net/checksum.h> #include <net/inet_ecn.h> #include <net/xfrm.h> #include <net/route.h> #include <net/sock.h> #include <net/ip.h> #include <net/tcp.h> #include <net/arp.h> #include <net/udp.h> #include <net/icmp.h> #include <net/inetpeer.h> #include <net/protocol.h> #include <net/flow.h> #include <asm/types.h> struct proc_dir_entry *tlc_proc_a; int abc=100; #define PROCFS_MAX_SIZE 30 char proc_buf[PROCFS_MAX_SIZE]; static ssize_t tlc_proc_a_write(struct file *fp, const char *buf, size_t len, loff_t * off) { if(len > PROCFS_MAX_SIZE) { return -EFAULT; } if(copy_from_user(proc_buf, buf, len)) { return -EFAULT; } abc=simple_strtoul(proc_buf,NULL,10); return len; } static ssize_t tlc_proc_a_read(struct file *fp, char *buf, size_t len, loff_t * off) { static int finished=0; if(finished) {finished=0;return 0;} finished=1; sprintf(buf, "abc: %d\n", abc); return strlen(buf); } static struct file_operations tlc_proc_a_fops = { .owner=THIS_MODULE, .read=tlc_proc_a_read, .write=tlc_proc_a_write, }; static int hello_init(void) { tlc_proc_a = proc_create( "tlc_proc_a", 0666, NULL, &tlc_proc_a_fops); if(tlc_proc_a==NULL) { printk(KERN_ALERT "Error: Could not initialize %s\n", "tlc_proc_a"); } return 0; } static void hello_exit(void) { remove_proc_entry("tlc_proc_a", NULL); } module_init(hello_init); module_exit(hello_exit);
Download this episode my entire kernel module sample code, make file, clean script HERE.
And here is the same source code for a quick reference.
/* proc_example.c - /proc directory * Author: Kiran Kankipati * Updated: 24-feb-2017 */ #include <linux/kernel.h> #include <linux/types.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/string.h> #include <linux/init.h> #include <linux/net.h> #include <linux/netdevice.h> #include <linux/socket.h> #include <linux/sockios.h> #include <linux/inet.h> #include <linux/inetdevice.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/icmp.h> #include <linux/proc_fs.h> #include <linux/netlink.h> #include <linux/mroute.h> #include <net/checksum.h> #include <net/inet_ecn.h> #include <net/xfrm.h> #include <net/route.h> #include <net/sock.h> #include <net/ip.h> #include <net/tcp.h> #include <net/arp.h> #include <net/udp.h> #include <net/icmp.h> #include <net/inetpeer.h> #include <net/protocol.h> #include <net/flow.h> #include <asm/types.h> struct proc_dir_entry *tlc_proc_dir; struct proc_dir_entry *tlc_proc_a; int abc=100; #define PROCFS_MAX_SIZE 30 char proc_buf[PROCFS_MAX_SIZE]; static ssize_t tlc_proc_a_write(struct file *fp, const char *buf, size_t len, loff_t * off) { if(len > PROCFS_MAX_SIZE) { return -EFAULT; } if(copy_from_user(proc_buf, buf, len)) { return -EFAULT; } abc=simple_strtoul(proc_buf,NULL,10); return len; } static ssize_t tlc_proc_a_read(struct file *fp, char *buf, size_t len, loff_t * off) { static int finished=0; if(finished) {finished=0;return 0;} finished=1; sprintf(buf, "abc: %d\n", abc); return strlen(buf); } static struct file_operations tlc_proc_a_fops = { .owner=THIS_MODULE, .read=tlc_proc_a_read, .write=tlc_proc_a_write, }; static int hello_init(void) { tlc_proc_dir=proc_mkdir( "tlc_proc_dir", NULL); tlc_proc_a = proc_create( "tlc_proc_a", 0666, tlc_proc_dir, &tlc_proc_a_fops); if(tlc_proc_a==NULL) { printk(KERN_ALERT "Error: Could not initialize %s\n", "tlc_proc_a"); } return 0; } static void hello_exit(void) { remove_proc_entry("tlc_proc_a", NULL); } module_init(hello_init); module_exit(hello_exit);
Download this episode my entire kernel module sample code, make file, clean script HERE.
And here is the same source code for a quick reference.
/* proc_example.c - /proc access to drop pkts * Author: Kiran Kankipati * Updated: 25-feb-2017 */ #include <linux/kernel.h> #include <linux/types.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/string.h> #include <linux/init.h> #include <linux/net.h> #include <linux/netdevice.h> #include <linux/socket.h> #include <linux/sockios.h> #include <linux/inet.h> #include <linux/inetdevice.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/icmp.h> #include <linux/proc_fs.h> #include <linux/netlink.h> #include <linux/mroute.h> #include <net/checksum.h> #include <net/inet_ecn.h> #include <net/xfrm.h> #include <net/route.h> #include <net/sock.h> #include <net/ip.h> #include <net/tcp.h> #include <net/arp.h> #include <net/udp.h> #include <net/icmp.h> #include <net/inetpeer.h> #include <net/protocol.h> #include <net/flow.h> #include <asm/types.h> struct proc_dir_entry *tlc_proc_a; int drop_pkts=0; #define PROCFS_MAX_SIZE 30 char proc_buf[PROCFS_MAX_SIZE]; static ssize_t tlc_proc_a_write(struct file *fp, const char *buf, size_t len, loff_t * off) { int val=0; if(len > PROCFS_MAX_SIZE) { return -EFAULT; } if(copy_from_user(proc_buf, buf, len)) { return -EFAULT; } val=simple_strtoul(proc_buf,NULL,10); if(val==0 || val==1) { drop_pkts=val; } return len; } static ssize_t tlc_proc_a_read(struct file *fp, char *buf, size_t len, loff_t * off) { static int finished=0; if(finished) {finished=0;return 0;} finished=1; if(drop_pkts) { sprintf(buf, "drop_pkts: true\n"); } else { sprintf(buf, "drop_pkts: false\n"); } return strlen(buf); } static struct file_operations tlc_proc_a_fops = { .owner=THIS_MODULE, .read=tlc_proc_a_read, .write=tlc_proc_a_write, }; static struct nf_hook_ops nfho_pre_routing; unsigned int pre_routing_hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { if(drop_pkts) { return NF_DROP; } return NF_ACCEPT; } static int hello_init(void) { tlc_proc_a = proc_create( "tlc_proc_a", 0666, NULL, &tlc_proc_a_fops); if(tlc_proc_a==NULL) { printk(KERN_ALERT "Error: Could not initialize %s\n", "tlc_proc_a"); goto hello_init_end; } //Packet RX nfho_pre_routing.hook = pre_routing_hook_func; nfho_pre_routing.hooknum = NF_INET_PRE_ROUTING; nfho_pre_routing.pf = PF_INET; nfho_pre_routing.priority = NF_IP_PRI_FIRST; nf_register_hook(&nfho_pre_routing); hello_init_end: return 0; } static void hello_exit(void) { remove_proc_entry("tlc_proc_a", NULL); nf_unregister_hook(&nfho_pre_routing); } module_init(hello_init); module_exit(hello_exit);
Download my sample C-code(with compile script) discussed in this video episode HERE.
Suggested Topics:
Video Episodes :: Linux Kernel programming
Wednesday' 18-May-2022
Wednesday' 18-May-2022
Saturday' 13-Mar-2021
Saturday' 13-Mar-2021
Saturday' 14-May-2022
Join The Linux Channel :: Facebook Group ↗
Visit The Linux Channel :: on Youtube ↗
💗 Help shape the future: Sponsor/Donate
Recommended Topics:
Featured Video:
Trending Video:
Recommended Video: