mirror of
				https://github.com/yggdrasil-network/water.git
				synced 2025-11-04 03:05:10 +03:00 
			
		
		
		
	added README.md
This commit is contained in:
		
							parent
							
								
									4a028c3fe3
								
							
						
					
					
						commit
						13bc83d2b7
					
				
					 1 changed files with 81 additions and 0 deletions
				
			
		
							
								
								
									
										81
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,81 @@
 | 
				
			||||||
 | 
					# water
 | 
				
			||||||
 | 
					`water` is a native Go library for `TUN`/`TAP` interfaces. It's designed to be simple and scalable. `water` wraps almost only syscalls and uses only Go standard types, so it plays well with standard packages like `io`, `bufio`, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`water/waterutil` has some useful functions to interpret MAC farme headers and IP packet headers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					go get -u github.com/songgao/water
 | 
				
			||||||
 | 
					go get -u github.com/songgao/water/waterutil
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Documentation
 | 
				
			||||||
 | 
					[http://godoc.org/github.com/songgao/water](http://godoc.org/github.com/songgao/water)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/songgao/water"
 | 
				
			||||||
 | 
						"github.com/songgao/water/waterutil"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const BUFFERSIZE = 1522
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						ifce, err := water.NewTAP("")
 | 
				
			||||||
 | 
						fmt.Printf("%v, %v\n\n", err, ifce)
 | 
				
			||||||
 | 
						buffer := make([]byte, BUFFERSIZE)
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							_, err = ifce.Read(buffer)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ethertype := waterutil.MACEthertype(buffer)
 | 
				
			||||||
 | 
							if ethertype == waterutil.IPv4 {
 | 
				
			||||||
 | 
								packet := waterutil.MACPayload(buffer)
 | 
				
			||||||
 | 
								if waterutil.IsIPv4(packet) {
 | 
				
			||||||
 | 
									fmt.Printf("Source:      %v [%v]\n", waterutil.MACSource(buffer), waterutil.IPv4Source(packet))
 | 
				
			||||||
 | 
									fmt.Printf("Destination: %v [%v]\n", waterutil.MACDestination(buffer), waterutil.IPv4Destination(packet))
 | 
				
			||||||
 | 
									fmt.Printf("Protocol:    %v\n\n", waterutil.IPv4Protocol(packet))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This piece of code creates a `TAP` interface, and prints some header information for every IPv4 packet. After pull up the `main.go`, you'll need to bring up the interface and assign IP address. All of these need root permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					sudo go run main.go
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					sudo ip link set dev tap0 up
 | 
				
			||||||
 | 
					sudo ip addr add 10.0.0.1/24 dev tap0
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now, try sending some ICMP broadcast message:
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					ping -b 10.0.0.255
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You'll see the `main.go` print something like:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					<nil>, &{true 0xf84003f058 tap0}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Source:      42:35:da:af:2b:00 [10.10.10.1]
 | 
				
			||||||
 | 
					Destination: ff:ff:ff:ff:ff:ff [10.10.10.255]
 | 
				
			||||||
 | 
					Protocol:    1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Source:      42:35:da:af:2b:00 [10.10.10.1]
 | 
				
			||||||
 | 
					Destination: ff:ff:ff:ff:ff:ff [10.10.10.255]
 | 
				
			||||||
 | 
					Protocol:    1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Source:      42:35:da:af:2b:00 [10.10.10.1]
 | 
				
			||||||
 | 
					Destination: ff:ff:ff:ff:ff:ff [10.10.10.255]
 | 
				
			||||||
 | 
					Protocol:    1
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue