RFC 4566 SDP implementation in go

Master status codecov GoDoc

SDP

Package sdp implements SDP: Session Description Protocol [RFC4566]. Complies to gortc principles as core package.

Examples

See examples folder. Also there is online SDP example that gets RTCPeerConnection.localDescription.sdp using WebRTC, sends it to server, decodes as sdp.Session and renders it on web page.

SDP example:

v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.example.com/seminars/sdp.pdf
[email protected] (Jane Doe)
p=12345
c=IN IP4 224.2.17.12/127
b=CT:154798
t=2873397496 2873404696
r=7d 1h 0 25h
k=clear:ab8c4df8b8f4as8v8iuy8re
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
b=AS:66781
k=prompt
a=rtpmap:99 h263-1998/90000

Encode:

package main

import (
	"fmt"
	"net"
	"time"
	
	"gortc.io/sdp"
)

func main()  {
	var (
		s sdp.Session
		b []byte
	)
	// defining medias
	audio := sdp.Media{
		Description: sdp.MediaDescription{
			Type:     "audio",
			Port:     49170,
			Formats:   []string{"0"},
			Protocol: "RTP/AVP",
		},
	}
	video := sdp.Media{
		Description: sdp.MediaDescription{
			Type:     "video",
			Port:     51372,
			Formats:   []string{"99"},
			Protocol: "RTP/AVP",
		},
		Bandwidths: sdp.Bandwidths{
			sdp.BandwidthApplicationSpecific: 66781,
		},
		Encryption: sdp.Encryption{
			Method: "prompt",
		},
	}
	video.AddAttribute("rtpmap", "99", "h263-1998/90000")

	// defining message
	m := &sdp.Message{
		Origin: sdp.Origin{
			Username:       "jdoe",
			SessionID:      2890844526,
			SessionVersion: 2890842807,
			Address:        "10.47.16.5",
		},
		Name:  "SDP Seminar",
		Info:  "A Seminar on the session description protocol",
		URI:   "http://www.example.com/seminars/sdp.pdf",
		Email: "[email protected] (Jane Doe)",
		Phone: "12345",
		Connection: sdp.ConnectionData{
			IP:  net.ParseIP("224.2.17.12"),
			TTL: 127,
		},
		Bandwidths: sdp.Bandwidths{
			sdp.BandwidthConferenceTotal: 154798,
		},
		Timing: []sdp.Timing{
			{
				Start:  sdp.NTPToTime(2873397496),
				End:    sdp.NTPToTime(2873404696),
				Repeat: 7 * time.Hour * 24,
				Active: 3600 * time.Second,
				Offsets: []time.Duration{
					0,
					25 * time.Hour,
				},
			},
		},
		Encryption: sdp.Encryption{
			Method: "clear",
			Key: "ab8c4df8b8f4as8v8iuy8re",
		},
		Medias: []sdp.Media{audio, video},
	}
	m.AddFlag("recvonly")

	// appending message to session
	s = m.Append(s)

	// appending session to byte buffer
	b = s.AppendTo(b)
	fmt.Println(string(b))
}

Decode:

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"

	"gortc.io/sdp"
)

func main() {
	name := "example.sdp"
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	var (
		s   sdp.Session
		b   []byte
		err error
		f   io.ReadCloser
	)
	fmt.Println("sdp file:", name)
	if f, err = os.Open(name); err != nil {
		log.Fatal("err:", err)
	}
	defer f.Close()
	if b, err = ioutil.ReadAll(f); err != nil {
		log.Fatal("err:", err)
	}
	if s, err = sdp.DecodeSession(b, s); err != nil {
		log.Fatal("err:", err)
	}
	for k, v := range s {
		fmt.Println(k, v)
	}
	d := sdp.NewDecoder(s)
	m := new(sdp.Message)
	if err = d.Decode(m); err != nil {
		log.Fatal("err:", err)
	}
	fmt.Println("Decoded session", m.Name)
	fmt.Println("Info:", m.Info)
	fmt.Println("Origin:", m.Origin)
}

Also, low-level Session struct can be used directly to compose SDP message:

package main

import (
	"fmt"

	"gortc.io/sdp"
)

func main() {
	var (
		s sdp.Session
		b []byte
	)
	b = s.AddVersion(0).
		AddMediaDescription(sdp.MediaDescription{
			Type:     "video",
			Port:     51372,
			Formats:   []string{"99"},
			Protocol: "RTP/AVP",
		}).
		AddAttribute("rtpmap", "99", "h263-1998/90000").
		AddLine(sdp.TypeEmail, "[email protected]").
		AddRaw('ü', "vαlue").
		AppendTo(b)
	// and so on
	fmt.Println(string(b))
	// Output:
	//	v=0
	//	m=video 51372 RTP/AVP 99
	//	a=rtpmap:99 h263-1998/90000
	//	[email protected]
	//	ü=vαlue
}

Supported params

  • v (protocol version)
  • o (originator and session identifier)
  • s (session name)
  • i (session information)
  • u (URI of description)
  • e (email address)
  • p (phone number)
  • c (connection information)
  • b (zero or more bandwidth information lines)
  • t (time)
  • r (repeat)
  • z (time zone adjustments)
  • k (encryption key)
  • a (zero or more session attribute lines)
  • m (media name and transport address)

TODO:

  • Encoding
  • Parsing
  • High level encoding
  • High level decoding
  • Examples
  • CI
  • More examples and docs
  • Online example
  • io.Reader and io.Writer interop
  • Include to high-level CI

Possible optimizations

There are comments // ALLOCATIONS: suboptimal. and // CPU: suboptimal. that indicate suboptimal implementation that can be optimized. There are often a benchmarks for this pieces.

Benchmarks

goos: linux
goarch: amd64
pkg: github.com/gortc/sdp
PASS
benchmark                                    iter       time/iter   bytes alloc         allocs
---------                                    ----       ---------   -----------         ------
BenchmarkDecoder_Decode-12                 300000   4884.00 ns/op     3166 B/op   93 allocs/op
BenchmarkEncode-12                        1000000   1577.00 ns/op        0 B/op    0 allocs/op
BenchmarkSession_AddConnectionData-12    20000000    114.00 ns/op        0 B/op    0 allocs/op
BenchmarkAppendIP-12                     50000000     37.90 ns/op        0 B/op    0 allocs/op
BenchmarkAppendByte-12                  100000000     11.00 ns/op        0 B/op    0 allocs/op
BenchmarkAppendInt-12                   100000000     11.90 ns/op        0 B/op    0 allocs/op
BenchmarkSession_EX1-12                   3000000    578.00 ns/op       16 B/op    1 allocs/op
BenchmarkAppendRune-12                  200000000      6.70 ns/op        0 B/op    0 allocs/op
BenchmarkDecode-12                      100000000     13.10 ns/op        0 B/op    0 allocs/op
BenchmarkDecodeSession-12                 5000000    234.00 ns/op        0 B/op    0 allocs/op
ok  	github.com/gortc/sdp	16.820s

Build status

Build Status Build status

License

FOSSA Status

Owner
Open source NAT traversal tools in go and WebRTC interop
null
Comments
  • MediaDescription: Lacking test  for multiple fmt in one media description

    MediaDescription: Lacking test for multiple fmt in one media description

    According to RFC4566, the following SDP is allowed:

    Up to one rtpmap attribute can be defined for each media format specified. Thus, we might have the following:

    m=audio 49230 RTP/AVP 96 97 98
    a=rtpmap:96 L8/8000
    a=rtpmap:97 L16/8000
    a=rtpmap:98 L16/11025/2
    

    MediaDescription.Format is a single string And there is no test for this case

  • Parsing not understand type MUST not return error

    Parsing not understand type MUST not return error

    An SDP example taken from the README file

    v=0
    m=video 51372 RTP/AVP 99
    a=rtpmap:99 h263-1998/90000
    [email protected]
    ü=vαlue
    

    when we use Decoder to Decode we got an error

    "failed to decode media"

    var (
        s sdp.Session
    )
    
    s, err = sdp.DecodeSession(session, s)
    d := sdp.NewDecoder(s)
    media := new(sdp.Message)
    if err = d.Decode(media); err != nil {
    	log.Fatal("err:", err)
    }
    

    AS RFC4566 spec:

    1. SDP Specification ... The set of type letters is deliberately small and not intended to be extensible -- an SDP parser MUST completely ignore any session description that contains a type letter that it does not understand. ...

    So I advise that the Decoder should save unknown type description in a generic struct field , or simply discard that description line instead of return error

  • chore(deps): update module pkg/errors to v0.9.1

    chore(deps): update module pkg/errors to v0.9.1

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/pkg/errors | require | minor | v0.8.0 -> v0.9.1 |


    Release Notes

    pkg/errors

    v0.9.1

    Compare Source

    pkg/errors 0.9.1 is a bug fix release for errors 0.9.0. This restore the previous behaviour on Cause method, this behaviour was changed on the PR: #​215 and many breaking changes was produced by that.

    v0.9.0

    Compare Source

    errors 0.9.0 is a preparation release for a 1.0 final release. Also we were working on removing support for Go 1.8, 1.9 and 1.10 and earlier, and become compatible this package with new way of errors on Go 1.13.

    We tried to move into runtime.CallerFrames but this was not possible, you can show the explanation here: Issue 188.

    The motivation for do the backward compatible this package with Go 1.13 is that you can migrate the easy way for this to the new way.

    Now you could use the methods, Is and As, and the Unwrap() interface like on the standard library.

    The method Cause is now compatible with fmt.Errorf("%w", err) and with the Unwrap() interface.

    On the same way the methods related with wrapping on this package now are compatible with Cause and Unwrap() interface.

    Improvements

    Bugs fixed

    • .travis.yml Adjust Go versions. Thanks @​komuw, @​aperezg
    • minor fix in an example to print Stack Trace. Thanks @​bep.
    • Remove not necessary code.
    • Clean up documentation. Thanks @​seh.

    v0.8.1

    Compare Source

    pkg/errors 0.8.1 is a bug fix release for errors 0.8.0. It will be the last version to support Go 1.8 and below. pkg/errors 0.9 and above will require Go 1.9 for the new runtime.CallersFrames API.

    pkg/errors 0.8.1 also adds one new feature, errors.WithMessagef. Ideally this would be held over til 0.9, but that complicates the switch to runtime.CallersFrames.

    Improvements

    Bugs fixed


    Renovate configuration

    :date: Schedule: At any time (no schedule defined).

    :vertical_traffic_light: Automerge: Disabled by config. Please merge this manually once you are satisfied.

    :recycle: Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    :no_bell: Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • failed to decode sess-id: strconv.Atoi: parsing

    failed to decode sess-id: strconv.Atoi: parsing "38990265062388": value out of range

    Hi, I am encountering following error, when opening a rtsp stream on a 32bit arm device.

    failed to decode sess-id: strconv.Atoi: parsing "38990265062388": value out of range https://github.com/gortc/sdp/blob/0abb7ec4b3492c82e30a97fd9468e80e2511705f/decoder.go#L669

    I am not sure if it is a bug or a feature, just wanted to let you know. The cause of this seems to be the value exceeding 2^32 (it is approximately 2^45)

    Best regards, Jonas

  • Add license scan report and status

    Add license scan report and status

    Your FOSSA integration was successful! Attached in this PR is a badge and license report to track scan status in your README.

    Below are docs for integrating FOSSA license checks into your CI:

  • "Connection" field in media isn't recognized

    sdp file

    c=IN IP4 0.0.0.0 is media field , but it's recognized as "Session Description Connection".

    https://tools.ietf.org/html/rfc4566#page-9

  • Avoid panic

    Avoid panic

    There are quite some uses of the panic keyword, mostly in the default case of switch statements. Is there a reason for this? It seems strange to 'blow up' the program in case of unexpected input. Users of the library would have to recover methods that may panic. In addition, gracefully handling unexpected input seems rather important in a P2P protocol. Maybe we should just return errors in these cases? Finally, It would also make testing easier.

  • Typo in decoding connection data TTL within media section

    Typo in decoding connection data TTL within media section

    Hello, There is a typo at line 506 of decoder.go, which affects the decoding of connection data TTL within a media section.

    Line 506 currently reads m.Connection.TTL, err = decodeByte(first)

    It should read: d.m.Connection.TTL, err = decodeByte(first)

    Thanks Sandy

  • Decode of session ID can fail on 32-bit platforms

    Decode of session ID can fail on 32-bit platforms

    Hello,

    I have run into a problem whereby the SDP decode function fails, due to a session ID that is too big to be stored in a 32-bit integer. The same code runs fine on a 64-bit platform,

    My suggestion to fix this would be to change SessionID and SessionVersion to be strings rather than ints, which would be a very simple change but not backwards compatible with existing code that uses the library. The same goes for changing the type to int64.

    If you agree, I could submit a PR with necessary changes.

  • Configure Renovate

    Configure Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    :vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • e2e/Dockerfile (dockerfile)
    • e2e/go.mod (gomod)
    • go.mod (gomod)

    Configuration Summary

    Based on the default config's presets, Renovate will:

    • Start dependency updates only once this onboarding PR is merged
    • Separate major versions of dependencies into individual branches/PRs
    • Do not separate patch and minor upgrades into separate PRs for the same dependency
    • Upgrade to unstable versions only if the existing version is unstable
    • Raise PRs immediately (after branch is created)
    • If semantic commits detected, use semantic commit type fix for dependencies and chore for all others
    • Keep existing branches updated even when not scheduled
    • Disable automerging feature - wait for humans to merge all PRs
    • Ignore node_modules, bower_components, vendor and various test/tests directories
    • Update existing lock files only when package.json is modified
    • Autodetect whether to pin dependencies or maintain ranges
    • Rate limit PR creation to a maximum of two per hour
    • Limit to maximum 20 open PRs at any time
    • Group known monorepo packages together
    • Use curated list of recommended non-monorepo package groupings

    :abcd: Would you like to change the way Renovate is upgrading your dependencies? Simply edit the renovate.json in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.


    You have configured Renovate to use branch master as base branch.

    What to Expect

    With your current configuration, Renovate will create 3 Pull Requests:

    chore(deps): update module chromedp/chromedp to v0.5.3
    • Schedule: ["at any time"]
    • Branch name: renovate/github.com-chromedp-chromedp-0.x
    • Merge into: master
    • Upgrade github.com/chromedp/chromedp to v0.5.3
    chore(deps): update module gortc.io/sdp to v0.17.0
    • Schedule: ["at any time"]
    • Branch name: renovate/gortc.io-sdp-0.x
    • Merge into: master
    • Upgrade gortc.io/sdp to v0.17.0
    chore(deps): update module pkg/errors to v0.9.1
    • Schedule: ["at any time"]
    • Branch name: renovate/github.com-pkg-errors-0.x
    • Merge into: master
    • Upgrade github.com/pkg/errors to v0.9.1

    :children_crossing: Branch creation will be limited to maximum 2 per hour, so it doesn't swamp any CI resources or spam the project. See docs for prhourlylimit for details.


    :question: Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • Terminate lines with CRLF per RFC 4566

    Terminate lines with CRLF per RFC 4566

    According to RFC 4566:

    The sequence CRLF (0x0d0a) is used to end a record, although parsers SHOULD be tolerant and also accept records terminated with a single newline
       character.
    

    Currently this package only terminates with newline. Would you accept a PR to update this to terminate with CRLF per the RFC?

  • chore(deps): update module gortc.io/sdp to v0.18.2

    chore(deps): update module gortc.io/sdp to v0.18.2

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | gortc.io/sdp | require | minor | v0.0.0 -> v0.18.2 |


    Release Notes

    gortc/sdp

    v0.18.2

    Compare Source

    v0.18.1

    Compare Source

    v0.18.0

    Compare Source

    v0.17.0

    Compare Source

    v0.16.0

    Compare Source

    v0.15.0

    Compare Source

    v0.14.0

    Compare Source

    v0.13.1

    Compare Source

    v0.13.0

    Compare Source

    v0.12.5

    Compare Source

    v0.12.4

    Compare Source

    v0.12.3

    Compare Source

    v0.12.2

    Compare Source

    v0.12.1

    Compare Source

    v0.12.0

    Compare Source

    v0.11.0

    Compare Source

    v0.10.0

    Compare Source

    v0.9.2

    Compare Source


    Renovate configuration

    :date: Schedule: At any time (no schedule defined).

    :vertical_traffic_light: Automerge: Disabled by config. Please merge this manually once you are satisfied.

    :recycle: Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    :no_bell: Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • chore(deps): update module chromedp/chromedp to v0.5.3

    chore(deps): update module chromedp/chromedp to v0.5.3

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/chromedp/chromedp | require | minor | v0.1.2 -> v0.5.3 |


    Release Notes

    chromedp/chromedp

    v0.5.3

    Compare Source

    Update to latest cdproto dependency, as backward-incompatible name changes were introduced with the latest cdproto-gen variant.

    Note: this update could not be delayed any further, as the cdproto-gen changes had been made well over a month ago, but the changes to cdproto were not pushed out. For projects not using Go modules, this will cause a breakage if cdproto and chromedp are not kept in sync.

    v0.5.2

    Compare Source

    • Discard detached targets properly, which was causing hangs in some sites using iframes
    • Stop discarding EventExceptionThrown events for targets
    • Make ExecAllocator more robust, with bufio.Reader and a timeout
    • Stop erroring about EventDownloadWillBegin events
    • Support a user's explicit remote-debugging-port flag
    • Avoid a few potential concurrency issues in edge cases

    v0.5.1

    Compare Source

    v0.5.0

    Compare Source

    v0.4.2

    Compare Source

    Maintenance release. No major changes since v0.4.0 other than Go module dependency updates.

    v0.4.1

    Compare Source

    v0.4.0

    Compare Source

    • add WaitNewTarget to grab a tab opened by an existing tab
    • add CombinedOutput to gather the browser's output
    • add ByJSPath to select nodes via a JS expression
    • add Emulate and Device to easily emulate devices
    • mouse actions now use float64 coordinates to improve high-DPI support
    • fix an edge case where FullXPath could return an incorrect path
    • make DefaultExecAllocatorOptions an array, to discourage racy usage
    • give better errors when an unexpected undefined is encountered
    • fix a possible panic if page.Navigate is used directly
    • split Action into many interfaces to organise the docs into sections
    • add a number of examples and improve the documentation

    v0.3.1

    Compare Source

    • fix a regression when sending large messages to Chrome over websocket
    • increase the timeout when waiting for new pages to appear, for slow devices
    • avoid hanging in Navigate actions if the context is canceled
    • fix a data race if Navigate was used while a navigation was already happening
    • fix a regression where large queries could deadlock the target handler
    • revert back to using one goroutine per selector, to reduce CPU use when idle

    v0.3.0

    Compare Source

    • allow listening for browser or tab events
    • navigation actions now wait for the frame to load
    • allow using tabs opened by existing tabs
    • fix the screenshot actions to work on high DPIs
    • work with headless-shell containers out of the box

    v0.2.0

    Compare Source

    • Rewrite API to be context-based
    • Remove all internal timeouts, thanks to contexts
    • Handle all events sequentially, fixing occasional races
    • Redesign the Pool type into an Allocator interface
    • Allow managing multiple tabs per browser
    • Greatly speed up the tests, now taking a few seconds in total

    v0.1.3

    Compare Source


    Renovate configuration

    :date: Schedule: At any time (no schedule defined).

    :vertical_traffic_light: Automerge: Disabled by config. Please merge this manually once you are satisfied.

    :recycle: Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    :no_bell: Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by WhiteSource Renovate. View repository job log here.

  • Requirement for high level API for SDP Attributes

    Requirement for high level API for SDP Attributes

    Ref to RFC4566 section 6. SDP Attributes. We need high level parse for these following attributes which is common use in products.

    a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding
             parameters>]
    
    a=fmtp:<format> <format specific parameters>
    
    a=range:npt=<startTime>-<endTime>
    

    also other range type

Templating system for HTML and other text documents - go implementation

FAQ What is Kasia.go? Kasia.go is a Go implementation of the Kasia templating system. Kasia is primarily designed for HTML, but you can use it for any

Mar 15, 2022
A golang implementation of Norvig's segmenter

A Go language implementation of the Norvig segmenter, given in this pdf. Licensed WTFPL; please use this code in any way you would like. func MakeWord

Sep 14, 2020
A diff3 text merge implementation in Go

Diff3 A diff3 text merge implementation in Go based on the awesome paper below. "A Formal Investigation of Diff3" by Sanjeev Khanna, Keshav Kunal, and

Nov 5, 2022
Fastest levenshtein implementation in Go.

fast-levenshtein ?? Fastest levenshtein implementation in Go. Measure the difference between two strings. note: this implementation is currently not t

Dec 20, 2022
Go (golang) implementation of http://www.hashids.org

go-hashids Go (golang) v1 implementation of http://www.hashids.org under MIT License (same as the original implementations) Original implementations b

Jan 1, 2023
Oct 8, 2022
A go implementation of the STUN client (RFC 3489 and RFC 5389)

go-stun go-stun is a STUN (RFC 3489, 5389) client implementation in golang (a.k.a. UDP hole punching). RFC 3489: STUN - Simple Traversal of User Datag

Jan 5, 2023
Fast RFC 5389 STUN implementation in go

STUN Package stun implements Session Traversal Utilities for NAT (STUN) [RFC5389] protocol and client with no external dependencies and zero allocatio

Nov 28, 2022
Fast RFC 5389 STUN implementation in go

STUN Package stun implements Session Traversal Utilities for NAT (STUN) [RFC5389] protocol and client with no external dependencies and zero allocatio

Jan 1, 2023
jsonpointer - an RFC 6901 implementation for Go

jsonpointer - an RFC 6901 implementation for Go Package jsonpointer provides the ability to resolve, assign, and delete values of any type, including

Jun 13, 2022
Implementation of RFC-6238 (Time-Based One-Time Password Algorithm) in Go.

TOTP TOTP (RFC-6238) implementation in Go with no external dependencies. INSTALL You can do little copying the totp.go file or add this package as Go

Jan 18, 2022
Sieve email filtering language (RFC 5228) implementation in Go.

go-sieve Sieve email filtering language (RFC 5228) implementation in Go.

Sep 29, 2022
Implements the XDR standard as specified in RFC 4506 in pure Go (Golang)

go-xdr [] (https://travis-ci.org/davecgh/go-xdr) [![Coverage Status] (https://coveralls.io/repos/davecgh/go-xdr/badge.png?branch=master)] (https://cov

Dec 15, 2022
Package arp implements the ARP protocol, as described in RFC 826. MIT Licensed.

arp Package arp implements the ARP protocol, as described in RFC 826. MIT Licensed. Portions of this code are taken from the Go standard library. The

Dec 20, 2022
CoAP Client/Server implementing RFC 7252 for the Go Language

Canopus Canopus is a client/server implementation of the Constrained Application Protocol (CoAP) Updates 25.11.2016 I've added basic dTLS Support base

Nov 18, 2022
Package dhcp6 implements a DHCPv6 server, as described in RFC 3315. MIT Licensed.

dhcp6 Package dhcp6 implements a DHCPv6 server, as described in IETF RFC 3315. MIT Licensed. At this time, the API is not stable, and may change over

Sep 27, 2022
Diameter stack and Base Protocol (RFC 6733) for the Go programming language

Diameter Base Protocol Package go-diameter is an implementation of the Diameter Base Protocol RFC 6733 and a stack for the Go programming language. St

Dec 28, 2022
URI Templates (RFC 6570) implemented in Go

uritemplates -- import "github.com/jtacoma/uritemplates" Package uritemplates is a level 4 implementation of RFC 6570 (URI Template, http://tools.ietf

Jan 15, 2022
CBOR RFC 7049 (Go/Golang) - safe & fast with standard API + toarray & keyasint, CBOR tags, float64/32/16, fuzz tested.
CBOR RFC 7049 (Go/Golang) - safe & fast with standard API + toarray & keyasint, CBOR tags, float64/32/16, fuzz tested.

CBOR library in Go fxamacker/cbor is a CBOR encoder & decoder in Go. It has a standard API, CBOR tags, options for duplicate map keys, float64→32→16,

Jan 6, 2023
Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services.

uuid The uuid package generates and inspects UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services. This package is based on the g

Jan 1, 2023