diff options
| author | Sander Vrijders <sander.vrijders@ugent.be> | 2017-09-20 13:56:17 +0200 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@ugent.be> | 2017-09-20 14:16:34 +0200 | 
| commit | 2c7e3030edb84abae14042f7a1a22b44255324be (patch) | |
| tree | db0bb53b7627066ba44cc1f9f429e11d1fa7bf65 /src/ipcpd/normal/pol | |
| parent | f9fd352f38c3c3d9e7824b8cf84b8f86e2a6d392 (diff) | |
| download | ouroboros-2c7e3030edb84abae14042f7a1a22b44255324be.tar.gz ouroboros-2c7e3030edb84abae14042f7a1a22b44255324be.zip | |
ipcpd: normal: Make PFF policy-based
This turns the PDU Forwarding Function of the IPCP into a policy. For
now only the simple PFF policy is available.
Diffstat (limited to 'src/ipcpd/normal/pol')
| -rw-r--r-- | src/ipcpd/normal/pol/flat.c | 7 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/flat.h | 6 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/link_state.c | 2 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/simple_pff.c | 183 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/simple_pff.h | 57 | 
5 files changed, 249 insertions, 6 deletions
| diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index 0c4648c5..c52ebe38 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -30,6 +30,7 @@  #include <ouroboros/utils.h>  #include "ipcp.h" +#include "flat.h"  #include <time.h>  #include <stdlib.h> @@ -46,6 +47,12 @@ struct {  #define INVALID_ADDRESS 0 +struct pol_addr_auth_ops flat_ops = { +        .init    = flat_init, +        .fini    = flat_fini, +        .address = flat_address +}; +  int flat_init(const void * info)  {          flat.addr_size = *((uint8_t *) info); diff --git a/src/ipcpd/normal/pol/flat.h b/src/ipcpd/normal/pol/flat.h index 57af591e..fdd06d68 100644 --- a/src/ipcpd/normal/pol/flat.h +++ b/src/ipcpd/normal/pol/flat.h @@ -31,10 +31,6 @@ int      flat_fini(void);  uint64_t flat_address(void); -struct pol_addr_auth_ops flat_ops = { -        .init    = flat_init, -        .fini    = flat_fini, -        .address = flat_address -}; +struct pol_addr_auth_ops flat_ops;  #endif /* OUROBOROS_IPCPD_NORMAL_FLAT_H */ diff --git a/src/ipcpd/normal/pol/link_state.c b/src/ipcpd/normal/pol/link_state.c index 2823f28e..26370682 100644 --- a/src/ipcpd/normal/pol/link_state.c +++ b/src/ipcpd/normal/pol/link_state.c @@ -404,7 +404,7 @@ static void * calculate_pff(void * o)                          if (fd == -1)                                  continue; -                        pff_add(instance->pff, table[i]->dst, fd); +                        pff_add(instance->pff, table[i]->dst, &fd, 1);                  }                  pff_unlock(instance->pff); diff --git a/src/ipcpd/normal/pol/simple_pff.c b/src/ipcpd/normal/pol/simple_pff.c new file mode 100644 index 00000000..28f7aa2e --- /dev/null +++ b/src/ipcpd/normal/pol/simple_pff.c @@ -0,0 +1,183 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * Simple PDU Forwarding Function + * + *    Dimitri Staessens <dimitri.staessens@ugent.be> + *    Sander Vrijders   <sander.vrijders@ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., http://www.fsf.org/about/contact/. + */ + +#define _POSIX_C_SOURCE 200112L + +#include "config.h" + +#include <ouroboros/hashtable.h> +#include <ouroboros/errno.h> + +#include <assert.h> +#include <pthread.h> + +#include "simple_pff.h" + +struct pff_i { +        struct htable *  table; +        pthread_rwlock_t lock; +}; + +struct pol_pff_ops simple_pff_ops = { +        .create            = simple_pff_create, +        .destroy           = simple_pff_destroy, +        .lock              = simple_pff_lock, +        .unlock            = simple_pff_unlock, +        .add               = simple_pff_add, +        .update            = simple_pff_update, +        .del               = simple_pff_del, +        .flush             = simple_pff_flush, +        .nhop              = simple_pff_nhop, +        .flow_state_change = NULL +}; + +struct pff_i * simple_pff_create(void) +{ +        struct pff_i * tmp; + +        tmp = malloc(sizeof(*tmp)); +        if (tmp == NULL) +                return NULL; + +        if (pthread_rwlock_init(&tmp->lock, NULL)) { +                free(tmp); +                return NULL; +        } + +        tmp->table = htable_create(PFT_SIZE, false); +        if (tmp->table == NULL) { +                pthread_rwlock_destroy(&tmp->lock); +                free(tmp); +                return NULL; +        } + +        return tmp; +} + +void simple_pff_destroy(struct pff_i * pff_i) +{ +        assert(pff_i); + +        htable_destroy(pff_i->table); + +        pthread_rwlock_destroy(&pff_i->lock); +        free(pff_i); +} + +void simple_pff_lock(struct pff_i * pff_i) +{ +        pthread_rwlock_wrlock(&pff_i->lock); +} + +void simple_pff_unlock(struct pff_i * pff_i) +{ +        pthread_rwlock_unlock(&pff_i->lock); +} + +int simple_pff_add(struct pff_i * pff_i, +                   uint64_t       addr, +                   int *          fd, +                   size_t         len) +{ +        int * val; + +        assert(pff_i); +        assert(len > 0); + +        val = malloc(sizeof(*val)); +        if (val == NULL) +                return -ENOMEM; + +        *val = fd[0]; + +        if (htable_insert(pff_i->table, addr, val)) { +                free(val); +                return -1; +        } + +        return 0; +} + +int simple_pff_update(struct pff_i * pff_i, +                      uint64_t       addr, +                      int *          fd, +                      size_t         len) +{ +        int * val; + +        assert(pff_i); +        assert(len > 0); + +        val = malloc(sizeof(*val)); +        if (val == NULL) +                return -ENOMEM; +        *val = fd[0]; + +        if (htable_delete(pff_i->table, addr)) { +                free(val); +                return -1; +        } + +        if (htable_insert(pff_i->table, addr, val)) { +                free(val); +                return -1; +        } + +        return 0; +} + +int simple_pff_del(struct pff_i * pff_i, +                   uint64_t       addr) +{ +        assert(pff_i); + +        if (htable_delete(pff_i->table, addr)) +                return -1; + +        return 0; +} + +void simple_pff_flush(struct pff_i * pff_i) +{ +        assert(pff_i); + +        htable_flush(pff_i->table); +} + +int simple_pff_nhop(struct pff_i * pff_i, +                    uint64_t       addr) +{ +        int * j; +        int   fd = -1; + +        assert(pff_i); + +        pthread_rwlock_rdlock(&pff_i->lock); + +        j = (int *) htable_lookup(pff_i->table, addr); +        if (j != NULL) +                fd = *j; + +        pthread_rwlock_unlock(&pff_i->lock); + +        return fd; +} diff --git a/src/ipcpd/normal/pol/simple_pff.h b/src/ipcpd/normal/pol/simple_pff.h new file mode 100644 index 00000000..ef34dfee --- /dev/null +++ b/src/ipcpd/normal/pol/simple_pff.h @@ -0,0 +1,57 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * Simple policy for PFF + * + *    Dimitri Staessens <dimitri.staessens@ugent.be> + *    Sander Vrijders   <sander.vrijders@ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., http://www.fsf.org/about/contact/. + */ + +#ifndef OUROBOROS_IPCPD_NORMAL_SIMPLE_PFF_H +#define OUROBOROS_IPCPD_NORMAL_SIMPLE_PFF_H + +#include "pol-pff-ops.h" + +struct pff_i * simple_pff_create(void); + +void           simple_pff_destroy(struct pff_i * pff_i); + +void           simple_pff_lock(struct pff_i * pff_i); + +void           simple_pff_unlock(struct pff_i * pff_i); + +int            simple_pff_add(struct pff_i * pff_i, +                              uint64_t       addr, +                              int *          fd, +                              size_t         len); + +int            simple_pff_update(struct pff_i * pff_i, +                                 uint64_t       addr, +                                 int *          fd, +                                 size_t         len); + +int            simple_pff_del(struct pff_i * pff_i, +                              uint64_t       addr); + +void           simple_pff_flush(struct pff_i * pff_i); + +/* Returns fd towards next hop */ +int            simple_pff_nhop(struct pff_i * pff_i, +                               uint64_t       addr); + +struct pol_pff_ops simple_pff_ops; + +#endif /* OUROBOROS_IPCPD_NORMAL_SIMPLE_PFF_H */ | 
