diff options
Diffstat (limited to 'index.go')
-rw-r--r-- | index.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/index.go b/index.go new file mode 100644 index 0000000..1ba040e --- /dev/null +++ b/index.go @@ -0,0 +1,95 @@ +package main + +import ( + "crypto/rand" + "encoding/binary" + "sync" +) + +/* Index=0 is reserved for unset indecies + * + */ + +type IndexTableEntry struct { + peer *Peer + handshake *Handshake + keyPair *KeyPair +} + +type IndexTable struct { + mutex sync.RWMutex + table map[uint32]IndexTableEntry +} + +func randUint32() (uint32, error) { + var buff [4]byte + _, err := rand.Read(buff[:]) + value := binary.LittleEndian.Uint32(buff[:]) + return value, err +} + +func (table *IndexTable) Init() { + table.mutex.Lock() + table.table = make(map[uint32]IndexTableEntry) + table.mutex.Unlock() +} + +func (table *IndexTable) Delete(index uint32) { + if index == 0 { + return + } + table.mutex.Lock() + delete(table.table, index) + table.mutex.Unlock() +} + +func (table *IndexTable) Insert(key uint32, value IndexTableEntry) { + table.mutex.Lock() + table.table[key] = value + table.mutex.Unlock() +} + +func (table *IndexTable) NewIndex(peer *Peer) (uint32, error) { + for { + // generate random index + + index, err := randUint32() + if err != nil { + return index, err + } + if index == 0 { + continue + } + + // check if index used + + table.mutex.RLock() + _, ok := table.table[index] + table.mutex.RUnlock() + if ok { + continue + } + + // map index to handshake + + table.mutex.Lock() + _, found := table.table[index] + if found { + table.mutex.Unlock() + continue + } + table.table[index] = IndexTableEntry{ + peer: peer, + handshake: &peer.handshake, + keyPair: nil, + } + table.mutex.Unlock() + return index, nil + } +} + +func (table *IndexTable) Lookup(id uint32) IndexTableEntry { + table.mutex.RLock() + defer table.mutex.RUnlock() + return table.table[id] +} |