summaryrefslogtreecommitdiff
path: root/src/ipcpd/eth/CMakeLists.txt
blob: d57e1848c881f8bbd94de08de0ef3f441fdaabfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
get_filename_component(CURRENT_SOURCE_PARENT_DIR
  ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
get_filename_component(CURRENT_BINARY_PARENT_DIR
  ${CMAKE_CURRENT_BINARY_DIR} DIRECTORY)

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})

include_directories(${CURRENT_SOURCE_PARENT_DIR})
include_directories(${CURRENT_BINARY_PARENT_DIR})

include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_BINARY_DIR}/include)

find_path(NETMAP_C_INCLUDE_DIR
  net/netmap_user.h
  HINTS /usr/include /usr/local/include)

mark_as_advanced(NETMAP_C_INCLUDE_DIR)

# Check for raw sockets
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
  set(DISABLE_RAW_SOCKETS FALSE CACHE BOOL
    "Disable raw socket support for Ethernet IPCPs")
  if (NOT DISABLE_RAW_SOCKETS)
    message(STATUS "Raw socket support for Ethernet IPCPs enabled")
    set(HAVE_RAW_SOCKETS TRUE PARENT_SCOPE)
    set(HAVE_RAW_SOCKETS TRUE)
    set(HAVE_ETH TRUE)
  else ()
    message(STATUS "Raw socket support for Ethernet IPCPs disabled by user")
    unset(HAVE_RAW_SOCKETS PARENT_SCOPE)
    unset(HAVE_RAW_SOCKETS)
  endif ()
endif ()

# Check for BPF
if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
  find_path(BPF_C_INCLUDE_DIR
    net/bpf.h
    HINTS /usr/include /usr/local/include)

  mark_as_advanced(BPF_C_INCLUDE_DIR)

  if (BPF_C_INCLUDE_DIR)
    set(DISABLE_BPF FALSE CACHE BOOL
      "Disable Berkeley Packet Filter support for Ethernet IPCPs")
    if (NOT DISABLE_BPF)
      message(STATUS "Berkeley Packet Filter support "
        "for Ethernet IPCPs enabled")
      set(HAVE_BPF TRUE PARENT_SCOPE)
      set(HAVE_BPF TRUE)
      set(HAVE_ETH TRUE)
    else ()
      message(STATUS "Berkeley Packet Filter support "
        "for Ethernet IPCPs disabled by user")
      unset(HAVE_BPF PARENT_SCOPE)
      unset(HAVE_BPF)
    endif ()
  endif ()
endif ()

# Check for netmap exclusively
if (NOT HAVE_RAW_SOCKETS AND NOT HAVE_BPF AND NETMAP_C_INCLUDE_DIR)
  set(DISABLE_NETMAP FALSE CACHE BOOL
    "Disable netmap support for ETH IPCPs")
  if (NOT DISABLE_NETMAP)
    message(STATUS "Netmap support for Ethernet IPCPs enabled")
    set(HAVE_NETMAP TRUE PARENT_SCOPE)
    set(HAVE_ETH TRUE)
  else ()
    message(STATUS "Netmap support for Ethernet IPCPs disabled by user")
    unset(HAVE_NETMAP PARENT_SCOPE)
  endif ()
endif ()

if (HAVE_ETH)
  message(STATUS "Supported raw packet API found, building eth-llc and eth-dix")

  set(IPCP_ETH_RD_THR 1 CACHE STRING
    "Number of reader threads in Ethernet IPCP")
  set(IPCP_ETH_WR_THR 1 CACHE STRING
    "Number of writer threads in Ethernet IPCP")
  set(IPCP_ETH_QDISC_BYPASS false CACHE BOOL
    "Bypass the Qdisc in the kernel when using raw sockets")
  set(IPCP_ETH_LO_MTU 1500 CACHE STRING
    "Restrict Ethernet MTU over loopback interfaces")
  set(IPCP_ETH_MPL 5 CACHE STRING
    "Default maximum packet lifetime for the Ethernet IPCPs, in seconds")

  set(ETH_LLC_SOURCES
    # Add source files here
    ${CMAKE_CURRENT_SOURCE_DIR}/llc.c
    )

  set(ETH_DIX_SOURCES
    # Add source files here
    ${CMAKE_CURRENT_SOURCE_DIR}/dix.c
    )

  set(IPCP_ETH_LLC_TARGET ipcpd-eth-llc CACHE INTERNAL "")
  set(IPCP_ETH_DIX_TARGET ipcpd-eth-dix CACHE INTERNAL "")

  add_executable(ipcpd-eth-llc ${ETH_LLC_SOURCES} ${IPCP_SOURCES})
  add_executable(ipcpd-eth-dix ${ETH_DIX_SOURCES} ${IPCP_SOURCES})

  if (HAVE_BPF AND NOT APPLE)
    target_include_directories(ipcpd-eth-llc PUBLIC ${BPF_C_INCLUDE_DIR})
    target_include_directories(ipcpd-eth-dix PUBLIC ${BPF_C_INCLUDE_DIR})
  endif ()

  if (HAVE_NETMAP AND NOT APPLE)
    set_target_properties(ipcpd-eth-llc PROPERTIES
        COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99")
    set_target_properties(ipcpd-eth-dix PROPERTIES
        COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99")
    target_include_directories(ipcpd-eth-llc PUBLIC
      ${NETMAP_C_INCLUDE_DIR})
    target_include_directories(ipcpd-eth-dix PUBLIC
      ${NETMAP_C_INCLUDE_DIR})
  endif ()

  target_link_libraries(ipcpd-eth-llc LINK_PUBLIC ouroboros-dev)
  target_link_libraries(ipcpd-eth-dix LINK_PUBLIC ouroboros-dev)

  include(AddCompileFlags)
  if (CMAKE_BUILD_TYPE MATCHES "Debug*")
    add_compile_flags(ipcpd-eth-llc -DCONFIG_OUROBOROS_DEBUG)
    add_compile_flags(ipcpd-eth-dix -DCONFIG_OUROBOROS_DEBUG)
  endif ()

  install(TARGETS ipcpd-eth-llc ipcpd-eth-dix RUNTIME DESTINATION
    ${CMAKE_INSTALL_SBINDIR})
endif ()