summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/fmgr.c
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2017-03-27 11:53:20 +0200
committerSander Vrijders <[email protected]>2017-03-28 10:25:46 +0200
commit9e3dffb25570fc12dd43f8fad721be40374ea35b (patch)
tree9865b01cd1d946e4657ce3d459440ea15bcc3bc8 /src/ipcpd/normal/fmgr.c
parent8fd39fd9e1cc65147a6f1a3fa5027c9ab2cb4a68 (diff)
downloadouroboros-9e3dffb25570fc12dd43f8fad721be40374ea35b.tar.gz
ouroboros-9e3dffb25570fc12dd43f8fad721be40374ea35b.zip
ipcpd: normal: Fix locking of PFF
This adds fixes the locking of the PFF which was externalized, but not yet correctly updated within the PFF component itself and within the flow manager.
Diffstat (limited to 'src/ipcpd/normal/fmgr.c')
-rw-r--r--src/ipcpd/normal/fmgr.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c
index a8a9ba58..f78d390a 100644
--- a/src/ipcpd/normal/fmgr.c
+++ b/src/ipcpd/normal/fmgr.c
@@ -198,13 +198,16 @@ void * fmgr_nm1_sdu_reader(void * o)
continue;
}
+ pff_lock(fmgr.pff[i]);
fd = pff_nhop(fmgr.pff[i], pci.dst_addr);
if (fd < 0) {
+ pff_unlock(fmgr.pff[i]);
log_err("No next hop for %lu",
pci.dst_addr);
ipcp_flow_del(sdb);
continue;
}
+ pff_unlock(fmgr.pff[i]);
if (ipcp_flow_write(fd, sdb)) {
log_err("Failed to write SDU to fd %d.",
@@ -689,12 +692,15 @@ int fmgr_nm1_write_sdu(struct pci * pci,
if (pci == NULL || sdb == NULL)
return -EINVAL;
+ pff_lock(fmgr.pff[pci->qos_id]);
fd = pff_nhop(fmgr.pff[pci->qos_id], pci->dst_addr);
if (fd < 0) {
+ pff_unlock(fmgr.pff[pci->qos_id]);
log_err("Could not get nhop for address %lu", pci->dst_addr);
ipcp_flow_del(sdb);
return -1;
}
+ pff_unlock(fmgr.pff[pci->qos_id]);
if (shm_pci_ser(sdb, pci)) {
log_err("Failed to serialize PDU.");
@@ -720,11 +726,14 @@ int fmgr_nm1_write_buf(struct pci * pci,
if (pci == NULL || buf == NULL || buf->data == NULL)
return -EINVAL;
+ pff_lock(fmgr.pff[pci->qos_id]);
fd = pff_nhop(fmgr.pff[pci->qos_id], pci->dst_addr);
if (fd < 0) {
+ pff_unlock(fmgr.pff[pci->qos_id]);
log_err("Could not get nhop for address %lu", pci->dst_addr);
return -1;
}
+ pff_unlock(fmgr.pff[pci->qos_id]);
buffer = shm_pci_ser_buf(buf, pci);
if (buffer == NULL) {