LCOV - code coverage report
Current view: top level - src/ap - vlan_util.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1475438200 Lines: 65 87 74.7 %
Date: 2016-10-02 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*
       2             :  * hostapd / VLAN netlink api
       3             :  * Copyright (c) 2012, Michael Braun <michael-dev@fami-braun.de>
       4             :  *
       5             :  * This software may be distributed under the terms of the BSD license.
       6             :  * See README for more details.
       7             :  */
       8             : 
       9             : #include "utils/includes.h"
      10             : #include <netlink/route/link.h>
      11             : #include <netlink/route/link/vlan.h>
      12             : 
      13             : #include "utils/common.h"
      14             : #include "vlan_util.h"
      15             : 
      16             : /*
      17             :  * Add a vlan interface with name 'vlan_if_name', VLAN ID 'vid' and
      18             :  * tagged interface 'if_name'.
      19             :  *
      20             :  * returns -1 on error
      21             :  * returns 1 if the interface already exists
      22             :  * returns 0 otherwise
      23             : */
      24          15 : int vlan_add(const char *if_name, int vid, const char *vlan_if_name)
      25             : {
      26          15 :         int err, ret = -1;
      27          15 :         struct nl_sock *handle = NULL;
      28          15 :         struct rtnl_link *rlink = NULL;
      29          15 :         int if_idx = 0;
      30             : 
      31          15 :         wpa_printf(MSG_DEBUG, "VLAN: vlan_add(if_name=%s, vid=%d, "
      32             :                    "vlan_if_name=%s)", if_name, vid, vlan_if_name);
      33             : 
      34          15 :         if ((os_strlen(if_name) + 1) > IFNAMSIZ) {
      35           0 :                 wpa_printf(MSG_ERROR, "VLAN: Interface name too long: '%s'",
      36             :                            if_name);
      37           0 :                 return -1;
      38             :         }
      39             : 
      40          15 :         if ((os_strlen(vlan_if_name) + 1) > IFNAMSIZ) {
      41           0 :                 wpa_printf(MSG_ERROR, "VLAN: Interface name too long: '%s'",
      42             :                            vlan_if_name);
      43           0 :                 return -1;
      44             :         }
      45             : 
      46          15 :         handle = nl_socket_alloc();
      47          15 :         if (!handle) {
      48           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to open netlink socket");
      49           0 :                 goto vlan_add_error;
      50             :         }
      51             : 
      52          15 :         err = nl_connect(handle, NETLINK_ROUTE);
      53          15 :         if (err < 0) {
      54           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to connect to netlink: %s",
      55             :                            nl_geterror(err));
      56           0 :                 goto vlan_add_error;
      57             :         }
      58             : 
      59          15 :         err = rtnl_link_get_kernel(handle, 0, if_name, &rlink);
      60          15 :         if (err < 0) {
      61             :                 /* link does not exist */
      62           0 :                 wpa_printf(MSG_ERROR, "VLAN: interface %s does not exist",
      63             :                            if_name);
      64           0 :                 goto vlan_add_error;
      65             :         }
      66          15 :         if_idx = rtnl_link_get_ifindex(rlink);
      67          15 :         rtnl_link_put(rlink);
      68          15 :         rlink = NULL;
      69             : 
      70          15 :         err = rtnl_link_get_kernel(handle, 0, vlan_if_name, &rlink);
      71          15 :         if (err >= 0) {
      72             :                 /* link does exist */
      73           4 :                 rtnl_link_put(rlink);
      74           4 :                 rlink = NULL;
      75           4 :                 wpa_printf(MSG_ERROR, "VLAN: interface %s already exists",
      76             :                            vlan_if_name);
      77           4 :                 ret = 1;
      78           4 :                 goto vlan_add_error;
      79             :         }
      80             : 
      81          11 :         rlink = rtnl_link_alloc();
      82          11 :         if (!rlink) {
      83           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to allocate new link");
      84           0 :                 goto vlan_add_error;
      85             :         }
      86             : 
      87          11 :         err = rtnl_link_set_type(rlink, "vlan");
      88          11 :         if (err < 0) {
      89           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to set link type: %s",
      90             :                            nl_geterror(err));
      91           0 :                 goto vlan_add_error;
      92             :         }
      93             : 
      94          11 :         rtnl_link_set_link(rlink, if_idx);
      95          11 :         rtnl_link_set_name(rlink, vlan_if_name);
      96             : 
      97          11 :         err = rtnl_link_vlan_set_id(rlink, vid);
      98          11 :         if (err < 0) {
      99           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to set link vlan id: %s",
     100             :                            nl_geterror(err));
     101           0 :                 goto vlan_add_error;
     102             :         }
     103             : 
     104          11 :         err = rtnl_link_add(handle, rlink, NLM_F_CREATE);
     105          11 :         if (err < 0) {
     106           2 :                 wpa_printf(MSG_ERROR, "VLAN: failed to create link %s for "
     107             :                            "vlan %d on %s (%d): %s",
     108             :                            vlan_if_name, vid, if_name, if_idx,
     109             :                            nl_geterror(err));
     110           2 :                 goto vlan_add_error;
     111             :         }
     112             : 
     113           9 :         ret = 0;
     114             : 
     115             : vlan_add_error:
     116          15 :         if (rlink)
     117          11 :                 rtnl_link_put(rlink);
     118          15 :         if (handle)
     119          15 :                 nl_socket_free(handle);
     120          15 :         return ret;
     121             : }
     122             : 
     123             : 
     124           9 : int vlan_rem(const char *if_name)
     125             : {
     126           9 :         int err, ret = -1;
     127           9 :         struct nl_sock *handle = NULL;
     128           9 :         struct rtnl_link *rlink = NULL;
     129             : 
     130           9 :         wpa_printf(MSG_DEBUG, "VLAN: vlan_rem(if_name=%s)", if_name);
     131             : 
     132           9 :         handle = nl_socket_alloc();
     133           9 :         if (!handle) {
     134           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to open netlink socket");
     135           0 :                 goto vlan_rem_error;
     136             :         }
     137             : 
     138           9 :         err = nl_connect(handle, NETLINK_ROUTE);
     139           9 :         if (err < 0) {
     140           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to connect to netlink: %s",
     141             :                            nl_geterror(err));
     142           0 :                 goto vlan_rem_error;
     143             :         }
     144             : 
     145           9 :         err = rtnl_link_get_kernel(handle, 0, if_name, &rlink);
     146           9 :         if (err < 0) {
     147             :                 /* link does not exist */
     148           5 :                 wpa_printf(MSG_ERROR, "VLAN: interface %s does not exists",
     149             :                            if_name);
     150           5 :                 goto vlan_rem_error;
     151             :         }
     152             : 
     153           4 :         err = rtnl_link_delete(handle, rlink);
     154           4 :         if (err < 0) {
     155           0 :                 wpa_printf(MSG_ERROR, "VLAN: failed to remove link %s: %s",
     156             :                            if_name, nl_geterror(err));
     157           0 :                 goto vlan_rem_error;
     158             :         }
     159             : 
     160           4 :         ret = 0;
     161             : 
     162             : vlan_rem_error:
     163           9 :         if (rlink)
     164           4 :                 rtnl_link_put(rlink);
     165           9 :         if (handle)
     166           9 :                 nl_socket_free(handle);
     167           9 :         return ret;
     168             : }
     169             : 
     170             : 
     171        2024 : int vlan_set_name_type(unsigned int name_type)
     172             : {
     173        2024 :         return 0;
     174             : }

Generated by: LCOV version 1.10