blob: 02142ae1dbbde23a37d32678e8f10da75a46ac98 [file] [log] [blame]
Matteo Scandolo3896c472017-08-01 13:31:42 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Zack Williams3dfe6af2016-04-30 11:37:09 -070017import hashlib
18import netaddr
19
20def genmac(value, prefix='', length=12):
21 '''
22 deterministically generates a "random" MAC with a configurable prefix
23 '''
24
25 # from: http://serverfault.com/questions/40712/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines
Zack Williams05c21722016-04-30 11:42:58 -070026 if prefix == '' :
Zack Williams3dfe6af2016-04-30 11:37:09 -070027 mac_prefix = "0ac04d" # random "cord"-esque
28
29 # deterministically generate a value
30 h = hashlib.new('sha1')
31 h.update(value)
32
33 # build/trim MAC
34 mac_string = (mac_prefix + h.hexdigest())[0:length]
35
36 return netaddr.EUI(mac_string)
37
38class FilterModule(object):
39 ''' MAC generation filter '''
40 filter_map = {
41 'genmac': genmac,
42 }
43
44 def filters(self):
45 return self.filter_map