-- |Everything necessary to build a controller atop NetCore, using Nettle as
-- a backend.
module Frenetic.NetCore
  ( -- * OpenFlow Controllers
    controller
  , dynController
  -- * Policies
  , Policy (..)
  , (==>)
  , (<%>)
  , (<+>)
  -- * Predicates
  , Predicate
  , exactMatch
  , inport
  , (<||>)
  , (<&&>)
  , matchAll
  , matchNone
  , neg
  , prSubtract
  , prOr
  , prAnd
  -- ** Exact match predicate constructors
  , onSwitch
  , dlSrc
  , dlDst
  , dlTyp
  , dlVlan
  , dlNoVlan
  , dlVlanPcp
  , nwSrc
  , nwDst
  , nwSrcPrefix
  , nwDstPrefix
  , nwProto
  , nwTos
  , tpSrc
  , tpDst
  , inPort
  -- * Actions
  , Action
  -- ** Constructors
  , dropPkt
  , forward
  , allPorts
  , modify
  , countBytes
  , countPkts
  , getPkts
  -- ** Modifications
  , Modification
  , unmodified
  -- * Network Elements
  , Switch
  , Port
  , Vlan
  , Loc (..)
  , Word48
  , broadcastAddress
  , EthernetAddress
  -- * Packets
  , Packet (..)
  -- * Packet modifications
  , modDlSrc
  , modDlDst
  , modDlVlan
  , modDlVlanPcp
  , modNwSrc
  , modNwDst
  , modNwTos
  , modTpSrc
  , modTpDst
  -- * Channels
  , select
  , both
  -- * Slices
  , Slice(..)
  -- ** Topology constructors
  , Topo
  , buildGraph
  -- ** Slice constructors
  , internalSlice
  , simpleSlice
  -- ** Compilation
  , transform
  , transformEdge
  , dynTransform
  ) where

import Frenetic.Common
import Frenetic.NetCore.Types
import Frenetic.NetCore.Short
import Frenetic.Pattern
import Frenetic.Server
import Frenetic.Slices.Compile
import Frenetic.Slices.Slice
import Frenetic.Topo