1: /*
2: * BIRD -- Documentation for Protocol Hooks (dummy source file)
3: *
4: * (c) 2000 Martin Mares <mj@ucw.cz>
5: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: */
8:
9: /**
10: * DOC: Protocol hooks
11: *
12: * Each protocol can provide a rich set of hook functions referred to by pointers
13: * in either the &proto or &protocol structure. They are called by the core whenever
14: * it wants the protocol to perform some action or to notify the protocol about
15: * any change of its environment. All of the hooks can be set to %NULL which means
16: * to ignore the change or to take a default action.
17: */
18:
19: /**
20: * preconfig - protocol preconfiguration
21: * @p: a routing protocol
22: * @c: new configuration
23: *
24: * The preconfig() hook is called before parsing of a new configuration.
25: */
26: void preconfig(struct protocol *p, struct config *c)
27: { DUMMY; }
28:
29: /**
30: * postconfig - instance post-configuration
31: * @c: instance configuration
32: *
33: * The postconfig() hook is called for each configured instance after
34: * parsing of the new configuration is finished.
35: */
36: void postconfig(struct proto_config *c)
37: { DUMMY; }
38:
39: /**
40: * init - initialize an instance
41: * @c: instance configuration
42: *
43: * The init() hook is called by the core to create a protocol instance
44: * according to supplied protocol configuration.
45: *
46: * Result: a pointer to the instance created
47: */
48: struct proto *init(struct proto_config *c)
49: { DUMMY; }
50:
51: /**
52: * reconfigure - request instance reconfiguration
53: * @p: an instance
54: * @c: new configuration
55: *
56: * The core calls the reconfigure() hook whenever it wants to ask the
57: * protocol for switching to a new configuration. If the reconfiguration
58: * is possible, the hook returns 1. Otherwise, it returns 0 and the core
59: * will shut down the instance and start a new one with the new configuration.
60: *
61: * After the protocol confirms reconfiguration, it must no longer keep any
62: * references to the old configuration since the memory it's stored in can
63: * be re-used at any time.
64: */
65: int reconfigure(struct proto *p, struct proto_config *c)
66: { DUMMY; }
67:
68: /**
69: * dump - dump protocol state
70: * @p: an instance
71: *
72: * This hook dumps the complete state of the instance to the
73: * debug output.
74: */
75: void dump(struct proto *p)
76: { DUMMY; }
77:
78: /**
79: * dump_attrs - dump protocol-dependent attributes
80: * @e: a route entry
81: *
82: * This hook dumps all attributes in the &rte which belong to this
83: * protocol to the debug output.
84: */
85: void dump_attrs(rte *e)
86: { DUMMY; }
87:
88: /**
89: * start - request instance startup
90: * @p: protocol instance
91: *
92: * The start() hook is called by the core when it wishes to start
93: * the instance. Multitable protocols should lock their tables here.
94: *
95: * Result: new protocol state
96: */
97: int start(struct proto *p)
98: { DUMMY; }
99:
100: /**
101: * shutdown - request instance shutdown
102: * @p: protocol instance
103: *
104: * The stop() hook is called by the core when it wishes to shut
105: * the instance down for some reason.
106: *
107: * Returns: new protocol state
108: */
109: int shutdown(struct proto *p)
110: { DUMMY; }
111:
112: /**
113: * cleanup - request instance cleanup
114: * @p: protocol instance
115: *
116: * The cleanup() hook is called by the core when the protocol became
117: * hungry/down, i.e. all protocol ahooks and routes are flushed.
118: * Multitable protocols should unlock their tables here.
119: */
120: void cleanup(struct proto *p)
121: { DUMMY; }
122:
123: /**
124: * get_status - get instance status
125: * @p: protocol instance
126: * @buf: buffer to be filled with the status string
127: *
128: * This hook is called by the core if it wishes to obtain an brief one-line user friendly
129: * representation of the status of the instance to be printed by the <cf/show protocols/
130: * command.
131: */
132: void get_status(struct proto *p, byte *buf)
133: { DUMMY; }
134:
135: /**
136: * get_route_info - get route information
137: * @e: a route entry
138: * @buf: buffer to be filled with the resulting string
139: * @attrs: extended attributes of the route
140: *
141: * This hook is called to fill the buffer @buf with a brief user friendly
142: * representation of metrics of a route belonging to this protocol.
143: */
144: void get_route_info(rte *e, byte *buf, ea_list *attrs)
145: { DUMMY; }
146:
147: /**
148: * get_attr - get attribute information
149: * @a: an extended attribute
150: * @buf: buffer to be filled with attribute information
151: * @buflen: a length of the @buf parameter
152: *
153: * The get_attr() hook is called by the core to obtain a user friendly
154: * representation of an extended route attribute. It can either leave
155: * the whole conversion to the core (by returning %GA_UNKNOWN), fill
156: * in only attribute name (and let the core format the attribute value
157: * automatically according to the type field; by returning %GA_NAME)
158: * or doing the whole conversion (used in case the value requires extra
159: * care; return %GA_FULL).
160: */
161: int get_attr(eattr *a, byte *buf, int buflen)
162: { DUMMY; }
163:
164: /**
165: * if_notify - notify instance about interface changes
166: * @p: protocol instance
167: * @flags: interface change flags
168: * @i: the interface in question
169: *
170: * This hook is called whenever any network interface changes its status.
171: * The change is described by a combination of status bits (%IF_CHANGE_xxx)
172: * in the @flags parameter.
173: */
174: void if_notify(struct proto *p, unsigned flags, struct iface *i)
175: { DUMMY; }
176:
177: /**
178: * ifa_notify - notify instance about interface address changes
179: * @p: protocol instance
180: * @flags: address change flags
181: * @a: the interface address
182: *
183: * This hook is called to notify the protocol instance about an interface
184: * acquiring or losing one of its addresses. The change is described by
185: * a combination of status bits (%IF_CHANGE_xxx) in the @flags parameter.
186: */
187: void ifa_notify(struct proto *p, unsigned flags, struct ifa *a)
188: { DUMMY; }
189:
190: /**
191: * rt_notify - notify instance about routing table change
192: * @p: protocol instance
193: * @channel: notifying channel
194: * @net: a network entry
195: * @new: new route for the network
196: * @old: old route for the network
197: * @attrs: extended attributes associated with the @new entry
198: *
199: * The rt_notify() hook is called to inform the protocol instance about
200: * changes in the connected routing table @table, that is a route @old
201: * belonging to network @net being replaced by a new route @new with
202: * extended attributes @attrs. Either @new or @old or both can be %NULL
203: * if the corresponding route doesn't exist.
204: *
205: * If the type of route announcement is RA_OPTIMAL, it is an
206: * announcement of optimal route change, @new stores the new optimal
207: * route and @old stores the old optimal route.
208: *
209: * If the type of route announcement is RA_ANY, it is an announcement
210: * of any route change, @new stores the new route and @old stores the
211: * old route from the same protocol.
212: *
213: * @p->accept_ra_types specifies which kind of route announcements
214: * protocol wants to receive.
215: */
216: void rt_notify(struct proto *p, net *net, rte *new, rte *old, ea_list *attrs)
217: { DUMMY; }
218:
219: /**
220: * neigh_notify - notify instance about neighbor status change
221: * @neigh: a neighbor cache entry
222: *
223: * The neigh_notify() hook is called by the neighbor cache whenever
224: * a neighbor changes its state, that is it gets disconnected or a
225: * sticky neighbor gets connected.
226: */
227: void neigh_notify(neighbor *neigh)
228: { DUMMY; }
229:
230: /**
231: * make_tmp_attrs - convert embedded attributes to temporary ones
232: * @e: route entry
233: * @pool: linear pool to allocate attribute memory in
234: *
235: * This hook is called by the routing table functions if they need
236: * to convert the protocol attributes embedded directly in the &rte
237: * to temporary extended attributes in order to distribute them
238: * to other protocols or to filters. make_tmp_attrs() creates
239: * an &ea_list in the linear pool @pool, fills it with values of the
240: * temporary attributes and returns a pointer to it.
241: */
242: ea_list *make_tmp_attrs(rte *e, struct linpool *pool)
243: { DUMMY; }
244:
245: /**
246: * store_tmp_attrs - convert temporary attributes to embedded ones
247: * @e: route entry
248: * @attrs: temporary attributes to be converted
249: *
250: * This hook is an exact opposite of make_tmp_attrs() -- it takes
251: * a list of extended attributes and converts them to attributes
252: * embedded in the &rte corresponding to this protocol.
253: *
254: * You must be prepared for any of the attributes being missing
255: * from the list and use default values instead.
256: */
257: void store_tmp_attrs(rte *e, ea_list *attrs)
258: { DUMMY; }
259:
260: /**
261: * preexport - pre-filtering decisions before route export
262: * @p: protocol instance the route is going to be exported to
263: * @e: the route in question
264: * @attrs: extended attributes of the route
265: * @pool: linear pool for allocation of all temporary data
266: *
267: * The preexport() hook is called as the first step of a exporting
268: * a route from a routing table to the protocol instance. It can modify
269: * route attributes and force acceptance or rejection of the route before
270: * the user-specified filters are run. See rte_announce() for a complete description
271: * of the route distribution process.
272: *
273: * The standard use of this hook is to reject routes having originated
274: * from the same instance and to set default values of the protocol's metrics.
275: *
276: * Result: 1 if the route has to be accepted, -1 if rejected and 0 if it
277: * should be passed to the filters.
278: */
279: int preexport(struct proto *p, rte **e, ea_list **attrs, struct linpool *pool)
280: { DUMMY; }
281:
282: /**
283: * rte_recalculate - prepare routes for comparison
284: * @table: a routing table
285: * @net: a network entry
286: * @new: new route for the network
287: * @old: old route for the network
288: * @old_best: old best route for the network (may be NULL)
289: *
290: * This hook is called when a route change (from @old to @new for a
291: * @net entry) is propagated to a @table. It may be used to prepare
292: * routes for comparison by rte_better() in the best route
293: * selection. @new may or may not be in @net->routes list,
294: * @old is not there.
295: *
296: * Result: 1 if the ordering implied by rte_better() changes enough
297: * that full best route calculation have to be done, 0 otherwise.
298: */
299: int rte_recalculate(struct rtable *table, struct network *net, struct rte *new, struct rte *old, struct rte *old_best)
300: { DUMMY; }
301:
302: /**
303: * rte_better - compare metrics of two routes
304: * @new: the new route
305: * @old: the original route
306: *
307: * This hook gets called when the routing table contains two routes
308: * for the same network which have originated from different instances
309: * of a single protocol and it wants to select which one is preferred
310: * over the other one. Protocols usually decide according to route metrics.
311: *
312: * Result: 1 if @new is better (more preferred) than @old, 0 otherwise.
313: */
314: int rte_better(rte *new, rte *old)
315: { DUMMY; }
316:
317: /**
318: * rte_same - compare two routes
319: * @e1: route
320: * @e2: route
321: *
322: * The rte_same() hook tests whether the routes @e1 and @e2 belonging
323: * to the same protocol instance have identical contents. Contents of
324: * &rta, all the extended attributes and &rte preference are checked
325: * by the core code, no need to take care of them here.
326: *
327: * Result: 1 if @e1 is identical to @e2, 0 otherwise.
328: */
329: int rte_same(rte *e1, rte *e2)
330: { DUMMY; }
331:
332: /**
333: * rte_insert - notify instance about route insertion
334: * @n: network
335: * @e: route
336: *
337: * This hook is called whenever a &rte belonging to the instance
338: * is accepted for insertion to a routing table.
339: *
340: * Please avoid using this function in new protocols.
341: */
342: void rte_insert(net *n, rte *e)
343: { DUMMY; }
344:
345: /**
346: * rte_remove - notify instance about route removal
347: * @n: network
348: * @e: route
349: *
350: * This hook is called whenever a &rte belonging to the instance
351: * is removed from a routing table.
352: *
353: * Please avoid using this function in new protocols.
354: */
355: void rte_remove(net *n, rte *e)
356: { DUMMY; }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>