From e6f5d45855b4a8091b52b3fc91451d2d132a5a6d Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Mon, 27 Feb 2017 22:59:52 +0100 Subject: lib: Split CACEP into request/response protocol --- src/ipcpd/normal/cdap_flow.c | 48 ++++++++++++++++++++++++++++++++++++++++---- src/ipcpd/normal/gam.c | 43 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 84 insertions(+), 7 deletions(-) (limited to 'src/ipcpd/normal') diff --git a/src/ipcpd/normal/cdap_flow.c b/src/ipcpd/normal/cdap_flow.c index d3d98884..c694e637 100644 --- a/src/ipcpd/normal/cdap_flow.c +++ b/src/ipcpd/normal/cdap_flow.c @@ -67,12 +67,32 @@ struct cdap_flow * cdap_flow_arr(int fd, flow->fd = fd; flow->ci = NULL; - if (cacep_listen(fd, info, &flow->info)) { + if (cacep_rcv(fd, &flow->info)) { log_err("Error establishing application connection."); cdap_flow_destroy(flow); return NULL; } + if (cacep_snd(fd, info)) { + log_err("Failed to respond to application connection request."); + cdap_flow_destroy(flow); + return NULL; + } + + if (strcmp(flow->info.ae_name, info->ae_name)) { + log_err("Received connection for wrong AE."); + cdap_flow_destroy(flow); + return NULL; + } + + if (strcmp(flow->info.protocol, info->protocol) || + flow->info.pref_version != info->pref_version || + flow->info.pref_syntax != info->pref_syntax) { + log_err("Unknown protocol."); + cdap_flow_destroy(flow); + return NULL; + } + flow->ci = cdap_create(fd); if (flow->ci == NULL) { log_err("Failed to create CDAP instance."); @@ -87,8 +107,8 @@ struct cdap_flow * cdap_flow_alloc(const char * dst_name, qosspec_t * qs, const struct conn_info * info) { - struct cdap_flow * flow; - int fd; + struct cdap_flow * flow; + int fd; log_dbg("Allocating flow to %s.", dst_name); @@ -120,12 +140,32 @@ struct cdap_flow * cdap_flow_alloc(const char * dst_name, flow->fd = fd; flow->ci = NULL; - if (cacep_connect(fd, info, &flow->info)) { + if (cacep_snd(fd, info)) { + log_err("Failed to send connection request."); + cdap_flow_dealloc(flow); + return NULL; + } + + if (cacep_rcv(fd, &flow->info)) { log_err("Failed to connect to application."); cdap_flow_dealloc(flow); return NULL; } + if (strcmp(flow->info.ae_name, info->ae_name)) { + log_err("Received connection for wrong AE."); + cdap_flow_destroy(flow); + return NULL; + } + + if (strcmp(flow->info.protocol, info->protocol) || + flow->info.pref_version != info->pref_version || + flow->info.pref_syntax != info->pref_syntax) { + log_err("Unknown protocol."); + cdap_flow_destroy(flow); + return NULL; + } + flow->ci = cdap_create(fd); if (flow->ci == NULL) { log_err("Failed to create CDAP instance."); diff --git a/src/ipcpd/normal/gam.c b/src/ipcpd/normal/gam.c index bdfc8cb9..f98c0d4f 100644 --- a/src/ipcpd/normal/gam.c +++ b/src/ipcpd/normal/gam.c @@ -187,8 +187,30 @@ int gam_flow_arr(struct gam * instance, snd_info.pref_syntax = PROTO_GPB; snd_info.ae.addr = ipcpi.address; - if (cacep_listen(fd, &snd_info, rcv_info)) { - log_err("Failed to create application connection."); + if (cacep_rcv(fd, rcv_info)) { + log_err("Error establishing application connection."); + flow_dealloc(fd); + free(rcv_info); + return -1; + } + + if (cacep_snd(fd, &snd_info)) { + log_err("Failed to respond to application connection request."); + flow_dealloc(fd); + free(rcv_info); + return -1; + } + + if (strcmp(snd_info.ae_name, rcv_info->ae_name)) { + log_err("Received connection for wrong AE."); + flow_dealloc(fd); + free(rcv_info); + return -1; + } + + if (strcmp(snd_info.protocol, rcv_info->protocol) || + snd_info.pref_version != rcv_info->pref_version || + snd_info.pref_syntax != rcv_info->pref_syntax) { flow_dealloc(fd); free(rcv_info); return -1; @@ -246,13 +268,28 @@ int gam_flow_alloc(struct gam * instance, snd_info.pref_syntax = PROTO_GPB; snd_info.ae.addr = ipcpi.address; - if (cacep_connect(fd, &snd_info, rcv_info)) { + if (cacep_snd(fd, &snd_info)) { log_err("Failed to create application connection."); flow_dealloc(fd); free(rcv_info); return -1; } + if (cacep_rcv(fd, rcv_info)) { + log_err("Failed to connect to application."); + flow_dealloc(fd); + free(rcv_info); + return -1; + } + + if (strcmp(snd_info.protocol, rcv_info->protocol) || + snd_info.pref_version != rcv_info->pref_version || + snd_info.pref_syntax != rcv_info->pref_syntax) { + flow_dealloc(fd); + free(rcv_info); + return -1; + } + if (instance->ops->accept_flow(instance->ops_o, qs, rcv_info)) { flow_dealloc(fd); free(rcv_info); -- cgit v1.2.3