Annotation of embedaddon/quagga/ospfd/ospf_api.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * API message handling module for OSPF daemon and client.
        !             3:  * Copyright (C) 2001, 2002 Ralph Keller
        !             4:  *
        !             5:  * This file is part of GNU Zebra.
        !             6:  * 
        !             7:  * GNU Zebra is free software; you can redistribute it and/or modify
        !             8:  * it under the terms of the GNU General Public License as published
        !             9:  * by the Free Software Foundation; either version 2, or (at your
        !            10:  * option) any later version.
        !            11:  *
        !            12:  * GNU Zebra is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            15:  * General Public License for more details.
        !            16:  *
        !            17:  * You should have received a copy of the GNU General Public License
        !            18:  * along with GNU Zebra; see the file COPYING.  If not, write to the
        !            19:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
        !            20:  * Boston, MA 02111-1307, USA.
        !            21:  */
        !            22: 
        !            23: 
        !            24: /* This file is used both by the OSPFd and client applications to
        !            25:    define message formats used for communication. */
        !            26: 
        !            27: #ifndef _OSPF_API_H
        !            28: #define _OSPF_API_H
        !            29: 
        !            30: #define OSPF_API_VERSION           1
        !            31: 
        !            32: /* MTYPE definition is not reflected to "memory.h". */
        !            33: #define MTYPE_OSPF_API_MSG      MTYPE_TMP
        !            34: #define MTYPE_OSPF_API_FIFO     MTYPE_TMP
        !            35: 
        !            36: /* Default API server port to accept connection request from client-side. */
        !            37: /* This value could be overridden by "ospfapi" entry in "/etc/services". */
        !            38: #define OSPF_API_SYNC_PORT      2607
        !            39: 
        !            40: /* -----------------------------------------------------------
        !            41:  * Generic messages 
        !            42:  * -----------------------------------------------------------
        !            43:  */
        !            44: 
        !            45: /* Message header structure, fields are in network byte order and
        !            46:    aligned to four octets. */
        !            47: struct apimsghdr
        !            48: {
        !            49:   u_char version;              /* OSPF API protocol version */
        !            50:   u_char msgtype;              /* Type of message */
        !            51:   u_int16_t msglen;            /* Length of message w/o header */
        !            52:   u_int32_t msgseq;            /* Sequence number */
        !            53: };
        !            54: 
        !            55: /* Message representation with header and body */
        !            56: struct msg
        !            57: {
        !            58:   struct msg *next;            /* to link into fifo */
        !            59: 
        !            60:   /* Message header */
        !            61:   struct apimsghdr hdr;
        !            62: 
        !            63:   /* Message body */
        !            64:   struct stream *s;
        !            65: };
        !            66: 
        !            67: /* Prototypes for generic messages. */
        !            68: extern struct msg *msg_new (u_char msgtype, void *msgbody,
        !            69:                     u_int32_t seqnum, u_int16_t msglen);
        !            70: extern struct msg *msg_dup (struct msg *msg);
        !            71: extern void msg_print (struct msg *msg);       /* XXX debug only */
        !            72: extern void msg_free (struct msg *msg);
        !            73: struct msg *msg_read (int fd);
        !            74: extern int msg_write (int fd, struct msg *msg);
        !            75: 
        !            76: /* For requests, the message sequence number is between MIN_SEQ and
        !            77:    MAX_SEQ. For notifications, the sequence number is 0. */
        !            78: 
        !            79: #define MIN_SEQ          1
        !            80: #define MAX_SEQ 2147483647
        !            81: 
        !            82: extern void msg_set_seq (struct msg *msg, u_int32_t seqnr);
        !            83: extern u_int32_t msg_get_seq (struct msg *msg);
        !            84: 
        !            85: /* -----------------------------------------------------------
        !            86:  * Message fifo queues
        !            87:  * -----------------------------------------------------------
        !            88:  */
        !            89: 
        !            90: /* Message queue structure. */
        !            91: struct msg_fifo
        !            92: {
        !            93:   unsigned long count;
        !            94: 
        !            95:   struct msg *head;
        !            96:   struct msg *tail;
        !            97: };
        !            98: 
        !            99: /* Prototype for message fifo queues. */
        !           100: extern struct msg_fifo *msg_fifo_new (void);
        !           101: extern void msg_fifo_push (struct msg_fifo *, struct msg *msg);
        !           102: extern struct msg *msg_fifo_pop (struct msg_fifo *fifo);
        !           103: extern struct msg *msg_fifo_head (struct msg_fifo *fifo);
        !           104: extern void msg_fifo_flush (struct msg_fifo *fifo);
        !           105: extern void msg_fifo_free (struct msg_fifo *fifo);
        !           106: 
        !           107: /* -----------------------------------------------------------
        !           108:  * Specific message type and format definitions
        !           109:  * -----------------------------------------------------------
        !           110:  */
        !           111: 
        !           112: /* Messages to OSPF daemon. */
        !           113: #define MSG_REGISTER_OPAQUETYPE   1
        !           114: #define MSG_UNREGISTER_OPAQUETYPE 2
        !           115: #define MSG_REGISTER_EVENT        3
        !           116: #define MSG_SYNC_LSDB             4
        !           117: #define MSG_ORIGINATE_REQUEST     5
        !           118: #define MSG_DELETE_REQUEST        6
        !           119: 
        !           120: /* Messages from OSPF daemon. */
        !           121: #define MSG_REPLY                10
        !           122: #define MSG_READY_NOTIFY         11
        !           123: #define MSG_LSA_UPDATE_NOTIFY    12
        !           124: #define MSG_LSA_DELETE_NOTIFY    13
        !           125: #define MSG_NEW_IF               14
        !           126: #define MSG_DEL_IF               15
        !           127: #define MSG_ISM_CHANGE           16
        !           128: #define MSG_NSM_CHANGE           17
        !           129: 
        !           130: struct msg_register_opaque_type
        !           131: {
        !           132:   u_char lsatype;
        !           133:   u_char opaquetype;
        !           134:   u_char pad[2];               /* padding */
        !           135: };
        !           136: 
        !           137: struct msg_unregister_opaque_type
        !           138: {
        !           139:   u_char lsatype;
        !           140:   u_char opaquetype;
        !           141:   u_char pad[2];               /* padding */
        !           142: };
        !           143: 
        !           144: /* Power2 is needed to convert LSA types into bit positions,
        !           145:  * see typemask below. Type definition starts at 1, so
        !           146:  * Power2[0] is not used. */
        !           147: 
        !           148: 
        !           149: #ifdef ORIGINAL_CODING
        !           150: static const u_int16_t
        !           151:   Power2[] = { 0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
        !           152:   0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000
        !           153: };
        !           154: #else
        !           155: static const u_int16_t
        !           156:   Power2[] = { 0, (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4),
        !           157:   (1 << 5), (1 << 6), (1 << 7), (1 << 8), (1 << 9),
        !           158:   (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14),
        !           159:   (1 << 15)
        !           160: };
        !           161: #endif /* ORIGINAL_CODING */
        !           162: 
        !           163: struct lsa_filter_type
        !           164: {
        !           165:   u_int16_t typemask;          /* bitmask for selecting LSA types (1..16) */
        !           166:   u_char origin;               /* selects according to origin. */
        !           167: #define NON_SELF_ORIGINATED    0
        !           168: #define        SELF_ORIGINATED  (OSPF_LSA_SELF)
        !           169: #define        ANY_ORIGIN 2
        !           170: 
        !           171:   u_char num_areas;            /* number of areas in the filter. */
        !           172:   /* areas, if any, go here. */
        !           173: };
        !           174: 
        !           175: struct msg_register_event
        !           176: {
        !           177:   struct lsa_filter_type filter;
        !           178: };
        !           179: 
        !           180: struct msg_sync_lsdb
        !           181: {
        !           182:   struct lsa_filter_type filter;
        !           183: };
        !           184: 
        !           185: struct msg_originate_request
        !           186: {
        !           187:   /* Used for LSA type 9 otherwise ignored */
        !           188:   struct in_addr ifaddr;
        !           189: 
        !           190:   /* Used for LSA type 10 otherwise ignored */
        !           191:   struct in_addr area_id;
        !           192: 
        !           193:   /* LSA header and LSA-specific part */
        !           194:   struct lsa_header data;
        !           195: };
        !           196: 
        !           197: struct msg_delete_request
        !           198: {
        !           199:   struct in_addr area_id;      /* "0.0.0.0" for AS-external opaque LSAs */
        !           200:   u_char lsa_type;
        !           201:   u_char opaque_type;
        !           202:   u_char pad[2];               /* padding */
        !           203:   u_int32_t opaque_id;
        !           204: };
        !           205: 
        !           206: struct msg_reply
        !           207: {
        !           208:   signed char errcode;
        !           209: #define OSPF_API_OK                         0
        !           210: #define OSPF_API_NOSUCHINTERFACE          (-1)
        !           211: #define OSPF_API_NOSUCHAREA               (-2)
        !           212: #define OSPF_API_NOSUCHLSA                (-3)
        !           213: #define OSPF_API_ILLEGALLSATYPE           (-4)
        !           214: #define OSPF_API_OPAQUETYPEINUSE          (-5)
        !           215: #define OSPF_API_OPAQUETYPENOTREGISTERED  (-6)
        !           216: #define OSPF_API_NOTREADY                 (-7)
        !           217: #define OSPF_API_NOMEMORY                 (-8)
        !           218: #define OSPF_API_ERROR                    (-9)
        !           219: #define OSPF_API_UNDEF                   (-10)
        !           220:   u_char pad[3];               /* padding to four byte alignment */
        !           221: };
        !           222: 
        !           223: /* Message to tell client application that it ospf daemon is 
        !           224:  * ready to accept opaque LSAs for a given interface or area. */
        !           225: 
        !           226: struct msg_ready_notify
        !           227: {
        !           228:   u_char lsa_type;
        !           229:   u_char opaque_type;
        !           230:   u_char pad[2];               /* padding */
        !           231:   struct in_addr addr;         /* interface address or area address */
        !           232: };
        !           233: 
        !           234: /* These messages have a dynamic length depending on the embodied LSA.
        !           235:    They are aligned to four octets. msg_lsa_change_notify is used for
        !           236:    both LSA update and LSAs delete. */
        !           237: 
        !           238: struct msg_lsa_change_notify
        !           239: {
        !           240:   /* Used for LSA type 9 otherwise ignored */
        !           241:   struct in_addr ifaddr;
        !           242:   /* Area ID. Not valid for AS-External and Opaque11 LSAs. */
        !           243:   struct in_addr area_id;
        !           244:   u_char is_self_originated;   /* 1 if self originated. */
        !           245:   u_char pad[3];
        !           246:   struct lsa_header data;
        !           247: };
        !           248: 
        !           249: struct msg_new_if
        !           250: {
        !           251:   struct in_addr ifaddr;       /* interface IP address */
        !           252:   struct in_addr area_id;      /* area this interface belongs to */
        !           253: };
        !           254: 
        !           255: struct msg_del_if
        !           256: {
        !           257:   struct in_addr ifaddr;       /* interface IP address */
        !           258: };
        !           259: 
        !           260: struct msg_ism_change
        !           261: {
        !           262:   struct in_addr ifaddr;       /* interface IP address */
        !           263:   struct in_addr area_id;      /* area this interface belongs to */
        !           264:   u_char status;               /* interface status (up/down) */
        !           265:   u_char pad[3];               /* not used */
        !           266: };
        !           267: 
        !           268: struct msg_nsm_change
        !           269: {
        !           270:   struct in_addr ifaddr;       /* attached interface */
        !           271:   struct in_addr nbraddr;      /* Neighbor interface address */
        !           272:   struct in_addr router_id;    /* Router ID of neighbor */
        !           273:   u_char status;               /* NSM status */
        !           274:   u_char pad[3];
        !           275: };
        !           276: 
        !           277: /* We make use of a union to define a structure that covers all
        !           278:    possible API messages. This allows us to find out how much memory
        !           279:    needs to be reserved for the largest API message. */
        !           280: struct apimsg
        !           281: {
        !           282:   struct apimsghdr hdr;
        !           283:   union
        !           284:   {
        !           285:     struct msg_register_opaque_type register_opaque_type;
        !           286:     struct msg_register_event register_event;
        !           287:     struct msg_sync_lsdb sync_lsdb;
        !           288:     struct msg_originate_request originate_request;
        !           289:     struct msg_delete_request delete_request;
        !           290:     struct msg_reply reply;
        !           291:     struct msg_ready_notify ready_notify;
        !           292:     struct msg_new_if new_if;
        !           293:     struct msg_del_if del_if;
        !           294:     struct msg_ism_change ism_change;
        !           295:     struct msg_nsm_change nsm_change;
        !           296:     struct msg_lsa_change_notify lsa_change_notify;
        !           297:   }
        !           298:   u;
        !           299: };
        !           300: 
        !           301: #define OSPF_API_MAX_MSG_SIZE (sizeof(struct apimsg) + OSPF_MAX_LSA_SIZE)
        !           302: 
        !           303: /* -----------------------------------------------------------
        !           304:  * Prototypes for specific messages
        !           305:  * -----------------------------------------------------------
        !           306:  */
        !           307: 
        !           308: /* For debugging only. */
        !           309: extern void api_opaque_lsa_print (struct lsa_header *data);
        !           310: 
        !           311: /* Messages sent by client */
        !           312: extern struct msg *new_msg_register_opaque_type (u_int32_t seqnum,
        !           313:                                                 u_char ltype, u_char otype);
        !           314: extern struct msg *new_msg_register_event (u_int32_t seqnum,
        !           315:                                           struct lsa_filter_type *filter);
        !           316: extern struct msg *new_msg_sync_lsdb (u_int32_t seqnum,
        !           317:                                      struct lsa_filter_type *filter);
        !           318: extern struct msg *new_msg_originate_request (u_int32_t seqnum,
        !           319:                                              struct in_addr ifaddr,
        !           320:                                              struct in_addr area_id,
        !           321:                                              struct lsa_header *data);
        !           322: extern struct msg *new_msg_delete_request (u_int32_t seqnum,
        !           323:                                           struct in_addr area_id,
        !           324:                                           u_char lsa_type,
        !           325:                                           u_char opaque_type,
        !           326:                                           u_int32_t opaque_id);
        !           327: 
        !           328: /* Messages sent by OSPF daemon */
        !           329: extern struct msg *new_msg_reply (u_int32_t seqnum, u_char rc);
        !           330: 
        !           331: extern struct msg *new_msg_ready_notify (u_int32_t seqnr, u_char lsa_type,
        !           332:                                         u_char opaque_type,
        !           333:                                         struct in_addr addr);
        !           334: 
        !           335: extern struct msg *new_msg_new_if (u_int32_t seqnr,
        !           336:                                   struct in_addr ifaddr,
        !           337:                                   struct in_addr area);
        !           338: 
        !           339: extern struct msg *new_msg_del_if (u_int32_t seqnr, struct in_addr ifaddr);
        !           340: 
        !           341: extern struct msg *new_msg_ism_change (u_int32_t seqnr, struct in_addr ifaddr,
        !           342:                                       struct in_addr area, u_char status);
        !           343: 
        !           344: extern struct msg *new_msg_nsm_change (u_int32_t seqnr, struct in_addr ifaddr,
        !           345:                                       struct in_addr nbraddr,
        !           346:                                       struct in_addr router_id,
        !           347:                                       u_char status);
        !           348: 
        !           349: /* msgtype is MSG_LSA_UPDATE_NOTIFY or MSG_LSA_DELETE_NOTIFY */
        !           350: extern struct msg *new_msg_lsa_change_notify (u_char msgtype,
        !           351:                                              u_int32_t seqnum,
        !           352:                                              struct in_addr ifaddr,
        !           353:                                              struct in_addr area_id,
        !           354:                                              u_char is_self_originated,
        !           355:                                              struct lsa_header *data);
        !           356: 
        !           357: /* string printing functions */
        !           358: extern const char *ospf_api_errname (int errcode);
        !           359: extern const char *ospf_api_typename (int msgtype);
        !           360: 
        !           361: #endif /* _OSPF_API_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>