mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Not all I mean serious. Almost everything will change.
Changes: struct ospf_iface draft, various constants added...
This commit is contained in:
		| @@ -15,16 +15,138 @@ | ||||
| #include "nest/protocol.h" | ||||
| #include "nest/route.h" | ||||
| #include "conf/conf.h" | ||||
| #include "lib/ip.h" | ||||
| #include "lib/socket.h" | ||||
| #include "lib/lists.h" | ||||
|  | ||||
| #include "ospf.h" | ||||
|  | ||||
| int | ||||
| ospf_rx_hook(sock *sk, int size) | ||||
| { | ||||
|   DBG(" RX_Hook_Called.\n"); | ||||
|   return(1); | ||||
| } | ||||
|  | ||||
| void | ||||
| ospf_tx_hook(sock *sk) | ||||
| { | ||||
|   DBG(" TX_Hook_Called.\n"); | ||||
| } | ||||
|  | ||||
| void | ||||
| ospf_err_hook(sock *sk, int err) | ||||
| { | ||||
|   DBG(" Err_Hook_Called.\n"); | ||||
| } | ||||
|  | ||||
| /* This will change ! */ | ||||
| sock * | ||||
| ospf_open_socket(struct proto *p, struct ospf_iface *ifa) | ||||
| { | ||||
|   sock *mcsk; | ||||
|  | ||||
|   /* No NBMA networks now */ | ||||
|  | ||||
|   if(ifa->iface->flags & IF_MULTICAST) | ||||
|   { | ||||
|     mcsk=sk_new(p->pool); | ||||
|     mcsk->type=SK_IP_MC; | ||||
|     mcsk->dport=OSPF_PROTO; | ||||
|     mcsk->saddr=AllSPFRouters; | ||||
|     mcsk->daddr=AllSPFRouters; | ||||
|     mcsk->ttl=1; | ||||
|     mcsk->rx_hook=ospf_rx_hook; | ||||
|     mcsk->tx_hook=ospf_tx_hook; | ||||
|     mcsk->err_hook=ospf_err_hook; | ||||
|     mcsk->iface=ifa->iface; | ||||
|     mcsk->rbsize=ifa->iface->mtu; | ||||
|     if(sk_open(mcsk)!=0) | ||||
|     { | ||||
|       DBG(" OSPF: SK_OPEN: failed\n"); | ||||
|       return(NULL); | ||||
|     } | ||||
|     return(mcsk); | ||||
|   } | ||||
|   else return(NULL); | ||||
| } | ||||
|  | ||||
| /*  | ||||
|  * This will later decide, wheter use iface for OSPF or not | ||||
|  * depending on config | ||||
|  */ | ||||
| int | ||||
| is_good_iface(struct proto *p, struct iface *iface) | ||||
| { | ||||
|   return(iface->flags & IF_UP); | ||||
| } | ||||
|  | ||||
| /* Of course, it's NOT true now */ | ||||
| byte | ||||
| ospf_iface_clasify(struct iface *ifa) | ||||
| { | ||||
|   if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))== | ||||
|     IF_MULTIACCESS|IF_MULTICAST) return OSPF_IM_MULTICAST; | ||||
|   if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))== | ||||
|     IF_MULTIACCESS) return OSPF_IM_NBMA; | ||||
|   return OSPF_IM_PTP; | ||||
| } | ||||
|  | ||||
| void | ||||
| ospf_iface_default(struct ospf_iface *ifa) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   ifa->area=0; | ||||
|   ifa->cost=COST_D; | ||||
|   ifa->rxmtint=RXMTINT_D; | ||||
|   ifa->iftransdelay=IFTRANSDELAY_D; | ||||
|   ifa->priority=PRIORITY_D; | ||||
|   ifa->helloint=HELLOINT_D; | ||||
|   ifa->deadint=DEADINT_D; | ||||
|   ifa->autype=0; | ||||
|   for(i=0;i<8;i++) ifa->aukey[i]=0; | ||||
|   ifa->options=0; | ||||
|   ifa->dr=ipa_from_u32(0x00000000); | ||||
|   ifa->bdr=ipa_from_u32(0x00000000); | ||||
|   ifa->mode=ospf_iface_clasify(ifa->iface); | ||||
| } | ||||
|  | ||||
| void | ||||
| ospf_if_notify(struct proto *p, unsigned flags, struct iface *new, struct iface *old) | ||||
| { | ||||
|   struct ospf_iface *ospf_iface; | ||||
|  | ||||
|   struct ospf_config *c; | ||||
|   c=(struct ospf_config *)(p->cf); | ||||
|  | ||||
|    | ||||
|  | ||||
|   DBG(" OSPF: If notify called\n"); | ||||
|  | ||||
|   if(((flags & IF_CHANGE_UP)==IF_CHANGE_UP) && is_good_iface(p, new)) | ||||
|   { | ||||
|     /* Latter I'll use config - this is incorrect */ | ||||
|     ospf_iface=mb_alloc(p->pool, sizeof(struct ospf_iface)); | ||||
|     ospf_iface->iface=new; | ||||
|     add_tail(&(c->iface_list), NODE ospf_iface); | ||||
|     ospf_iface_default(ospf_iface); | ||||
|     init_list(&(ospf_iface->sk_list)); | ||||
|     if(ospf_open_socket(p, ospf_iface)!=NULL) | ||||
|     { | ||||
|       add_tail(&(ospf_iface->sk_list),NODE ospf_iface); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| static int | ||||
| ospf_start(struct proto *p) | ||||
| { | ||||
|   struct ospf_config *c = (void *) p->cf; | ||||
|  | ||||
|   DBG(" OSPF: Start\n"); | ||||
|  | ||||
|   p->if_notify=ospf_if_notify; | ||||
|  | ||||
|   return PS_UP; | ||||
| } | ||||
|  | ||||
| @@ -53,6 +175,7 @@ static void | ||||
| ospf_preconfig(struct protocol *x, struct config *c) | ||||
| { | ||||
|   DBG( " OSPF: preconfig\n" ); | ||||
|   init_list(&(((struct ospf_config *)c)->iface_list)); | ||||
| } | ||||
|  | ||||
| static void | ||||
|   | ||||
| @@ -9,9 +9,55 @@ | ||||
| #ifndef _BIRD_OSPF_H_ | ||||
| #define _BIRD_OSPF_H_ | ||||
|  | ||||
| #define OSPF_PROTO 89 | ||||
| #define AllSPFRouters ipa_from_u32(0xe0000005)	/* 224.0.0.5 */ | ||||
| #define AllDRouters ipa_from_u32(0xe0000006)	/* 224.0.0.6 */ | ||||
|  | ||||
| struct ospf_config { | ||||
|   struct proto_config c; | ||||
|   ip_addr area;		/* Area ID */ | ||||
|   ip_addr area;		/* Area ID  !!! This is wrong !!! */ | ||||
|   list iface_list; | ||||
| }; | ||||
|  | ||||
| struct ospf_iface { | ||||
|   node n; | ||||
|   list sk_list;		/* List of active sockets */ | ||||
|   struct iface *iface;	/* Nest's iface */ | ||||
|   u32 area;		/* OSPF Area */ | ||||
|   u16 cost;		/* Cost of iface */ | ||||
|   int rxmtint;		/* number of seconds between LSA retransmissions */ | ||||
|   int iftransdelay;	/* The estimated number of seconds it takes to | ||||
| 			   transmit a Link State Update Packet over this | ||||
| 			   interface.  LSAs contained in the update */ | ||||
|   u8 priority;		/* A router priority for DR election */ | ||||
|   u16 helloint;		/* number of seconds between hello sending */ | ||||
|   u32 deadint;		/* after "deadint" missing hellos is router dead */ | ||||
|   u16 autype; | ||||
|   u8 aukey[8]; | ||||
|   u8 options; | ||||
|   ip_addr dr;		/* Designated router */ | ||||
|   ip_addr bdr;		/* Backup DR */ | ||||
|   byte mode; | ||||
| #define OSPF_IM_MULTICAST 0 | ||||
| #define OSPF_IM_PTP 1 | ||||
| #define OSPF_IM_NBMA 2 | ||||
|  | ||||
| /* Default values for interface parameters */ | ||||
| #define COST_D 10 | ||||
| #define RXMTINT_D 5 | ||||
| #define IFTRANSDELAY_D 1 | ||||
| #define PRIORITY_D 0 | ||||
| #define HELLOINT_D 10 | ||||
| #define DEADINT_D 4 | ||||
| }; | ||||
|  | ||||
|  | ||||
| struct ospf_patt { | ||||
|   struct iface_patt i; | ||||
|  | ||||
|   u16 cost; | ||||
|   byte mode; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif /* _BIRD_OSPF_H_ */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user