diff options
| author | Philippe Guibert <philippe.guibert@6wind.com> | 2018-01-29 16:56:11 +0100 | 
|---|---|---|
| committer | Philippe Guibert <philippe.guibert@6wind.com> | 2018-02-27 11:11:24 +0100 | 
| commit | 3c0eb8faa2936ed43c557fe375383d6d03646291 (patch) | |
| tree | 3e438c0ff308443721778a25dc70ce3e3862f727 /ospfd/ospf_network.c | |
| parent | 97896a91c2a7c8d856a1326cd4017f458e4a5493 (diff) | |
ospfd: basic support for VRF NETNS backend
The change consists in taking into account of the VRF identifier upon
which the ospf socket is created. Moreover, if the VRF is a netns
backend, then it is not necessary to perform the bind operations to vrf
device.
Also, when a VRF instance is enabled, it informs ospf VRF, and automatically
OSPF VRF benefits from it. Reversely, when VRF instance is disabled,
then OSPF VRF will be disabled too.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'ospfd/ospf_network.c')
| -rw-r--r-- | ospfd/ospf_network.c | 41 | 
1 files changed, 10 insertions, 31 deletions
diff --git a/ospfd/ospf_network.c b/ospfd/ospf_network.c index 022a5a138a..045634d8ab 100644 --- a/ospfd/ospf_network.c +++ b/ospfd/ospf_network.c @@ -169,42 +169,27 @@ int ospf_if_ipmulticast(struct ospf *top, struct prefix *p, ifindex_t ifindex)  	return ret;  } -int ospf_bind_vrfdevice(struct ospf *ospf, int ospf_sock) -{ -	int ret = 0; - -#ifdef SO_BINDTODEVICE - -	if (ospf && ospf->vrf_id != VRF_DEFAULT && -	    ospf->vrf_id != VRF_UNKNOWN) { -		ret = setsockopt(ospf_sock, SOL_SOCKET, SO_BINDTODEVICE, -				 ospf->name, -				 strlen(ospf->name)); -		if (ret < 0) { -			int save_errno = errno; - -			zlog_warn("%s: Could not setsockopt SO_BINDTODEVICE %s", -					__PRETTY_FUNCTION__, -					safe_strerror(save_errno)); -		} - -	} -#endif -	return ret; -} -  int ospf_sock_init(struct ospf *ospf)  {  	int ospf_sock;  	int ret, hincl = 1;  	int bufsize = (8 * 1024 * 1024); +	/* silently ignore. already done */ +	if (ospf->fd > 0) +		return -1; + +	if (ospf->vrf_id == VRF_UNKNOWN) { +		/* silently return since VRF is not ready */ +		return -1; +	}  	if (ospfd_privs.change(ZPRIVS_RAISE)) {  		zlog_err("ospf_sock_init: could not raise privs, %s",  			 safe_strerror(errno));  	} -	ospf_sock = socket(AF_INET, SOCK_RAW, IPPROTO_OSPFIGP); +	ospf_sock = vrf_socket(AF_INET, SOCK_RAW, IPPROTO_OSPFIGP, +			       ospf->vrf_id, ospf->name);  	if (ospf_sock < 0) {  		int save_errno = errno; @@ -216,12 +201,6 @@ int ospf_sock_init(struct ospf *ospf)  		exit(1);  	} -	ret = ospf_bind_vrfdevice(ospf, ospf_sock); -	if (ret < 0) { -		close(ospf_sock); -		goto out; -	} -  #ifdef IP_HDRINCL  	/* we will include IP header with packet */  	ret = setsockopt(ospf_sock, IPPROTO_IP, IP_HDRINCL, &hincl,  | 
