Annotation of embedaddon/quagga/babeld/babel_filter.c, revision 1.1

1.1     ! misho       1: /*  
        !             2:  *  This file is free software: you may copy, redistribute and/or modify it  
        !             3:  *  under the terms of the GNU General Public License as published by the  
        !             4:  *  Free Software Foundation, either version 2 of the License, or (at your  
        !             5:  *  option) any later version.  
        !             6:  *  
        !             7:  *  This file is distributed in the hope that it will be useful, but  
        !             8:  *  WITHOUT ANY WARRANTY; without even the implied warranty of  
        !             9:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  
        !            10:  *  General Public License for more details.  
        !            11:  *  
        !            12:  *  You should have received a copy of the GNU General Public License  
        !            13:  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.  
        !            14:  *  
        !            15:  * This file incorporates work covered by the following copyright and  
        !            16:  * permission notice:  
        !            17:  *  
        !            18: 
        !            19: Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
        !            20: 
        !            21: Permission is hereby granted, free of charge, to any person obtaining a copy
        !            22: of this software and associated documentation files (the "Software"), to deal
        !            23: in the Software without restriction, including without limitation the rights
        !            24: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        !            25: copies of the Software, and to permit persons to whom the Software is
        !            26: furnished to do so, subject to the following conditions:
        !            27: 
        !            28: The above copyright notice and this permission notice shall be included in
        !            29: all copies or substantial portions of the Software.
        !            30: 
        !            31: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            32: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            33: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
        !            34: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            35: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        !            36: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        !            37: THE SOFTWARE.
        !            38: */
        !            39: 
        !            40: #include "babel_filter.h"
        !            41: #include "vty.h"
        !            42: #include "filter.h"
        !            43: #include "log.h"
        !            44: #include "plist.h"
        !            45: #include "distribute.h"
        !            46: #include "util.h"
        !            47: 
        !            48: int
        !            49: babel_filter(int output, const unsigned char *prefix, unsigned short plen,
        !            50:              unsigned int ifindex)
        !            51: {
        !            52:     struct interface *ifp = if_lookup_by_index(ifindex);
        !            53:     babel_interface_nfo *babel_ifp = ifp ? babel_get_if_nfo(ifp) : NULL;
        !            54:     struct prefix p;
        !            55:     struct distribute *dist;
        !            56:     struct access_list *alist;
        !            57:     struct prefix_list *plist;
        !            58:     int filter = output ? BABEL_FILTER_OUT : BABEL_FILTER_IN;
        !            59:     int distribute = output ? DISTRIBUTE_OUT : DISTRIBUTE_IN;
        !            60: 
        !            61:     p.family = v4mapped(prefix) ? AF_INET : AF_INET6;
        !            62:     p.prefixlen = v4mapped(prefix) ? plen - 96 : plen;
        !            63:     if (p.family == AF_INET)
        !            64:         uchar_to_inaddr(&p.u.prefix4, prefix);
        !            65:     else
        !            66:         uchar_to_in6addr(&p.u.prefix6, prefix);
        !            67: 
        !            68:     if (babel_ifp != NULL && babel_ifp->list[filter]) {
        !            69:         if (access_list_apply (babel_ifp->list[filter], &p)
        !            70:             == FILTER_DENY) {
        !            71:             debugf(BABEL_DEBUG_FILTER,
        !            72:                    "%s/%d filtered by distribute in",
        !            73:                    p.family == AF_INET ?
        !            74:                    inet_ntoa(p.u.prefix4) :
        !            75:                    inet6_ntoa (p.u.prefix6),
        !            76:                    p.prefixlen);
        !            77:             return INFINITY;
        !            78:        }
        !            79:     }
        !            80:     if (babel_ifp != NULL && babel_ifp->prefix[filter]) {
        !            81:         if (prefix_list_apply (babel_ifp->prefix[filter], &p)
        !            82:             == PREFIX_DENY) {
        !            83:             debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
        !            84:                         p.family == AF_INET ?
        !            85:                         inet_ntoa(p.u.prefix4) :
        !            86:                         inet6_ntoa (p.u.prefix6),
        !            87:                         p.prefixlen);
        !            88:             return INFINITY;
        !            89:        }
        !            90:     }
        !            91: 
        !            92:     /* All interface filter check. */
        !            93:     dist = distribute_lookup (NULL);
        !            94:     if (dist) {
        !            95:         if (dist->list[distribute]) {
        !            96:             alist = access_list_lookup (AFI_IP6, dist->list[distribute]);
        !            97: 
        !            98:             if (alist) {
        !            99:                 if (access_list_apply (alist, &p) == FILTER_DENY) {
        !           100:                     debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
        !           101:                                 p.family == AF_INET ?
        !           102:                                 inet_ntoa(p.u.prefix4) :
        !           103:                                 inet6_ntoa (p.u.prefix6),
        !           104:                                 p.prefixlen);
        !           105:                     return INFINITY;
        !           106:                }
        !           107:            }
        !           108:        }
        !           109:         if (dist->prefix[distribute]) {
        !           110:             plist = prefix_list_lookup (AFI_IP6, dist->prefix[distribute]);
        !           111:             if (plist) {
        !           112:                 if (prefix_list_apply (plist, &p) == PREFIX_DENY) {
        !           113:                     debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
        !           114:                                 p.family == AF_INET ?
        !           115:                                 inet_ntoa(p.u.prefix4) :
        !           116:                                 inet6_ntoa (p.u.prefix6),
        !           117:                                 p.prefixlen);
        !           118:                     return INFINITY;
        !           119:                }
        !           120:            }
        !           121:        }
        !           122:     }
        !           123:     return 0;
        !           124: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>