nwfilter_conf.h 19.0 KB
Newer Older
1 2 3 4
/*
 * nwfilter_conf.h: network filter XML processing
 *                  (derived from storage_conf.h)
 *
5
 * Copyright (C) 2006-2010, 2012-2014 Red Hat, Inc.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * Copyright (C) 2006-2008 Daniel P. Berrange
 *
 * Copyright (C) 2010 IBM Corporation
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
21
 * License along with this library.  If not, see
O
Osier Yang 已提交
22
 * <http://www.gnu.org/licenses/>.
23 24 25 26
 *
 * Author: Stefan Berger <stefanb@us.ibm.com>
 */
#ifndef NWFILTER_CONF_H
27
# define NWFILTER_CONF_H
28

29
# include "internal.h"
30

31
# include "virhash.h"
32
# include "virxml.h"
33
# include "virbuffer.h"
34
# include "virsocketaddr.h"
35
# include "virmacaddr.h"
36
# include "virdomainobjlist.h"
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
/* XXX
 * The config parser/structs should not be using platform specific
 * constants. Win32 lacks these constants, breaking the parser,
 * so temporarily define them until this can be re-written to use
 * locally defined enums for all constants
 */
# ifndef ETHERTYPE_IP
#  define ETHERTYPE_IP            0x0800
# endif
# ifndef ETHERTYPE_ARP
#  define ETHERTYPE_ARP           0x0806
# endif
# ifndef ETHERTYPE_REVARP
#  define ETHERTYPE_REVARP        0x8035
# endif
# ifndef ETHERTYPE_IPV6
#  define ETHERTYPE_IPV6          0x86dd
# endif
S
Stefan Berger 已提交
56 57 58
# ifndef ETHERTYPE_VLAN
#  define ETHERTYPE_VLAN          0x8100
# endif
59 60 61 62 63 64 65 66 67 68

/**
 * Chain suffix size is:
 * max. user define table name length -
 *   sizeof("FO-") -
 *   max. interface name size -
 *   sizeof("-") -
 *   terminating '0' =
 * 32-3-15-1-1 = 12
 */
69
# define MAX_CHAIN_SUFFIX_SIZE	12
70 71


72
typedef enum {
73 74 75
    NWFILTER_ENTRY_ITEM_FLAG_EXISTS   = 1 << 0,
    NWFILTER_ENTRY_ITEM_FLAG_IS_NEG   = 1 << 1,
    NWFILTER_ENTRY_ITEM_FLAG_HAS_VAR  = 1 << 2,
76
} virNWFilterEntryItemFlags;
77 78


79
# define MAX_COMMENT_LENGTH  256
S
Stefan Berger 已提交
80
# define MAX_IPSET_NAME_LENGTH 32 /* incl. terminating '\0' */
81

82
# define HAS_ENTRY_ITEM(data) \
83 84
  (((data)->flags) & NWFILTER_ENTRY_ITEM_FLAG_EXISTS)

85 86
# define ENTRY_WANT_NEG_SIGN(data) \
  (((data)->flags) & NWFILTER_ENTRY_ITEM_FLAG_IS_NEG)
87

88
/* datatypes appearing in rule attributes */
89 90 91
enum attrDatatype {
    DATATYPE_UINT16           = (1 << 0),
    DATATYPE_UINT8            = (1 << 1),
92 93 94 95 96 97 98 99 100
    DATATYPE_UINT16_HEX       = (1 << 2),
    DATATYPE_UINT8_HEX        = (1 << 3),
    DATATYPE_MACADDR          = (1 << 4),
    DATATYPE_MACMASK          = (1 << 5),
    DATATYPE_IPADDR           = (1 << 6),
    DATATYPE_IPMASK           = (1 << 7),
    DATATYPE_STRING           = (1 << 8),
    DATATYPE_IPV6ADDR         = (1 << 9),
    DATATYPE_IPV6MASK         = (1 << 10),
101
    DATATYPE_STRINGCOPY       = (1 << 11),
102
    DATATYPE_BOOLEAN          = (1 << 12),
S
Stefan Berger 已提交
103 104
    DATATYPE_UINT32           = (1 << 13),
    DATATYPE_UINT32_HEX       = (1 << 14),
S
Stefan Berger 已提交
105 106
    DATATYPE_IPSETNAME        = (1 << 15),
    DATATYPE_IPSETFLAGS       = (1 << 16),
107

S
Stefan Berger 已提交
108
    DATATYPE_LAST             = (1 << 17),
109 110
};

S
Stefan Berger 已提交
111 112
# define NWFILTER_MAC_BGA "01:80:c2:00:00:00"

113 114 115 116

typedef struct _nwItemDesc nwItemDesc;
typedef nwItemDesc *nwItemDescPtr;
struct _nwItemDesc {
117
    virNWFilterEntryItemFlags flags;
118
    virNWFilterVarAccessPtr varAccess;
119 120
    enum attrDatatype datatype;
    union {
121
        virMacAddr macaddr;
122
        virSocketAddr ipaddr;
123
        bool         boolean;
124 125
        uint8_t      u8;
        uint16_t     u16;
S
Stefan Berger 已提交
126
        uint32_t     u32;
127
        char         protocolID[10];
128
        char         *string;
129 130 131 132
        struct {
            uint8_t  mask;
            uint8_t  flags;
        } tcpFlags;
S
Stefan Berger 已提交
133 134 135 136 137
        struct {
            char setname[MAX_IPSET_NAME_LENGTH];
            uint8_t numFlags;
            uint8_t flags;
        } ipset;
138 139 140
    } u;
};

S
Stefan Berger 已提交
141 142
# define VALID_IPSETNAME \
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.:-+ "
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158

typedef struct _ethHdrDataDef ethHdrDataDef;
typedef ethHdrDataDef *ethHdrDataDefPtr;
struct _ethHdrDataDef {
    nwItemDesc dataSrcMACAddr;
    nwItemDesc dataSrcMACMask;
    nwItemDesc dataDstMACAddr;
    nwItemDesc dataDstMACMask;
};


typedef struct _ethHdrFilterDef  ethHdrFilterDef;
typedef ethHdrFilterDef *ethHdrFilterDefPtr;
struct _ethHdrFilterDef {
    ethHdrDataDef ethHdr;
    nwItemDesc dataProtocolID;
159
    nwItemDesc dataComment;
160 161 162
};


S
Stefan Berger 已提交
163 164 165 166 167 168 169 170 171 172
typedef struct _vlanHdrFilterDef  vlanHdrFilterDef;
typedef vlanHdrFilterDef *vlanHdrFilterDefPtr;
struct _vlanHdrFilterDef {
    ethHdrDataDef ethHdr;
    nwItemDesc dataVlanID;
    nwItemDesc dataVlanEncap;
    nwItemDesc dataComment;
};


S
Stefan Berger 已提交
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
typedef struct _stpHdrFilterDef  stpHdrFilterDef;
typedef stpHdrFilterDef *stpHdrFilterDefPtr;
struct _stpHdrFilterDef {
    ethHdrDataDef ethHdr;
    nwItemDesc dataType;
    nwItemDesc dataFlags;
    nwItemDesc dataRootPri;
    nwItemDesc dataRootPriHi;
    nwItemDesc dataRootAddr;
    nwItemDesc dataRootAddrMask;
    nwItemDesc dataRootCost;
    nwItemDesc dataRootCostHi;
    nwItemDesc dataSndrPrio;
    nwItemDesc dataSndrPrioHi;
    nwItemDesc dataSndrAddr;
    nwItemDesc dataSndrAddrMask;
    nwItemDesc dataPort;
    nwItemDesc dataPortHi;
    nwItemDesc dataAge;
    nwItemDesc dataAgeHi;
    nwItemDesc dataMaxAge;
    nwItemDesc dataMaxAgeHi;
    nwItemDesc dataHelloTime;
    nwItemDesc dataHelloTimeHi;
    nwItemDesc dataFwdDelay;
    nwItemDesc dataFwdDelayHi;
    nwItemDesc dataComment;
};


203 204 205 206 207 208 209 210 211
typedef struct _arpHdrFilterDef  arpHdrFilterDef;
typedef arpHdrFilterDef *arpHdrFilterDefPtr;
struct _arpHdrFilterDef {
    ethHdrDataDef ethHdr;
    nwItemDesc dataHWType;
    nwItemDesc dataProtocolType;
    nwItemDesc dataOpcode;
    nwItemDesc dataARPSrcMACAddr;
    nwItemDesc dataARPSrcIPAddr;
212
    nwItemDesc dataARPSrcIPMask;
213 214
    nwItemDesc dataARPDstMACAddr;
    nwItemDesc dataARPDstIPAddr;
215
    nwItemDesc dataARPDstIPMask;
216
    nwItemDesc dataGratuitousARP;
217
    nwItemDesc dataComment;
218 219 220 221 222 223 224 225 226 227 228 229
};


typedef struct _ipHdrDataDef  ipHdrDataDef;
typedef ipHdrDataDef *ipHdrDataDefPtr;
struct _ipHdrDataDef {
    nwItemDesc dataIPVersion;
    nwItemDesc dataSrcIPAddr;
    nwItemDesc dataSrcIPMask;
    nwItemDesc dataDstIPAddr;
    nwItemDesc dataDstIPMask;
    nwItemDesc dataProtocolID;
S
Stefan Berger 已提交
230 231 232 233
    nwItemDesc dataSrcIPFrom;
    nwItemDesc dataSrcIPTo;
    nwItemDesc dataDstIPFrom;
    nwItemDesc dataDstIPTo;
234
    nwItemDesc dataDSCP;
235
    nwItemDesc dataState;
236
    nwItemDesc dataConnlimitAbove;
237
    nwItemDesc dataComment;
S
Stefan Berger 已提交
238 239
    nwItemDesc dataIPSet;
    nwItemDesc dataIPSetFlags;
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
};


typedef struct _portDataDef portDataDef;
typedef portDataDef *portDataDefPtr;
struct _portDataDef {
    nwItemDesc dataSrcPortStart;
    nwItemDesc dataSrcPortEnd;
    nwItemDesc dataDstPortStart;
    nwItemDesc dataDstPortEnd;
};


typedef struct _ipHdrFilterDef  ipHdrFilterDef;
typedef ipHdrFilterDef *ipHdrFilterDefPtr;
struct _ipHdrFilterDef {
    ethHdrDataDef ethHdr;
    ipHdrDataDef ipHdr;
    portDataDef  portData;
};


262 263 264 265 266 267
typedef struct _ipv6HdrFilterDef  ipv6HdrFilterDef;
typedef ipv6HdrFilterDef *ipv6HdrFilterDefPtr;
struct _ipv6HdrFilterDef {
    ethHdrDataDef  ethHdr;
    ipHdrDataDef   ipHdr;
    portDataDef    portData;
268 269 270 271
    nwItemDesc     dataICMPTypeStart;
    nwItemDesc     dataICMPTypeEnd;
    nwItemDesc     dataICMPCodeStart;
    nwItemDesc     dataICMPCodeEnd;
272 273 274
};


S
Stefan Berger 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
typedef struct _icmpHdrFilterDef  icmpHdrFilterDef;
typedef icmpHdrFilterDef *icmpHdrFilterDefPtr;
struct _icmpHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
    nwItemDesc   dataICMPType;
    nwItemDesc   dataICMPCode;
    nwItemDesc   dataStateFlags;
};


typedef struct _allHdrFilterDef  allHdrFilterDef;
typedef allHdrFilterDef *allHdrFilterDefPtr;
struct _allHdrFilterDef {
    nwItemDesc    dataSrcMACAddr;
    ipHdrDataDef  ipHdr;
};


typedef struct _igmpHdrFilterDef  igmpHdrFilterDef;
typedef igmpHdrFilterDef *igmpHdrFilterDefPtr;
struct _igmpHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
};


typedef struct _tcpHdrFilterDef  tcpHdrFilterDef;
typedef tcpHdrFilterDef *tcpHdrFilterDefPtr;
struct _tcpHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
    portDataDef  portData;
    nwItemDesc   dataTCPOption;
309
    nwItemDesc   dataTCPFlags;
S
Stefan Berger 已提交
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
};


typedef struct _udpHdrFilterDef  udpHdrFilterDef;
typedef udpHdrFilterDef *udpHdrFilterDefPtr;
struct _udpHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
    portDataDef  portData;
};


typedef struct _sctpHdrFilterDef  sctpHdrFilterDef;
typedef sctpHdrFilterDef *sctpHdrFilterDefPtr;
struct _sctpHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
    portDataDef  portData;
};


331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
typedef struct _espHdrFilterDef  espHdrFilterDef;
typedef espHdrFilterDef *espHdrFilterDefPtr;
struct _espHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
};


typedef struct _ahHdrFilterDef  ahHdrFilterDef;
typedef ahHdrFilterDef *ahHdrFilterDefPtr;
struct _ahHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
};


typedef struct _udpliteHdrFilterDef  udpliteHdrFilterDef;
typedef udpliteHdrFilterDef *udpliteHdrFilterDefPtr;
struct _udpliteHdrFilterDef {
    nwItemDesc   dataSrcMACAddr;
    ipHdrDataDef ipHdr;
};


355
typedef enum {
356 357
    VIR_NWFILTER_RULE_ACTION_DROP = 0,
    VIR_NWFILTER_RULE_ACTION_ACCEPT,
358
    VIR_NWFILTER_RULE_ACTION_REJECT,
359 360
    VIR_NWFILTER_RULE_ACTION_RETURN,
    VIR_NWFILTER_RULE_ACTION_CONTINUE,
361 362

    VIR_NWFILTER_RULE_ACTION_LAST,
363
} virNWFilterRuleActionType;
364

365
typedef enum {
366 367 368 369 370
    VIR_NWFILTER_RULE_DIRECTION_IN = 0,
    VIR_NWFILTER_RULE_DIRECTION_OUT,
    VIR_NWFILTER_RULE_DIRECTION_INOUT,

    VIR_NWFILTER_RULE_DIRECTION_LAST,
371
} virNWFilterRuleDirectionType ;
372

373
typedef enum {
374 375 376 377
    VIR_NWFILTER_CHAIN_POLICY_ACCEPT = 0,
    VIR_NWFILTER_CHAIN_POLICY_DROP,

    VIR_NWFILTER_CHAIN_POLICY_LAST,
378
} virNWFilterChainPolicyType;
379

380 381 382 383 384

/*
 * If adding protocols be sure to update the
 * virNWFilterRuleIsProtocolXXXX function impls
 */
385
typedef enum {
386
    /* Ethernet layer protocols */
387 388
    VIR_NWFILTER_RULE_PROTOCOL_NONE = 0,
    VIR_NWFILTER_RULE_PROTOCOL_MAC,
S
Stefan Berger 已提交
389
    VIR_NWFILTER_RULE_PROTOCOL_VLAN,
S
Stefan Berger 已提交
390
    VIR_NWFILTER_RULE_PROTOCOL_STP,
391
    VIR_NWFILTER_RULE_PROTOCOL_ARP,
392
    VIR_NWFILTER_RULE_PROTOCOL_RARP,
393
    VIR_NWFILTER_RULE_PROTOCOL_IP,
394
    VIR_NWFILTER_RULE_PROTOCOL_IPV6,
395 396

    /* IPv4 layer protocols */
S
Stefan Berger 已提交
397 398 399 400
    VIR_NWFILTER_RULE_PROTOCOL_TCP,
    VIR_NWFILTER_RULE_PROTOCOL_ICMP,
    VIR_NWFILTER_RULE_PROTOCOL_IGMP,
    VIR_NWFILTER_RULE_PROTOCOL_UDP,
401 402 403
    VIR_NWFILTER_RULE_PROTOCOL_UDPLITE,
    VIR_NWFILTER_RULE_PROTOCOL_ESP,
    VIR_NWFILTER_RULE_PROTOCOL_AH,
S
Stefan Berger 已提交
404 405
    VIR_NWFILTER_RULE_PROTOCOL_SCTP,
    VIR_NWFILTER_RULE_PROTOCOL_ALL,
406 407

    /* IPv6 layer protocols */
408 409 410 411 412 413 414 415
    VIR_NWFILTER_RULE_PROTOCOL_TCPoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_ICMPV6,
    VIR_NWFILTER_RULE_PROTOCOL_UDPoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_UDPLITEoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_ESPoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_AHoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_SCTPoIPV6,
    VIR_NWFILTER_RULE_PROTOCOL_ALLoIPV6,
S
Stefan Berger 已提交
416 417

    VIR_NWFILTER_RULE_PROTOCOL_LAST
418
} virNWFilterRuleProtocolType;
419

420
typedef enum {
421 422 423 424 425
    VIR_NWFILTER_EBTABLES_TABLE_FILTER = 0,
    VIR_NWFILTER_EBTABLES_TABLE_NAT,
    VIR_NWFILTER_EBTABLES_TABLE_BROUTE,

    VIR_NWFILTER_EBTABLES_TABLE_LAST,
426
} virNWFilterEbtablesTableType;
427 428


429
# define MIN_RULE_PRIORITY  -1000
430
# define MAX_RULE_PRIORITY  1000
431

432 433 434 435
# define NWFILTER_MIN_FILTER_PRIORITY -1000
# define NWFILTER_MAX_FILTER_PRIORITY MAX_RULE_PRIORITY

# define NWFILTER_ROOT_FILTER_PRI 0
S
Stefan Berger 已提交
436
# define NWFILTER_STP_FILTER_PRI  -810
S
Stefan Berger 已提交
437
# define NWFILTER_MAC_FILTER_PRI  -800
S
Stefan Berger 已提交
438
# define NWFILTER_VLAN_FILTER_PRI -750
439 440 441 442 443
# define NWFILTER_IPV4_FILTER_PRI -700
# define NWFILTER_IPV6_FILTER_PRI -600
# define NWFILTER_ARP_FILTER_PRI  -500
# define NWFILTER_RARP_FILTER_PRI -400

444
typedef enum {
445 446 447 448 449 450
    RULE_FLAG_NO_STATEMATCH      = (1 << 0),
    RULE_FLAG_STATE_NEW          = (1 << 1),
    RULE_FLAG_STATE_ESTABLISHED  = (1 << 2),
    RULE_FLAG_STATE_RELATED      = (1 << 3),
    RULE_FLAG_STATE_INVALID      = (1 << 4),
    RULE_FLAG_STATE_NONE         = (1 << 5),
451
} virNWFilterRuleFlags;
452

453

454 455 456 457 458 459 460 461 462 463
# define IPTABLES_STATE_FLAGS \
  (RULE_FLAG_STATE_NEW | \
   RULE_FLAG_STATE_ESTABLISHED | \
   RULE_FLAG_STATE_RELATED | \
   RULE_FLAG_STATE_INVALID | \
   RULE_FLAG_STATE_NONE)

void virNWFilterPrintStateMatchFlags(virBufferPtr buf, const char *prefix,
                                     int32_t flags, bool disp_none);

464 465
typedef int32_t virNWFilterRulePriority;

466 467 468
typedef struct _virNWFilterRuleDef  virNWFilterRuleDef;
typedef virNWFilterRuleDef *virNWFilterRuleDefPtr;
struct _virNWFilterRuleDef {
469
    virNWFilterRulePriority priority;
470 471 472 473
    virNWFilterRuleFlags flags;
    int action; /* virNWFilterRuleActionType */
    int tt; /* virNWFilterRuleDirectionType */
    virNWFilterRuleProtocolType prtclType;
474 475
    union {
        ethHdrFilterDef  ethHdrFilter;
S
Stefan Berger 已提交
476
        vlanHdrFilterDef vlanHdrFilter;
S
Stefan Berger 已提交
477
        stpHdrFilterDef stpHdrFilter;
478
        arpHdrFilterDef  arpHdrFilter; /* also used for rarp */
479
        ipHdrFilterDef   ipHdrFilter;
480
        ipv6HdrFilterDef ipv6HdrFilter;
S
Stefan Berger 已提交
481 482 483
        tcpHdrFilterDef  tcpHdrFilter;
        icmpHdrFilterDef icmpHdrFilter;
        udpHdrFilterDef  udpHdrFilter;
484 485 486
        udpliteHdrFilterDef  udpliteHdrFilter;
        espHdrFilterDef  espHdrFilter;
        ahHdrFilterDef  ahHdrFilter;
S
Stefan Berger 已提交
487 488 489
        allHdrFilterDef  allHdrFilter;
        igmpHdrFilterDef igmpHdrFilter;
        sctpHdrFilterDef sctpHdrFilter;
490 491
    } p;

492 493
    size_t nVarAccess;
    virNWFilterVarAccessPtr *varAccess;
494

495
    size_t nstrings;
496
    char **strings;
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
};


typedef struct _virNWFilterIncludeDef virNWFilterIncludeDef;
typedef virNWFilterIncludeDef *virNWFilterIncludeDefPtr;
struct _virNWFilterIncludeDef {
    char *filterref;
    virNWFilterHashTablePtr params;
};


typedef struct _virNWFilterEntry virNWFilterEntry;
typedef virNWFilterEntry *virNWFilterEntryPtr;
struct _virNWFilterEntry {
    virNWFilterRuleDef    *rule;
    virNWFilterIncludeDef *include;
};

515
typedef enum {
516
    VIR_NWFILTER_CHAINSUFFIX_ROOT = 0,
S
Stefan Berger 已提交
517
    VIR_NWFILTER_CHAINSUFFIX_MAC,
S
Stefan Berger 已提交
518
    VIR_NWFILTER_CHAINSUFFIX_VLAN,
S
Stefan Berger 已提交
519
    VIR_NWFILTER_CHAINSUFFIX_STP,
520
    VIR_NWFILTER_CHAINSUFFIX_ARP,
521
    VIR_NWFILTER_CHAINSUFFIX_RARP,
522
    VIR_NWFILTER_CHAINSUFFIX_IPv4,
523
    VIR_NWFILTER_CHAINSUFFIX_IPv6,
524 525

    VIR_NWFILTER_CHAINSUFFIX_LAST,
526
} virNWFilterChainSuffixType;
527

528 529 530
# define VALID_CHAINNAME \
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.:-"

531
typedef int32_t virNWFilterChainPriority;
532 533 534 535 536 537 538 539

typedef struct _virNWFilterDef virNWFilterDef;
typedef virNWFilterDef *virNWFilterDefPtr;

struct _virNWFilterDef {
    char *name;
    unsigned char uuid[VIR_UUID_BUFLEN];

540
    char *chainsuffix;
541
    virNWFilterChainPriority chainPriority;
542

543
    size_t nentries;
544 545 546 547
    virNWFilterEntryPtr *filterEntries;
};


548 549
typedef struct _virNWFilterObj virNWFilterObj;
typedef virNWFilterObj *virNWFilterObjPtr;
550

551
struct _virNWFilterObj {
552 553 554 555 556 557 558 559 560 561
    virMutex lock;

    int active;
    int wantRemoved;

    virNWFilterDefPtr def;
    virNWFilterDefPtr newDef;
};


562 563 564
typedef struct _virNWFilterObjList virNWFilterObjList;
typedef virNWFilterObjList *virNWFilterObjListPtr;
struct _virNWFilterObjList {
565
    size_t count;
566
    virNWFilterObjPtr *objs;
567 568 569 570 571 572 573
};


typedef struct _virNWFilterDriverState virNWFilterDriverState;
typedef virNWFilterDriverState *virNWFilterDriverStatePtr;
struct _virNWFilterDriverState {
    virMutex lock;
574
    bool privileged;
575

576
    virNWFilterObjList nwfilters;
577 578

    char *configDir;
579
    bool watchingFirewallD;
580 581 582
};


583
typedef enum {
584 585 586
    STEP_APPLY_NEW,
    STEP_TEAR_NEW,
    STEP_TEAR_OLD,
587
    STEP_APPLY_CURRENT,
588
} UpdateStep;
589 590

struct domUpdateCBStruct {
591
    void *opaque;
592
    UpdateStep step;
593
    virHashTablePtr skipInterfaces;
594 595 596
};


597 598 599
void virNWFilterRuleDefFree(virNWFilterRuleDefPtr def);

void virNWFilterDefFree(virNWFilterDefPtr def);
600 601 602
void virNWFilterObjListFree(virNWFilterObjListPtr nwfilters);
void virNWFilterObjRemove(virNWFilterObjListPtr nwfilters,
                          virNWFilterObjPtr nwfilter);
603

604
void virNWFilterObjFree(virNWFilterObjPtr obj);
605

606 607
virNWFilterObjPtr virNWFilterObjFindByUUID(virNWFilterObjListPtr nwfilters,
                                           const unsigned char *uuid);
608

609 610
virNWFilterObjPtr virNWFilterObjFindByName(virNWFilterObjListPtr nwfilters,
                                           const char *name);
611 612


613 614
int virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
                          virNWFilterDefPtr def);
615

616 617
int virNWFilterObjDeleteDef(const char *configDir,
                            virNWFilterObjPtr nwfilter);
618

619
virNWFilterObjPtr virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
620
                                          virNWFilterDefPtr def);
621

622
int virNWFilterTestUnassignDef(virNWFilterObjPtr nwfilter);
623

624
virNWFilterDefPtr virNWFilterDefParseNode(xmlDocPtr xml,
625 626
                                          xmlNodePtr root);

627
char *virNWFilterDefFormat(const virNWFilterDef *def);
628

629
int virNWFilterSaveXML(const char *configDir,
630 631 632
                       virNWFilterDefPtr def,
                       const char *xml);

633
int virNWFilterSaveConfig(const char *configDir,
634 635
                          virNWFilterDefPtr def);

636
int virNWFilterLoadAllConfigs(virNWFilterObjListPtr nwfilters,
637
                              const char *configDir);
638

639
char *virNWFilterConfigFile(const char *dir,
640 641
                            const char *name);

642 643
virNWFilterDefPtr virNWFilterDefParseString(const char *xml);
virNWFilterDefPtr virNWFilterDefParseFile(const char *filename);
644

645 646
void virNWFilterObjLock(virNWFilterObjPtr obj);
void virNWFilterObjUnlock(virNWFilterObjPtr obj);
647

648 649
void virNWFilterWriteLockFilterUpdates(void);
void virNWFilterReadLockFilterUpdates(void);
650
void virNWFilterUnlockFilterUpdates(void);
651

652
int virNWFilterConfLayerInit(virDomainObjListIterator domUpdateCB, void *opaque);
653 654
void virNWFilterConfLayerShutdown(void);

655
int virNWFilterInstFiltersOnAllVMs(void);
656

657

658
typedef int (*virNWFilterRebuild)(virDomainObjListIterator domUpdateCB,
659
                                  void *data);
660 661
typedef void (*virNWFilterVoidCall)(void);

662 663 664 665 666 667 668

typedef struct _virNWFilterCallbackDriver virNWFilterCallbackDriver;
typedef virNWFilterCallbackDriver *virNWFilterCallbackDriverPtr;
struct _virNWFilterCallbackDriver {
    const char *name;

    virNWFilterRebuild vmFilterRebuild;
669 670
    virNWFilterVoidCall vmDriverLock;
    virNWFilterVoidCall vmDriverUnlock;
671 672 673
};

void virNWFilterRegisterCallbackDriver(virNWFilterCallbackDriverPtr);
674
void virNWFilterUnRegisterCallbackDriver(virNWFilterCallbackDriverPtr);
675 676
void virNWFilterCallbackDriversLock(void);
void virNWFilterCallbackDriversUnlock(void);
677 678


679
char *virNWFilterPrintTCPFlags(uint8_t flags);
680 681


682 683 684 685
bool virNWFilterRuleIsProtocolIPv4(virNWFilterRuleDefPtr rule);
bool virNWFilterRuleIsProtocolIPv6(virNWFilterRuleDefPtr rule);
bool virNWFilterRuleIsProtocolEthernet(virNWFilterRuleDefPtr rule);

686 687 688 689 690 691 692 693 694
VIR_ENUM_DECL(virNWFilterRuleAction);
VIR_ENUM_DECL(virNWFilterRuleDirection);
VIR_ENUM_DECL(virNWFilterRuleProtocol);
VIR_ENUM_DECL(virNWFilterJumpTarget);
VIR_ENUM_DECL(virNWFilterChainPolicy);
VIR_ENUM_DECL(virNWFilterEbtablesTable);
VIR_ENUM_DECL(virNWFilterChainSuffix);

#endif /* NWFILTER_CONF_H */