Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Motok1 committed Jun 2, 2022
1 parent 15042b0 commit 46b0066
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 60 deletions.
57 changes: 33 additions & 24 deletions pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import (
"github.com/nttcom/pola/pkg/packet/pcep"
)

type lsp struct {
type Lsp struct {
peerAddr net.IP // 後々 router ID, router name などに変更したい
plspId uint32
name string
Expand All @@ -28,7 +28,7 @@ type lsp struct {

type Server struct {
sessionList []*Session
lspList []lsp
lspList []Lsp
pb.UnimplementedPceServiceServer
}

Expand All @@ -39,9 +39,10 @@ type PceOptions struct {

func NewPce(o *PceOptions) error {
s := &Server{}
lspChan := make(chan Lsp)
// PCEP の Listen を開始する
go func() {
if err := s.Listen(o.PcepAddr, o.PcepPort); err != nil {
if err := s.Listen(o.PcepAddr, o.PcepPort, lspChan); err != nil {
fmt.Printf("PCEP listen Error\n")
}

Expand All @@ -53,16 +54,25 @@ func NewPce(o *PceOptions) error {
}

}()

ticker := time.NewTicker(time.Duration(10) * time.Second)
defer ticker.Stop()
// sessionList の表示
for {
s.printSessionList()
s.printLspList()
time.Sleep(10 * time.Second)
select {

case lsp := <-lspChan:
// 更新用に旧 LSP 情報を削除する
s.removeLsp(lsp)
s.lspList = append(s.lspList, lsp)
case <-ticker.C:
s.printSessionList()
s.printLspList()
}

}
}

func (s *Server) Listen(address string, port string) error {
func (s *Server) Listen(address string, port string, lspChan chan Lsp) error {
// PCEP の listen を行う
var listenInfo strings.Builder
listenInfo.WriteString(address)
Expand All @@ -77,7 +87,7 @@ func (s *Server) Listen(address string, port string) error {
defer listener.Close()
sessionId := uint8(1)
for {
session := NewSession(sessionId)
session := NewSession(sessionId, lspChan)

fmt.Printf("%#v\n", s)
session.tcpConn, err = listener.Accept()
Expand Down Expand Up @@ -154,10 +164,10 @@ func (s *Server) printLspList() {
fmt.Printf("printLspList ************\n")
fmt.Printf("*\n")
for _, lsp := range s.lspList {
fmt.Printf("|- LSP Owner address %s\n", lsp.peerAddr.String())
fmt.Printf("| LSP Name %s\n", lsp.name)
fmt.Printf("| PLSP-ID %d\n", lsp.plspId)
fmt.Printf("| lspObject %#v\n", lsp.pcrptMessage)
fmt.Printf("*- LSP Owner address %s\n", lsp.peerAddr.String())
fmt.Printf("* LSP Name %s\n", lsp.name)
fmt.Printf("* PLSP-ID %d\n", lsp.plspId)
fmt.Printf("* lspObject %#v\n", lsp.pcrptMessage)
}
fmt.Printf("*\n")
fmt.Printf("*************************\n")
Expand All @@ -173,14 +183,13 @@ func (s *Server) removeSession(sessionId uint8) {
}
}

// func removeLsp(lspList []lsp, e lsp) []lsp {
// // lspList から name, PLSP-ID, sessionAddr が一致するものを削除する
// result := []lsp{}
// for _, lsp := range lspList {
// if lsp.name == e.name && lsp.plspId == e.plspId && lsp.peerAddr.Equal(e.peerAddr) {
// continue
// }
// result = append(result, lsp)
// }
// return result
// }
func (s *Server) removeLsp(e Lsp) {
// lspList から name, PLSP-ID, sessionAddr が一致するものを削除する
for i, v := range s.lspList {
if v.name == e.name && v.plspId == e.plspId && v.peerAddr.Equal(e.peerAddr) {
s.lspList[i] = s.lspList[len(s.lspList)-1]
s.lspList = s.lspList[:len(s.lspList)-1]
break
}
}
}
52 changes: 16 additions & 36 deletions pkg/server/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,20 @@ type Session struct {
tcpConn net.Conn
isSynced bool
srpIdHead uint32
lspChan chan Lsp
}

func (s *Session) Close() {
// セッション情報の削除も入れたい
s.tcpConn.Close()
}

func NewSession(sessionId uint8) *Session {
func NewSession(sessionId uint8, lspChan chan Lsp) *Session {
s := &Session{
sessionId: sessionId,
isSynced: false,
srpIdHead: uint32(1),
lspChan: lspChan,
}

return s
Expand Down Expand Up @@ -194,7 +196,6 @@ func SendKeepAlive(conn net.Conn) error {
}

func (s *Session) ReceivePcepMessage() error {
// 経路計算の要求パケットがあったときにこの関数で返している
// latestSrpId := uint32(1) // 0x00000000 and 0xFFFFFFFF are reserved.
for {
// pcep common header を取得
Expand All @@ -207,26 +208,15 @@ func (s *Session) ReceivePcepMessage() error {
return err
}

// byteCommonObjectHeader := make([]uint8, pcep.COMMON_OBJECT_HEADER_LENGTH)
// if _, err := s.tcpConn.Read(byteCommonObjectHeader); err != nil {
// return err
// }
// var commonObjectHeader pcep.CommonObjectHeader
// if err := commonObjectHeader.DecodeFromBytes(byteCommonObjectHeader); err != nil {
// return err
// }

switch commonHeader.MessageType {
case pcep.MT_KEEPALIVE:
fmt.Printf("[PCEP] Received KeepAlive\n")
case pcep.MT_REPORT:
// PCrpt: PCCが持つlspの情報を送ってくる
fmt.Printf("[PCEP] Received PCRpt\n")
bytePcrptObject := make([]uint8, commonHeader.MessageLength-pcep.COMMON_HEADER_LENGTH)
if _, err := s.tcpConn.Read(bytePcrptObject); err != nil {
return err
}
// ポインタ型かも
var pcrptMessage pcep.PCRptMessage
if err := pcrptMessage.DecodeFromBytes(bytePcrptObject); err != nil {
return err
Expand All @@ -240,32 +230,11 @@ func (s *Session) ReceivePcepMessage() error {
// PCUpd/PCinitiate に対する応答用 pcrptObject になる
// TODO: pcrptObject.SrpObject.SrpId != 0 => pcrptObject.SrpObject.SrpId == initiate SRP-ID に変更する
fmt.Printf(" Finish Transaction SRP ID: %v\n", pcrptMessage.SrpObject.SrpId)
// 複数の pcep message が含まれている時?
// lspData := lsp{
// peerAddr: s.peerAddr,
// plspId: pcrptObject.LspObject.PlspId,
// name: pcrptObject.LspObject.Name,
// pcrptObject: pcrptObject,
// }

// channel かなんかで server に送らないと
// s.lspList = removeLsp(s.lspList, lspData)
// s.lspList = append(s.lspList, lspData)
go RegisterLsp(s.lspChan, s.peerAddr, pcrptMessage)
} else if pcrptMessage.LspObject.SFlag {
// sync 中
fmt.Printf(" Synchronize LSP information for PLSP-ID: %v\n", pcrptMessage.LspObject.PlspId)
// 複数の pcep message が含まれている時?
// lspData := lsp{
// peerAddr: s.peerAddr,
// plspId: pcrptObject.LspObject.PlspId,
// name: pcrptObject.LspObject.Name,
// pcrptObject: pcrptObject,
// }
// channel かなんかで server に送らないと
// s.lspList = removeLsp(s.lspList, lspData)
// s.lspList = append(s.lspList, lspData)
go RegisterLsp(s.lspChan, s.peerAddr, pcrptMessage)
}
// TODO: elseでsync処理を追加
case pcep.MT_ERROR:
fmt.Printf("[PCEP] Received PCErr\n")
// TODO: エラー内容の表示
Expand Down Expand Up @@ -299,3 +268,14 @@ func (s *Session) SendPCInitiate(policyName string, labels []pcep.Label, color u
s.srpIdHead += 1
return nil
}

func RegisterLsp(lspChan chan Lsp, peerAddr net.IP, pcrptMessage pcep.PCRptMessage) {
lspStruct := Lsp{
peerAddr: peerAddr,
plspId: pcrptMessage.LspObject.PlspId,
name: pcrptMessage.LspObject.Name,
pcrptMessage: pcrptMessage,
}

lspChan <- lspStruct
}

0 comments on commit 46b0066

Please sign in to comment.