diff options
| author | Sander Vrijders <sander.vrijders@ugent.be> | 2017-09-18 19:06:15 +0200 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@ugent.be> | 2017-09-19 16:52:54 +0200 | 
| commit | 541b1c5eeb5fe9f9aaa4aa6487852e5c59761139 (patch) | |
| tree | a5817c5bd030b8a07713dcaa7dde95edbd0392d2 /src/ipcpd/normal | |
| parent | 669a8d4edfcc0fb2a7cd6f93e0ad2d0de820371a (diff) | |
| download | ouroboros-541b1c5eeb5fe9f9aaa4aa6487852e5c59761139.tar.gz ouroboros-541b1c5eeb5fe9f9aaa4aa6487852e5c59761139.zip | |
ipcpd, lib: Add flow down events
This adds the flow down event to Ouroboros. In the shim-eth-llc, a
netlink socket is opened which listens to device up/down events. For
each event the flow is then adjusted with fccntl to notify the user
the flow is down or back up again. In the normal IPCP an event is
thrown if a write reports that the flow is down.
Diffstat (limited to 'src/ipcpd/normal')
| -rw-r--r-- | src/ipcpd/normal/connmgr.h | 14 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt.c | 12 | 
2 files changed, 18 insertions, 8 deletions
| diff --git a/src/ipcpd/normal/connmgr.h b/src/ipcpd/normal/connmgr.h index ca5288ae..a8edee7d 100644 --- a/src/ipcpd/normal/connmgr.h +++ b/src/ipcpd/normal/connmgr.h @@ -28,12 +28,14 @@  #include "ae.h" -#define NOTIFY_DT_CONN_ADD   0x00D0 -#define NOTIFY_DT_CONN_DEL   0x00D1 -#define NOTIFY_DT_CONN_QOS   0x00D2 - -#define NOTIFY_MGMT_CONN_ADD 0x00F0 -#define NOTIFY_MGMT_CONN_DEL 0x00F1 +#define NOTIFY_DT_CONN_ADD    0x00D0 +#define NOTIFY_DT_CONN_DEL    0x00D1 +#define NOTIFY_DT_CONN_QOS    0x00D2 +#define NOTIFY_DT_CONN_DOWN   0x00D3 + +#define NOTIFY_MGMT_CONN_ADD  0x00F0 +#define NOTIFY_MGMT_CONN_DEL  0x00F1 +#define NOTIFY_MGMT_CONN_DOWN 0x00F2  int         connmgr_init(void); diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index 2df17163..56cb5a61 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -93,6 +93,7 @@ static void sdu_handler(int                  fd,                          struct shm_du_buff * sdb)  {          struct dt_pci dt_pci; +        int           ret;          memset(&dt_pci, 0, sizeof(dt_pci)); @@ -112,8 +113,11 @@ static void sdu_handler(int                  fd,                          return;                  } -                if (ipcp_flow_write(fd, sdb)) { +                ret = ipcp_flow_write(fd, sdb); +                if (ret < 0) {                          log_err("Failed to write SDU to fd %d.", fd); +                        if (ret == -EFLOWDOWN) +                                notifier_event(NOTIFY_DT_CONN_DOWN, &fd);                          ipcp_sdb_release(sdb);                          return;                  } @@ -323,6 +327,7 @@ int dt_write_sdu(uint64_t             dst_addr,  {          int           fd;          struct dt_pci dt_pci; +        int           ret;          assert(sdb);          assert(dst_addr != ipcpi.dt_addr); @@ -342,8 +347,11 @@ int dt_write_sdu(uint64_t             dst_addr,                  return -1;          } -        if (ipcp_flow_write(fd, sdb)) { +        ret = ipcp_flow_write(fd, sdb); +        if (ret < 0) {                  log_err("Failed to write SDU to fd %d.", fd); +                if (ret == -EFLOWDOWN) +                        notifier_event(NOTIFY_DT_CONN_DOWN, &fd);                  return -1;          } | 
