mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Added skeletal version of Linux netlink interface. It doesn't work yet,
but the framework is there and I'll try finish it soon.
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	Configuration for Linux 2.1 based systems
 | 
			
		||||
 *
 | 
			
		||||
 *	(c) 1998 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 *	(c) 1998--1999 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 *
 | 
			
		||||
 *	Can be freely distributed and used under the terms of the GNU GPL.
 | 
			
		||||
 */
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
#define CONFIG_ALL_MULTICAST
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Link: sysdep/linux/netlink
 | 
			
		||||
Link: sysdep/linux
 | 
			
		||||
Link: sysdep/unix
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
#ifdef CONFIG_NETLINK
 | 
			
		||||
netlink.c
 | 
			
		||||
#else
 | 
			
		||||
#ifndef CONFIG_NETLINK
 | 
			
		||||
krt-scan.c
 | 
			
		||||
krt-scan.h
 | 
			
		||||
krt-scan.Y
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								sysdep/linux/netlink/Modules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								sysdep/linux/netlink/Modules
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
krt.c
 | 
			
		||||
krt.h
 | 
			
		||||
krt.Y
 | 
			
		||||
							
								
								
									
										46
									
								
								sysdep/linux/netlink/krt.Y
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								sysdep/linux/netlink/krt.Y
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	BIRD -- Netlink Interface Configuration
 | 
			
		||||
 *
 | 
			
		||||
 *	(c) 1999 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 *
 | 
			
		||||
 *	Can be freely distributed and used under the terms of the GNU GPL.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
CF_HDR
 | 
			
		||||
 | 
			
		||||
#include "lib/krt.h"
 | 
			
		||||
 | 
			
		||||
#define KRT_PROTO ((struct krt_config *) this_proto)
 | 
			
		||||
 | 
			
		||||
CF_DECLS
 | 
			
		||||
 | 
			
		||||
CF_KEYWORDS(KERNEL, PERSIST, ROUTE, SCAN, TIME, LEARN)
 | 
			
		||||
 | 
			
		||||
CF_GRAMMAR
 | 
			
		||||
 | 
			
		||||
/* Kernel protocol */
 | 
			
		||||
 | 
			
		||||
CF_ADDTO(proto, kern_proto '}')
 | 
			
		||||
 | 
			
		||||
kern_proto_start: proto_start KERNEL {
 | 
			
		||||
     if (!(this_proto = cf_krt)) cf_error("Kernel protocol already defined");
 | 
			
		||||
     cf_krt = NULL;
 | 
			
		||||
   }
 | 
			
		||||
 ;
 | 
			
		||||
 | 
			
		||||
kern_proto:
 | 
			
		||||
   kern_proto_start '{'
 | 
			
		||||
 | kern_proto proto_item ';'
 | 
			
		||||
 | kern_proto kern_item ';'
 | 
			
		||||
 ;
 | 
			
		||||
 | 
			
		||||
kern_item:
 | 
			
		||||
   PERSIST bool { KRT_PROTO->persist = $2; }
 | 
			
		||||
 | SCAN TIME expr { KRT_PROTO->scan_time = $3; }
 | 
			
		||||
 | LEARN bool { KRT_PROTO->learn = $2; }
 | 
			
		||||
 | ROUTE SCAN TIME expr { KRT_PROTO->route_scan_time = $4; }
 | 
			
		||||
 ;
 | 
			
		||||
 | 
			
		||||
CF_CODE
 | 
			
		||||
 | 
			
		||||
CF_END
 | 
			
		||||
							
								
								
									
										87
									
								
								sysdep/linux/netlink/krt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								sysdep/linux/netlink/krt.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	BIRD -- Linux Netlink Interface
 | 
			
		||||
 *
 | 
			
		||||
 *	(c) 1999 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 *
 | 
			
		||||
 *	Can be freely distributed and used under the terms of the GNU GPL.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
 | 
			
		||||
#include "nest/bird.h"
 | 
			
		||||
#include "nest/route.h"
 | 
			
		||||
#include "nest/protocol.h"
 | 
			
		||||
#include "nest/iface.h"
 | 
			
		||||
#include "lib/timer.h"
 | 
			
		||||
#include "lib/unix.h"
 | 
			
		||||
#include "lib/krt.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *	We need to work around namespace conflicts between us and the kernel,
 | 
			
		||||
 *	but I prefer this way to being forced to rename our configuration symbols.
 | 
			
		||||
 *	This will disappear as soon as netlink headers become part of the libc.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef CONFIG_NETLINK
 | 
			
		||||
#include <linux/config.h>
 | 
			
		||||
#ifndef CONFIG_NETLINK
 | 
			
		||||
#error "Kernel not configured to support netlink"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <linux/netlink.h>
 | 
			
		||||
#include <linux/rtnetlink.h>
 | 
			
		||||
 | 
			
		||||
#define LOCAL_DEBUG
 | 
			
		||||
 | 
			
		||||
struct proto_config *cf_krt;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
krt_preconfig(struct protocol *x, struct config *c)
 | 
			
		||||
{
 | 
			
		||||
  struct krt_config *z = proto_config_new(&proto_unix_kernel, sizeof(struct krt_config));
 | 
			
		||||
 | 
			
		||||
  cf_krt = &z->c;
 | 
			
		||||
  z->c.preference = DEF_PREF_UKR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct proto *
 | 
			
		||||
krt_init(struct proto_config *c)
 | 
			
		||||
{
 | 
			
		||||
  struct krt_proto *p = proto_new(c, sizeof(struct krt_proto));
 | 
			
		||||
 | 
			
		||||
  return &p->p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
krt_start(struct proto *p)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Filter kernel routing table etc. */
 | 
			
		||||
 | 
			
		||||
  return PS_UP;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
krt_shutdown(struct proto *p)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: Remove all our routes from the kernel */
 | 
			
		||||
 | 
			
		||||
  return PS_DOWN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
scan_if_init(void)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: What to do here? */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct protocol proto_unix_kernel = {
 | 
			
		||||
  name:		"Kernel",
 | 
			
		||||
  preconfig:	krt_preconfig,
 | 
			
		||||
  init:		krt_init,
 | 
			
		||||
  start:	krt_start,
 | 
			
		||||
  shutdown:	krt_shutdown
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										30
									
								
								sysdep/linux/netlink/krt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								sysdep/linux/netlink/krt.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
 *	BIRD -- Linux Netlink Interface
 | 
			
		||||
 *
 | 
			
		||||
 *	(c) 1999 Martin Mares <mj@ucw.cz>
 | 
			
		||||
 *
 | 
			
		||||
 *	Can be freely distributed and used under the terms of the GNU GPL.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BIRD_NETLINK_KRT_H_
 | 
			
		||||
#define _BIRD_NETLINK_KRT_H_
 | 
			
		||||
 | 
			
		||||
extern struct protocol proto_unix_kernel;
 | 
			
		||||
 | 
			
		||||
struct krt_config {
 | 
			
		||||
  struct proto_config c;
 | 
			
		||||
  int persist;			/* Keep routes when we exit */
 | 
			
		||||
  int scan_time;		/* How often we re-scan interfaces */
 | 
			
		||||
  int route_scan_time;		/* How often we re-scan routes */
 | 
			
		||||
  int learn;			/* Learn routes from other sources */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern struct proto_config *cf_krt;
 | 
			
		||||
 | 
			
		||||
struct krt_proto {
 | 
			
		||||
  struct proto p;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void scan_if_init(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user