diff options
Diffstat (limited to 'ospfclient/ospf_apiclient.c')
| -rw-r--r-- | ospfclient/ospf_apiclient.c | 1028 | 
1 files changed, 488 insertions, 540 deletions
diff --git a/ospfclient/ospf_apiclient.c b/ospfclient/ospf_apiclient.c index c545d537fc..51e2721fd3 100644 --- a/ospfclient/ospf_apiclient.c +++ b/ospfclient/ospf_apiclient.c @@ -3,7 +3,7 @@   * Copyright (C) 2001, 2002, 2003 Ralph Keller   *   * This file is part of GNU Zebra. - *  + *   * GNU Zebra is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published   * by the Free Software Foundation; either version 2, or (at your @@ -67,24 +67,23 @@ DEFINE_MTYPE_STATIC(OSPFCLIENT, OSPF_APICLIENT, "OSPF-API client")   * -----------------------------------------------------------   */ -void ospf_apiclient_handle_reply (struct ospf_apiclient *oclient, -				  struct msg *msg); -void ospf_apiclient_handle_update_notify (struct ospf_apiclient *oclient, -					  struct msg *msg); -void ospf_apiclient_handle_delete_notify (struct ospf_apiclient *oclient, -					  struct msg *msg); +void ospf_apiclient_handle_reply(struct ospf_apiclient *oclient, +				 struct msg *msg); +void ospf_apiclient_handle_update_notify(struct ospf_apiclient *oclient, +					 struct msg *msg); +void ospf_apiclient_handle_delete_notify(struct ospf_apiclient *oclient, +					 struct msg *msg);  /* -----------------------------------------------------------   * Initialization   * -----------------------------------------------------------   */ -static unsigned short -ospf_apiclient_getport (void) +static unsigned short ospf_apiclient_getport(void)  { -  struct servent *sp = getservbyname ("ospfapi", "tcp"); +	struct servent *sp = getservbyname("ospfapi", "tcp"); -  return sp ? ntohs (sp->s_port) : OSPF_API_SYNC_PORT; +	return sp ? ntohs(sp->s_port) : OSPF_API_SYNC_PORT;  }  /* ----------------------------------------------------------- @@ -92,209 +91,203 @@ ospf_apiclient_getport (void)   * -----------------------------------------------------------   */ -struct ospf_apiclient * -ospf_apiclient_connect (char *host, int syncport) +struct ospf_apiclient *ospf_apiclient_connect(char *host, int syncport)  { -  struct sockaddr_in myaddr_sync; -  struct sockaddr_in myaddr_async; -  struct sockaddr_in peeraddr; -  struct hostent *hp; -  struct ospf_apiclient *new; -  int size = 0; -  unsigned int peeraddrlen; -  int async_server_sock; -  int fd1, fd2; -  int ret; -  int on = 1; - -  /* There are two connections between the client and the server. -     First the client opens a connection for synchronous requests/replies  -     to the server. The server will accept this connection and -     as a reaction open a reverse connection channel for  -     asynchronous messages. */ - -  async_server_sock = socket (AF_INET, SOCK_STREAM, 0); -  if (async_server_sock < 0) -    { -      fprintf (stderr, -	       "ospf_apiclient_connect: creating async socket failed\n"); -      return NULL; -    } - -  /* Prepare socket for asynchronous messages */ -  /* Initialize async address structure */ -  memset (&myaddr_async, 0, sizeof (struct sockaddr_in)); -  myaddr_async.sin_family = AF_INET; -  myaddr_async.sin_addr.s_addr = htonl (INADDR_ANY); -  myaddr_async.sin_port = htons (syncport+1); -  size = sizeof (struct sockaddr_in); +	struct sockaddr_in myaddr_sync; +	struct sockaddr_in myaddr_async; +	struct sockaddr_in peeraddr; +	struct hostent *hp; +	struct ospf_apiclient *new; +	int size = 0; +	unsigned int peeraddrlen; +	int async_server_sock; +	int fd1, fd2; +	int ret; +	int on = 1; + +	/* There are two connections between the client and the server. +	   First the client opens a connection for synchronous requests/replies +	   to the server. The server will accept this connection and +	   as a reaction open a reverse connection channel for +	   asynchronous messages. */ + +	async_server_sock = socket(AF_INET, SOCK_STREAM, 0); +	if (async_server_sock < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: creating async socket failed\n"); +		return NULL; +	} + +	/* Prepare socket for asynchronous messages */ +	/* Initialize async address structure */ +	memset(&myaddr_async, 0, sizeof(struct sockaddr_in)); +	myaddr_async.sin_family = AF_INET; +	myaddr_async.sin_addr.s_addr = htonl(INADDR_ANY); +	myaddr_async.sin_port = htons(syncport + 1); +	size = sizeof(struct sockaddr_in);  #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN -  myaddr_async.sin_len = size; +	myaddr_async.sin_len = size;  #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ -  /* This is a server socket, reuse addr and port */ -  ret = setsockopt (async_server_sock, SOL_SOCKET, -		    SO_REUSEADDR, (void *) &on, sizeof (on)); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: SO_REUSEADDR failed\n"); -      close (async_server_sock); -      return NULL; -    } +	/* This is a server socket, reuse addr and port */ +	ret = setsockopt(async_server_sock, SOL_SOCKET, SO_REUSEADDR, +			 (void *)&on, sizeof(on)); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: SO_REUSEADDR failed\n"); +		close(async_server_sock); +		return NULL; +	}  #ifdef SO_REUSEPORT -  ret = setsockopt (async_server_sock, SOL_SOCKET, SO_REUSEPORT, -		    (void *) &on, sizeof (on)); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: SO_REUSEPORT failed\n"); -      close (async_server_sock); -      return NULL; -    } +	ret = setsockopt(async_server_sock, SOL_SOCKET, SO_REUSEPORT, +			 (void *)&on, sizeof(on)); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: SO_REUSEPORT failed\n"); +		close(async_server_sock); +		return NULL; +	}  #endif /* SO_REUSEPORT */ -  /* Bind socket to address structure */ -  ret = bind (async_server_sock, (struct sockaddr *) &myaddr_async, size); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: bind async socket failed\n"); -      close (async_server_sock); -      return NULL; -    } - -  /* Wait for reverse channel connection establishment from server */ -  ret = listen (async_server_sock, BACKLOG); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: listen: %s\n", safe_strerror (errno)); -      close (async_server_sock); -      return NULL; -    } - -  /* Make connection for synchronous requests and connect to server */ -  /* Resolve address of server */ -  hp = gethostbyname (host); -  if (!hp) -    { -      fprintf (stderr, "ospf_apiclient_connect: no such host %s\n", host); -      close (async_server_sock); -      return NULL; -    } - -  fd1 = socket (AF_INET, SOCK_STREAM, 0); -  if (fd1 < 0) -    { -      fprintf (stderr, -	       "ospf_apiclient_connect: creating sync socket failed\n"); -      return NULL; -    } - - -  /* Reuse addr and port */ -  ret = setsockopt (fd1, SOL_SOCKET, -                    SO_REUSEADDR, (void *) &on, sizeof (on)); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: SO_REUSEADDR failed\n"); -      close (fd1); -      return NULL; -    } +	/* Bind socket to address structure */ +	ret = bind(async_server_sock, (struct sockaddr *)&myaddr_async, size); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: bind async socket failed\n"); +		close(async_server_sock); +		return NULL; +	} + +	/* Wait for reverse channel connection establishment from server */ +	ret = listen(async_server_sock, BACKLOG); +	if (ret < 0) { +		fprintf(stderr, "ospf_apiclient_connect: listen: %s\n", +			safe_strerror(errno)); +		close(async_server_sock); +		return NULL; +	} + +	/* Make connection for synchronous requests and connect to server */ +	/* Resolve address of server */ +	hp = gethostbyname(host); +	if (!hp) { +		fprintf(stderr, "ospf_apiclient_connect: no such host %s\n", +			host); +		close(async_server_sock); +		return NULL; +	} + +	fd1 = socket(AF_INET, SOCK_STREAM, 0); +	if (fd1 < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: creating sync socket failed\n"); +		return NULL; +	} + + +	/* Reuse addr and port */ +	ret = setsockopt(fd1, SOL_SOCKET, SO_REUSEADDR, (void *)&on, +			 sizeof(on)); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: SO_REUSEADDR failed\n"); +		close(fd1); +		return NULL; +	}  #ifdef SO_REUSEPORT -  ret = setsockopt (fd1, SOL_SOCKET, SO_REUSEPORT, -                    (void *) &on, sizeof (on)); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: SO_REUSEPORT failed\n"); -      close (fd1); -      return NULL; -    } +	ret = setsockopt(fd1, SOL_SOCKET, SO_REUSEPORT, (void *)&on, +			 sizeof(on)); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: SO_REUSEPORT failed\n"); +		close(fd1); +		return NULL; +	}  #endif /* SO_REUSEPORT */ -  /* Bind sync socket to address structure. This is needed since we -     want the sync port number on a fixed port number. The reverse -     async channel will be at this port+1 */ +	/* Bind sync socket to address structure. This is needed since we +	   want the sync port number on a fixed port number. The reverse +	   async channel will be at this port+1 */ -  memset (&myaddr_sync, 0, sizeof (struct sockaddr_in)); -  myaddr_sync.sin_family = AF_INET; -  myaddr_sync.sin_port = htons (syncport); +	memset(&myaddr_sync, 0, sizeof(struct sockaddr_in)); +	myaddr_sync.sin_family = AF_INET; +	myaddr_sync.sin_port = htons(syncport);  #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN -  myaddr_sync.sin_len = sizeof (struct sockaddr_in); +	myaddr_sync.sin_len = sizeof(struct sockaddr_in);  #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ -  ret = bind (fd1, (struct sockaddr *) &myaddr_sync, size); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: bind sync socket failed\n"); -      close (fd1); -      return NULL; -    } - -  /* Prepare address structure for connect */ -  memcpy (&myaddr_sync.sin_addr, hp->h_addr, hp->h_length); -  myaddr_sync.sin_family = AF_INET; -  myaddr_sync.sin_port = htons(ospf_apiclient_getport ()); +	ret = bind(fd1, (struct sockaddr *)&myaddr_sync, size); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: bind sync socket failed\n"); +		close(fd1); +		return NULL; +	} + +	/* Prepare address structure for connect */ +	memcpy(&myaddr_sync.sin_addr, hp->h_addr, hp->h_length); +	myaddr_sync.sin_family = AF_INET; +	myaddr_sync.sin_port = htons(ospf_apiclient_getport());  #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN -  myaddr_sync.sin_len = sizeof (struct sockaddr_in); +	myaddr_sync.sin_len = sizeof(struct sockaddr_in);  #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ -  /* Now establish synchronous channel with OSPF daemon */ -  ret = connect (fd1, (struct sockaddr *) &myaddr_sync, -		 sizeof (struct sockaddr_in)); -  if (ret < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: sync connect failed\n"); -      close (async_server_sock); -      close (fd1); -      return NULL; -    } - -  /* Accept reverse connection */ -  peeraddrlen = sizeof (struct sockaddr_in); -  memset (&peeraddr, 0, peeraddrlen); - -  fd2 = -    accept (async_server_sock, (struct sockaddr *) &peeraddr, &peeraddrlen); -  if (fd2 < 0) -    { -      fprintf (stderr, "ospf_apiclient_connect: accept async failed\n"); -      close (async_server_sock); -      close (fd1); -      return NULL; -    } - -  /* Server socket is not needed anymore since we are not accepting more  -     connections */ -  close (async_server_sock); - -  /* Create new client-side instance */ -  new = XCALLOC (MTYPE_OSPF_APICLIENT, sizeof (struct ospf_apiclient)); - -  /* Initialize socket descriptors for sync and async channels */ -  new->fd_sync = fd1; -  new->fd_async = fd2; - -  return new; +	/* Now establish synchronous channel with OSPF daemon */ +	ret = connect(fd1, (struct sockaddr *)&myaddr_sync, +		      sizeof(struct sockaddr_in)); +	if (ret < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: sync connect failed\n"); +		close(async_server_sock); +		close(fd1); +		return NULL; +	} + +	/* Accept reverse connection */ +	peeraddrlen = sizeof(struct sockaddr_in); +	memset(&peeraddr, 0, peeraddrlen); + +	fd2 = accept(async_server_sock, (struct sockaddr *)&peeraddr, +		     &peeraddrlen); +	if (fd2 < 0) { +		fprintf(stderr, +			"ospf_apiclient_connect: accept async failed\n"); +		close(async_server_sock); +		close(fd1); +		return NULL; +	} + +	/* Server socket is not needed anymore since we are not accepting more +	   connections */ +	close(async_server_sock); + +	/* Create new client-side instance */ +	new = XCALLOC(MTYPE_OSPF_APICLIENT, sizeof(struct ospf_apiclient)); + +	/* Initialize socket descriptors for sync and async channels */ +	new->fd_sync = fd1; +	new->fd_async = fd2; + +	return new;  } -int -ospf_apiclient_close (struct ospf_apiclient *oclient) +int ospf_apiclient_close(struct ospf_apiclient *oclient)  { -  if (oclient->fd_sync >= 0) -    { -      close (oclient->fd_sync); -    } +	if (oclient->fd_sync >= 0) { +		close(oclient->fd_sync); +	} -  if (oclient->fd_async >= 0) -    { -      close (oclient->fd_async); -    } +	if (oclient->fd_async >= 0) { +		close(oclient->fd_async); +	} -  /* Free client structure */ -  XFREE (MTYPE_OSPF_APICLIENT, oclient); -  return 0; +	/* Free client structure */ +	XFREE(MTYPE_OSPF_APICLIENT, oclient); +	return 0;  }  /* ----------------------------------------------------------- @@ -303,40 +296,39 @@ ospf_apiclient_close (struct ospf_apiclient *oclient)   */  /* Send synchronous request, wait for reply */ -static int -ospf_apiclient_send_request (struct ospf_apiclient *oclient, struct msg *msg) +static int ospf_apiclient_send_request(struct ospf_apiclient *oclient, +				       struct msg *msg)  { -  u_int32_t reqseq; -  struct msg_reply *msgreply; -  int rc; +	u_int32_t reqseq; +	struct msg_reply *msgreply; +	int rc; -  /* NB: Given "msg" is freed inside this function. */ +	/* NB: Given "msg" is freed inside this function. */ -  /* Remember the sequence number of the request */ -  reqseq = ntohl (msg->hdr.msgseq); +	/* Remember the sequence number of the request */ +	reqseq = ntohl(msg->hdr.msgseq); -  /* Write message to OSPFd */ -  rc = msg_write (oclient->fd_sync, msg); -  msg_free (msg); +	/* Write message to OSPFd */ +	rc = msg_write(oclient->fd_sync, msg); +	msg_free(msg); -  if (rc < 0) -    { -      return -1; -    } +	if (rc < 0) { +		return -1; +	} -  /* Wait for reply *//* NB: New "msg" is allocated by "msg_read()". */ -  msg = msg_read (oclient->fd_sync); -  if (!msg) -    return -1; +	/* Wait for reply */ /* NB: New "msg" is allocated by "msg_read()". */ +	msg = msg_read(oclient->fd_sync); +	if (!msg) +		return -1; -  assert (msg->hdr.msgtype == MSG_REPLY); -  assert (ntohl (msg->hdr.msgseq) == reqseq); +	assert(msg->hdr.msgtype == MSG_REPLY); +	assert(ntohl(msg->hdr.msgseq) == reqseq); -  msgreply = (struct msg_reply *) STREAM_DATA (msg->s); -  rc = msgreply->errcode; -  msg_free (msg); +	msgreply = (struct msg_reply *)STREAM_DATA(msg->s); +	rc = msgreply->errcode; +	msg_free(msg); -  return rc; +	return rc;  } @@ -345,23 +337,19 @@ ospf_apiclient_send_request (struct ospf_apiclient *oclient, struct msg *msg)   * -----------------------------------------------------------   */ -static u_int32_t -ospf_apiclient_get_seqnr (void) +static u_int32_t ospf_apiclient_get_seqnr(void)  { -  static u_int32_t seqnr = MIN_SEQ; -  u_int32_t tmp; - -  tmp = seqnr; -  /* Increment sequence number */ -  if (seqnr < MAX_SEQ) -    { -      seqnr++; -    } -  else -    { -      seqnr = MIN_SEQ; -    } -  return tmp; +	static u_int32_t seqnr = MIN_SEQ; +	u_int32_t tmp; + +	tmp = seqnr; +	/* Increment sequence number */ +	if (seqnr < MAX_SEQ) { +		seqnr++; +	} else { +		seqnr = MIN_SEQ; +	} +	return tmp;  }  /* ----------------------------------------------------------- @@ -372,141 +360,132 @@ ospf_apiclient_get_seqnr (void)  /*   * Synchronous request to register opaque type.   */ -int -ospf_apiclient_register_opaque_type (struct ospf_apiclient *cl, -				     u_char ltype, u_char otype) +int ospf_apiclient_register_opaque_type(struct ospf_apiclient *cl, u_char ltype, +					u_char otype)  { -  struct msg *msg; -  int rc; - -  /* just put 1 as a sequence number. */ -  msg = new_msg_register_opaque_type (ospf_apiclient_get_seqnr (), -				      ltype, otype); -  if (!msg) -    { -      fprintf (stderr, "new_msg_register_opaque_type failed\n"); -      return -1; -    } - -  rc = ospf_apiclient_send_request (cl, msg); -  return rc; +	struct msg *msg; +	int rc; + +	/* just put 1 as a sequence number. */ +	msg = new_msg_register_opaque_type(ospf_apiclient_get_seqnr(), ltype, +					   otype); +	if (!msg) { +		fprintf(stderr, "new_msg_register_opaque_type failed\n"); +		return -1; +	} + +	rc = ospf_apiclient_send_request(cl, msg); +	return rc;  } -/*  +/*   * Synchronous request to synchronize with OSPF's LSDB.   * Two steps required: register_event in order to get   * dynamic updates and LSDB_Sync.   */ -int -ospf_apiclient_sync_lsdb (struct ospf_apiclient *oclient) +int ospf_apiclient_sync_lsdb(struct ospf_apiclient *oclient)  { -  struct msg *msg; -  int rc; -  struct lsa_filter_type filter; - -  filter.typemask = 0xFFFF;	/* all LSAs */ -  filter.origin = ANY_ORIGIN; -  filter.num_areas = 0;		/* all Areas. */ - -  msg = new_msg_register_event (ospf_apiclient_get_seqnr (), &filter); -  if (!msg) -    { -      fprintf (stderr, "new_msg_register_event failed\n"); -      return -1; -    } -  rc = ospf_apiclient_send_request (oclient, msg); - -  if (rc != 0) -    goto out; - -  msg = new_msg_sync_lsdb (ospf_apiclient_get_seqnr (), &filter); -  if (!msg) -    { -      fprintf (stderr, "new_msg_sync_lsdb failed\n"); -      return -1; -    } -  rc = ospf_apiclient_send_request (oclient, msg); +	struct msg *msg; +	int rc; +	struct lsa_filter_type filter; + +	filter.typemask = 0xFFFF; /* all LSAs */ +	filter.origin = ANY_ORIGIN; +	filter.num_areas = 0; /* all Areas. */ + +	msg = new_msg_register_event(ospf_apiclient_get_seqnr(), &filter); +	if (!msg) { +		fprintf(stderr, "new_msg_register_event failed\n"); +		return -1; +	} +	rc = ospf_apiclient_send_request(oclient, msg); + +	if (rc != 0) +		goto out; + +	msg = new_msg_sync_lsdb(ospf_apiclient_get_seqnr(), &filter); +	if (!msg) { +		fprintf(stderr, "new_msg_sync_lsdb failed\n"); +		return -1; +	} +	rc = ospf_apiclient_send_request(oclient, msg);  out: -  return rc; +	return rc;  } -/*  +/*   * Synchronous request to originate or update an LSA.   */ -int -ospf_apiclient_lsa_originate (struct ospf_apiclient *oclient, -			      struct in_addr ifaddr, -			      struct in_addr area_id, -			      u_char lsa_type, -			      u_char opaque_type, u_int32_t opaque_id, -			      void *opaquedata, int opaquelen) +int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient, +				 struct in_addr ifaddr, struct in_addr area_id, +				 u_char lsa_type, u_char opaque_type, +				 u_int32_t opaque_id, void *opaquedata, +				 int opaquelen)  { -  struct msg *msg; -  int rc; -  u_char buf[OSPF_MAX_LSA_SIZE]; -  struct lsa_header *lsah; -  u_int32_t tmp; - - -  /* We can only originate opaque LSAs */ -  if (!IS_OPAQUE_LSA (lsa_type)) -    { -      fprintf (stderr, "Cannot originate non-opaque LSA type %d\n", lsa_type); -      return OSPF_API_ILLEGALLSATYPE; -    } - -  /* Make a new LSA from parameters */ -  lsah = (struct lsa_header *) buf; -  lsah->ls_age = 0; -  lsah->options = 0; -  lsah->type = lsa_type; - -  tmp = SET_OPAQUE_LSID (opaque_type, opaque_id); -  lsah->id.s_addr = htonl (tmp); -  lsah->adv_router.s_addr = 0; -  lsah->ls_seqnum = 0; -  lsah->checksum = 0; -  lsah->length = htons (sizeof (struct lsa_header) + opaquelen); - -  memcpy (((u_char *) lsah) + sizeof (struct lsa_header), opaquedata, -	  opaquelen); - -  msg = new_msg_originate_request (ospf_apiclient_get_seqnr (), -				   ifaddr, area_id, lsah); -  if (!msg) -    { -      fprintf (stderr, "new_msg_originate_request failed\n"); -      return OSPF_API_NOMEMORY; -    } - -  rc = ospf_apiclient_send_request (oclient, msg); -  return rc; +	struct msg *msg; +	int rc; +	u_char buf[OSPF_MAX_LSA_SIZE]; +	struct lsa_header *lsah; +	u_int32_t tmp; + + +	/* We can only originate opaque LSAs */ +	if (!IS_OPAQUE_LSA(lsa_type)) { +		fprintf(stderr, "Cannot originate non-opaque LSA type %d\n", +			lsa_type); +		return OSPF_API_ILLEGALLSATYPE; +	} + +	/* Make a new LSA from parameters */ +	lsah = (struct lsa_header *)buf; +	lsah->ls_age = 0; +	lsah->options = 0; +	lsah->type = lsa_type; + +	tmp = SET_OPAQUE_LSID(opaque_type, opaque_id); +	lsah->id.s_addr = htonl(tmp); +	lsah->adv_router.s_addr = 0; +	lsah->ls_seqnum = 0; +	lsah->checksum = 0; +	lsah->length = htons(sizeof(struct lsa_header) + opaquelen); + +	memcpy(((u_char *)lsah) + sizeof(struct lsa_header), opaquedata, +	       opaquelen); + +	msg = new_msg_originate_request(ospf_apiclient_get_seqnr(), ifaddr, +					area_id, lsah); +	if (!msg) { +		fprintf(stderr, "new_msg_originate_request failed\n"); +		return OSPF_API_NOMEMORY; +	} + +	rc = ospf_apiclient_send_request(oclient, msg); +	return rc;  } -int -ospf_apiclient_lsa_delete (struct ospf_apiclient *oclient, -			   struct in_addr area_id, u_char lsa_type, -			   u_char opaque_type, u_int32_t opaque_id) +int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient, +			      struct in_addr area_id, u_char lsa_type, +			      u_char opaque_type, u_int32_t opaque_id)  { -  struct msg *msg; -  int rc; - -  /* Only opaque LSA can be deleted */ -  if (!IS_OPAQUE_LSA (lsa_type)) -    { -      fprintf (stderr, "Cannot delete non-opaque LSA type %d\n", lsa_type); -      return OSPF_API_ILLEGALLSATYPE; -    } - -  /* opaque_id is in host byte order and will be converted -   * to network byte order by new_msg_delete_request */ -  msg = new_msg_delete_request (ospf_apiclient_get_seqnr (), -				area_id, lsa_type, opaque_type, opaque_id); - -  rc = ospf_apiclient_send_request (oclient, msg); -  return rc; +	struct msg *msg; +	int rc; + +	/* Only opaque LSA can be deleted */ +	if (!IS_OPAQUE_LSA(lsa_type)) { +		fprintf(stderr, "Cannot delete non-opaque LSA type %d\n", +			lsa_type); +		return OSPF_API_ILLEGALLSATYPE; +	} + +	/* opaque_id is in host byte order and will be converted +	 * to network byte order by new_msg_delete_request */ +	msg = new_msg_delete_request(ospf_apiclient_get_seqnr(), area_id, +				     lsa_type, opaque_type, opaque_id); + +	rc = ospf_apiclient_send_request(oclient, msg); +	return rc;  }  /* ----------------------------------------------------------- @@ -514,168 +493,155 @@ ospf_apiclient_lsa_delete (struct ospf_apiclient *oclient,   * -----------------------------------------------------------   */ -static void -ospf_apiclient_handle_ready (struct ospf_apiclient *oclient, struct msg *msg) +static void ospf_apiclient_handle_ready(struct ospf_apiclient *oclient, +					struct msg *msg)  { -  struct msg_ready_notify *r; -  r = (struct msg_ready_notify *) STREAM_DATA (msg->s); - -  /* Invoke registered callback function. */ -  if (oclient->ready_notify) -    { -      (oclient->ready_notify) (r->lsa_type, r->opaque_type, r->addr); -    } +	struct msg_ready_notify *r; +	r = (struct msg_ready_notify *)STREAM_DATA(msg->s); + +	/* Invoke registered callback function. */ +	if (oclient->ready_notify) { +		(oclient->ready_notify)(r->lsa_type, r->opaque_type, r->addr); +	}  } -static void -ospf_apiclient_handle_new_if (struct ospf_apiclient *oclient, struct msg *msg) +static void ospf_apiclient_handle_new_if(struct ospf_apiclient *oclient, +					 struct msg *msg)  { -  struct msg_new_if *n; -  n = (struct msg_new_if *) STREAM_DATA (msg->s); - -  /* Invoke registered callback function. */ -  if (oclient->new_if) -    { -      (oclient->new_if) (n->ifaddr, n->area_id); -    } +	struct msg_new_if *n; +	n = (struct msg_new_if *)STREAM_DATA(msg->s); + +	/* Invoke registered callback function. */ +	if (oclient->new_if) { +		(oclient->new_if)(n->ifaddr, n->area_id); +	}  } -static void -ospf_apiclient_handle_del_if (struct ospf_apiclient *oclient, struct msg *msg) +static void ospf_apiclient_handle_del_if(struct ospf_apiclient *oclient, +					 struct msg *msg)  { -  struct msg_del_if *d; -  d = (struct msg_del_if *) STREAM_DATA (msg->s); - -  /* Invoke registered callback function. */ -  if (oclient->del_if) -    { -      (oclient->del_if) (d->ifaddr); -    } +	struct msg_del_if *d; +	d = (struct msg_del_if *)STREAM_DATA(msg->s); + +	/* Invoke registered callback function. */ +	if (oclient->del_if) { +		(oclient->del_if)(d->ifaddr); +	}  } -static void -ospf_apiclient_handle_ism_change (struct ospf_apiclient *oclient, -				  struct msg *msg) +static void ospf_apiclient_handle_ism_change(struct ospf_apiclient *oclient, +					     struct msg *msg)  { -  struct msg_ism_change *m; -  m = (struct msg_ism_change *) STREAM_DATA (msg->s); - -  /* Invoke registered callback function. */ -  if (oclient->ism_change) -    { -      (oclient->ism_change) (m->ifaddr, m->area_id, m->status); -    } +	struct msg_ism_change *m; +	m = (struct msg_ism_change *)STREAM_DATA(msg->s); +	/* Invoke registered callback function. */ +	if (oclient->ism_change) { +		(oclient->ism_change)(m->ifaddr, m->area_id, m->status); +	}  } -static void -ospf_apiclient_handle_nsm_change (struct ospf_apiclient *oclient, -				  struct msg *msg) +static void ospf_apiclient_handle_nsm_change(struct ospf_apiclient *oclient, +					     struct msg *msg)  { -  struct msg_nsm_change *m; -  m = (struct msg_nsm_change *) STREAM_DATA (msg->s); - -  /* Invoke registered callback function. */ -  if (oclient->nsm_change) -    { -      (oclient->nsm_change) (m->ifaddr, m->nbraddr, m->router_id, m->status); -    } +	struct msg_nsm_change *m; +	m = (struct msg_nsm_change *)STREAM_DATA(msg->s); + +	/* Invoke registered callback function. */ +	if (oclient->nsm_change) { +		(oclient->nsm_change)(m->ifaddr, m->nbraddr, m->router_id, +				      m->status); +	}  } -static void -ospf_apiclient_handle_lsa_update (struct ospf_apiclient *oclient, -				  struct msg *msg) +static void ospf_apiclient_handle_lsa_update(struct ospf_apiclient *oclient, +					     struct msg *msg)  { -  struct msg_lsa_change_notify *cn; -  struct lsa_header *lsa; -  int lsalen; - -  cn = (struct msg_lsa_change_notify *) STREAM_DATA (msg->s); - -  /* Extract LSA from message */ -  lsalen = ntohs (cn->data.length); -  lsa = XMALLOC (MTYPE_OSPF_APICLIENT, lsalen); -  if (!lsa) -    { -      fprintf (stderr, "LSA update: Cannot allocate memory for LSA\n"); -      return; -    } -  memcpy (lsa, &(cn->data), lsalen); - -  /* Invoke registered update callback function */ -  if (oclient->update_notify) -    { -      (oclient->update_notify) (cn->ifaddr, cn->area_id,  -				cn->is_self_originated, lsa); -    } - -  /* free memory allocated by ospf apiclient library */ -  XFREE (MTYPE_OSPF_APICLIENT, lsa); +	struct msg_lsa_change_notify *cn; +	struct lsa_header *lsa; +	int lsalen; + +	cn = (struct msg_lsa_change_notify *)STREAM_DATA(msg->s); + +	/* Extract LSA from message */ +	lsalen = ntohs(cn->data.length); +	lsa = XMALLOC(MTYPE_OSPF_APICLIENT, lsalen); +	if (!lsa) { +		fprintf(stderr, "LSA update: Cannot allocate memory for LSA\n"); +		return; +	} +	memcpy(lsa, &(cn->data), lsalen); + +	/* Invoke registered update callback function */ +	if (oclient->update_notify) { +		(oclient->update_notify)(cn->ifaddr, cn->area_id, +					 cn->is_self_originated, lsa); +	} + +	/* free memory allocated by ospf apiclient library */ +	XFREE(MTYPE_OSPF_APICLIENT, lsa);  } -static void -ospf_apiclient_handle_lsa_delete (struct ospf_apiclient *oclient, -				  struct msg *msg) +static void ospf_apiclient_handle_lsa_delete(struct ospf_apiclient *oclient, +					     struct msg *msg)  { -  struct msg_lsa_change_notify *cn; -  struct lsa_header *lsa; -  int lsalen; - -  cn = (struct msg_lsa_change_notify *) STREAM_DATA (msg->s); - -  /* Extract LSA from message */ -  lsalen = ntohs (cn->data.length); -  lsa = XMALLOC (MTYPE_OSPF_APICLIENT, lsalen); -  if (!lsa) -    { -      fprintf (stderr, "LSA delete: Cannot allocate memory for LSA\n"); -      return; -    } -  memcpy (lsa, &(cn->data), lsalen); - -  /* Invoke registered update callback function */ -  if (oclient->delete_notify) -    { -      (oclient->delete_notify) (cn->ifaddr, cn->area_id,  -				cn->is_self_originated, lsa); -    } - -  /* free memory allocated by ospf apiclient library */ -  XFREE (MTYPE_OSPF_APICLIENT, lsa); +	struct msg_lsa_change_notify *cn; +	struct lsa_header *lsa; +	int lsalen; + +	cn = (struct msg_lsa_change_notify *)STREAM_DATA(msg->s); + +	/* Extract LSA from message */ +	lsalen = ntohs(cn->data.length); +	lsa = XMALLOC(MTYPE_OSPF_APICLIENT, lsalen); +	if (!lsa) { +		fprintf(stderr, "LSA delete: Cannot allocate memory for LSA\n"); +		return; +	} +	memcpy(lsa, &(cn->data), lsalen); + +	/* Invoke registered update callback function */ +	if (oclient->delete_notify) { +		(oclient->delete_notify)(cn->ifaddr, cn->area_id, +					 cn->is_self_originated, lsa); +	} + +	/* free memory allocated by ospf apiclient library */ +	XFREE(MTYPE_OSPF_APICLIENT, lsa);  } -static void -ospf_apiclient_msghandle (struct ospf_apiclient *oclient, struct msg *msg) +static void ospf_apiclient_msghandle(struct ospf_apiclient *oclient, +				     struct msg *msg)  { -  /* Call message handler function. */ -  switch (msg->hdr.msgtype) -    { -    case MSG_READY_NOTIFY: -      ospf_apiclient_handle_ready (oclient, msg); -      break; -    case MSG_NEW_IF: -      ospf_apiclient_handle_new_if (oclient, msg); -      break; -    case MSG_DEL_IF: -      ospf_apiclient_handle_del_if (oclient, msg); -      break; -    case MSG_ISM_CHANGE: -      ospf_apiclient_handle_ism_change (oclient, msg); -      break; -    case MSG_NSM_CHANGE: -      ospf_apiclient_handle_nsm_change (oclient, msg); -      break; -    case MSG_LSA_UPDATE_NOTIFY: -      ospf_apiclient_handle_lsa_update (oclient, msg); -      break; -    case MSG_LSA_DELETE_NOTIFY: -      ospf_apiclient_handle_lsa_delete (oclient, msg); -      break; -    default: -      fprintf (stderr, "ospf_apiclient_read: Unknown message type: %d\n", -	       msg->hdr.msgtype); -      break; -    } +	/* Call message handler function. */ +	switch (msg->hdr.msgtype) { +	case MSG_READY_NOTIFY: +		ospf_apiclient_handle_ready(oclient, msg); +		break; +	case MSG_NEW_IF: +		ospf_apiclient_handle_new_if(oclient, msg); +		break; +	case MSG_DEL_IF: +		ospf_apiclient_handle_del_if(oclient, msg); +		break; +	case MSG_ISM_CHANGE: +		ospf_apiclient_handle_ism_change(oclient, msg); +		break; +	case MSG_NSM_CHANGE: +		ospf_apiclient_handle_nsm_change(oclient, msg); +		break; +	case MSG_LSA_UPDATE_NOTIFY: +		ospf_apiclient_handle_lsa_update(oclient, msg); +		break; +	case MSG_LSA_DELETE_NOTIFY: +		ospf_apiclient_handle_lsa_delete(oclient, msg); +		break; +	default: +		fprintf(stderr, +			"ospf_apiclient_read: Unknown message type: %d\n", +			msg->hdr.msgtype); +		break; +	}  }  /* ----------------------------------------------------------- @@ -683,48 +649,32 @@ ospf_apiclient_msghandle (struct ospf_apiclient *oclient, struct msg *msg)   * -----------------------------------------------------------   */ -void -ospf_apiclient_register_callback (struct ospf_apiclient *oclient, -				  void (*ready_notify) (u_char lsa_type, -							u_char opaque_type, -							struct in_addr addr), -				  void (*new_if) (struct in_addr ifaddr, -						  struct in_addr area_id), -				  void (*del_if) (struct in_addr ifaddr), -				  void (*ism_change) (struct in_addr ifaddr, -						      struct in_addr area_id, -						      u_char status), -				  void (*nsm_change) (struct in_addr ifaddr, -						      struct in_addr nbraddr, -						      struct in_addr -						      router_id, -						      u_char status), -				  void (*update_notify) (struct in_addr -							 ifaddr, -							 struct in_addr -							 area_id, -							 u_char self_origin, -							 struct lsa_header * -							 lsa), -				  void (*delete_notify) (struct in_addr -							 ifaddr, -							 struct in_addr -							 area_id, -							 u_char self_origin, -							 struct lsa_header * -							 lsa)) +void ospf_apiclient_register_callback( +	struct ospf_apiclient *oclient, +	void (*ready_notify)(u_char lsa_type, u_char opaque_type, +			     struct in_addr addr), +	void (*new_if)(struct in_addr ifaddr, struct in_addr area_id), +	void (*del_if)(struct in_addr ifaddr), +	void (*ism_change)(struct in_addr ifaddr, struct in_addr area_id, +			   u_char status), +	void (*nsm_change)(struct in_addr ifaddr, struct in_addr nbraddr, +			   struct in_addr router_id, u_char status), +	void (*update_notify)(struct in_addr ifaddr, struct in_addr area_id, +			      u_char self_origin, struct lsa_header *lsa), +	void (*delete_notify)(struct in_addr ifaddr, struct in_addr area_id, +			      u_char self_origin, struct lsa_header *lsa))  { -  assert (oclient); -  assert (update_notify); - -  /* Register callback function */ -  oclient->ready_notify = ready_notify; -  oclient->new_if = new_if; -  oclient->del_if = del_if; -  oclient->ism_change = ism_change; -  oclient->nsm_change = nsm_change; -  oclient->update_notify = update_notify; -  oclient->delete_notify = delete_notify; +	assert(oclient); +	assert(update_notify); + +	/* Register callback function */ +	oclient->ready_notify = ready_notify; +	oclient->new_if = new_if; +	oclient->del_if = del_if; +	oclient->ism_change = ism_change; +	oclient->nsm_change = nsm_change; +	oclient->update_notify = update_notify; +	oclient->delete_notify = delete_notify;  }  /* ----------------------------------------------------------- @@ -732,25 +682,23 @@ ospf_apiclient_register_callback (struct ospf_apiclient *oclient,   * -----------------------------------------------------------   */ -int -ospf_apiclient_handle_async (struct ospf_apiclient *oclient) +int ospf_apiclient_handle_async(struct ospf_apiclient *oclient)  { -  struct msg *msg; +	struct msg *msg; -  /* Get a message */ -  msg = msg_read (oclient->fd_async); +	/* Get a message */ +	msg = msg_read(oclient->fd_async); -  if (!msg) -    { -      /* Connection broke down */ -      return -1; -    } +	if (!msg) { +		/* Connection broke down */ +		return -1; +	} -  /* Handle message */ -  ospf_apiclient_msghandle (oclient, msg); +	/* Handle message */ +	ospf_apiclient_msghandle(oclient, msg); -  /* Don't forget to free this message */ -  msg_free (msg); +	/* Don't forget to free this message */ +	msg_free(msg); -  return 0; +	return 0;  }  | 
