// New is the factory method called by the tcpassembly to generate new tcpassembly.Stream. func (os *MongoOpStream) New(netFlow, tcpFlow gopacket.Flow) tcpassembly.Stream { key := bidiKey{netFlow, tcpFlow} rkey := bidiKey{netFlow.Reverse(), tcpFlow.Reverse()} if bidi, ok := os.bidiMap[key]; ok { atomic.AddInt32(&bidi.openStreamCount, 1) delete(os.bidiMap, key) return bidi.streams[1] } bidi := newBidi(netFlow, tcpFlow, os, <-os.connectionCounter) os.bidiMap[rkey] = bidi atomic.AddInt32(&bidi.openStreamCount, 1) go bidi.streamOps() return bidi.streams[0] }
// New handles creating a new tcpassembly.Stream. func (f *myFactory) New(netFlow, tcpFlow gopacket.Flow) tcpassembly.Stream { // Create a new stream. s := &myStream{} // Find the bidi bidirectional struct for this stream, creating a new one if // one doesn't already exist in the map. k := key{netFlow, tcpFlow} bd := f.bidiMap[k] if bd == nil { bd = &bidi{a: s, key: k} // Register bidirectional with the reverse key, so the matching stream going // the other direction will find it. f.bidiMap[key{netFlow.Reverse(), tcpFlow.Reverse()}] = bd } else { bd.b = s // Clear out the bidi we're using from the map, just in case. delete(f.bidiMap, k) } s.bidi = bd return s }
func newBidi(netFlow, tcpFlow gopacket.Flow, opStream *MongoOpStream, num int64) *bidi { bidi := &bidi{connectionNumber: num} bidi.streams[0] = &stream{ bidi: bidi, reassembled: make(chan []tcpassembly.Reassembly), done: make(chan interface{}), op: &RawOp{}, netFlow: netFlow, tcpFlow: tcpFlow, } bidi.streams[1] = &stream{ bidi: bidi, reassembled: make(chan []tcpassembly.Reassembly), done: make(chan interface{}), op: &RawOp{}, netFlow: netFlow.Reverse(), tcpFlow: tcpFlow.Reverse(), } bidi.opStream = opStream return bidi }