diff options
author | dimitri staessens <[email protected]> | 2017-02-27 22:59:52 +0100 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2017-02-28 14:48:16 +0100 |
commit | e6f5d45855b4a8091b52b3fc91451d2d132a5a6d (patch) | |
tree | c69603a29712665f3c7e8ee4e90d7209d61d3d85 /src/ipcpd/normal/gam.c | |
parent | d06cb62e111be1ac3f09398ae559f99e4833b4bf (diff) | |
download | ouroboros-e6f5d45855b4a8091b52b3fc91451d2d132a5a6d.tar.gz ouroboros-e6f5d45855b4a8091b52b3fc91451d2d132a5a6d.zip |
lib: Split CACEP into request/response protocol
Diffstat (limited to 'src/ipcpd/normal/gam.c')
-rw-r--r-- | src/ipcpd/normal/gam.c | 43 |
1 files changed, 40 insertions, 3 deletions
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); |