<commit_before>// Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package server

import (
	"bufio"
	"bytes"
	"fmt"
	"github.com/armon/go-radix"
	"github.com/osrg/gobgp/api"
	"github.com/osrg/gobgp/config"
	"github.com/osrg/gobgp/packet"
	"github.com/osrg/gobgp/table"
	"net"
)

type roa struct {
	AS        uint32
	PrefixLen uint8
	MaxLen    uint8
	Prefix    net.IP
}

func (r *roa) key() string {
	return fmt.Sprintf("%s/%d", r.Prefix.String(), r.PrefixLen)
}

func (r *roa) toApiStruct() *api.ROA {
	return &api.ROA{
		As:        r.AS,
		Prefixlen: uint32(r.PrefixLen),
		Maxlen:    uint32(r.MaxLen),
		Prefix:    r.Prefix.String(),
	}
}

type roaClient struct {
	url      string
	roas     map[bgp.RouteFamily]*radix.Tree
	outgoing chan *roa
}

func (c *roaClient) recieveROA() chan *roa {
	return c.outgoing
}

func roa2key(r *roa) string {
	var buffer bytes.Buffer
	for i := 0; i < len(r.Prefix) && i < int(r.PrefixLen); i++ {
		buffer.WriteString(fmt.Sprintf("%08b", r.Prefix[i]))
	}
	return buffer.String()[:r.PrefixLen]
}

func (c *roaClient) handleRTRMsg(r *roa) {
	if r.Prefix.To4() != nil {
		c.roas[bgp.RF_IPv4_UC].Insert(roa2key(r), r)
	} else {
		c.roas[bgp.RF_IPv6_UC].Insert(roa2key(r), r)
	}
}

func (c *roaClient) handleGRPC(grpcReq *GrpcRequest) {
	if tree, ok := c.roas[grpcReq.RouteFamily]; ok {
		tree.Walk(func(s string, v interface{}) bool {
			r, _ := v.(*roa)
			result := &GrpcResponse{}
			result.Data = r.toApiStruct()
			grpcReq.ResponseCh <- result
			return false
		})
	}
	close(grpcReq.ResponseCh)
}

func (c *roaClient) validate(pathList []*table.Path) {
	if c.url == "" {
		return
	}

	for _, path := range pathList {
		if tree, ok := c.roas[path.GetRouteFamily()]; ok {
			_, n, _ := net.ParseCIDR(path.GetNlri().String())
			ones, _ := n.Mask.Size()<commit_msg>rpki: fix deadlock bug<commit_after>// Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package server

import (
	"bufio"
	"bytes"
	"fmt"
	"github.com/armon/go-radix"
	"github.com/osrg/gobgp/api"
	"github.com/osrg/gobgp/config"
	"github.com/osrg/gobgp/packet"
	"github.com/osrg/gobgp/table"
	"net"
)

type roa struct {
	AS        uint32
	PrefixLen uint8
	MaxLen    uint8
	Prefix    net.IP
}

func (r *roa) key() string {
	return fmt.Sprintf("%s/%d", r.Prefix.String(), r.PrefixLen)
}

func (r *roa) toApiStruct() *api.ROA {
	return &api.ROA{
		As:        r.AS,
		Prefixlen: uint32(r.PrefixLen),
		Maxlen:    uint32(r.MaxLen),
		Prefix:    r.Prefix.String(),
	}
}

type roaClient struct {
	url      string
	roas     map[bgp.RouteFamily]*radix.Tree
	outgoing chan *roa
}

func (c *roaClient) recieveROA() chan *roa {
	return c.outgoing
}

func roa2key(r *roa) string {
	var buffer bytes.Buffer
	for i := 0; i < len(r.Prefix) && i < int(r.PrefixLen); i++ {
		buffer.WriteString(fmt.Sprintf("%08b", r.Prefix[i]))
	}
	return buffer.String()[:r.PrefixLen]
}

func (c *roaClient) handleRTRMsg(r *roa) {
	if r.Prefix.To4() != nil {
		c.roas[bgp.RF_IPv4_UC].Insert(roa2key(r), r)
	} else {
		c.roas[bgp.RF_IPv6_UC].Insert(roa2key(r), r)
	}
}

func (c *roaClient) handleGRPC(grpcReq *GrpcRequest) {
	if tree, ok := c.roas[grpcReq.RouteFamily]; ok {
		results := make([]*GrpcResponse, 0)
		tree.Walk(func(s string, v interface{}) bool {
			r, _ := v.(*roa)
			result := &GrpcResponse{}
			result.Data = r.toApiStruct()
			results = append(results, result)
			return false
		})
		go sendMultipleResponses(grpcReq, results)
	}
}

func (c *roaClient) validate(pathList []*table.Path) {
	if c.url == "" {
		return
	}

	for _, path := range pathList {
		if tree, ok := c.roas[path.GetRouteFamily()]; ok {
			_, n, _ := net.ParseCIDR(path.GetNlri().String())
			ones, _ := n.Mask.Size()
{'fraction_non_alphanumeric': 0.15026982150269821, 'fraction_numerical': 0.010585305105853052, 'mean_word_length': 3.45790934320074, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2828528', 'n_tokens_mistral': 1909, 'n_tokens_neox': 1833, 'n_words': 470}