aboutsummaryrefslogtreecommitdiffstats
path: root/dgbuilder/core_nodes/io/32-udp.js
diff options
context:
space:
mode:
authorTimoney, Daniel (dt5972) <dtimoney@att.com>2017-02-15 10:37:53 -0500
committerTimoney, Daniel (dt5972) <dtimoney@att.com>2017-02-15 10:40:37 -0500
commit324ee36fe31763e507b422ab0a88e4230045e205 (patch)
treed0b04520f6657601c918ce63fd27575977624187 /dgbuilder/core_nodes/io/32-udp.js
parentf0c97e8db427481e28c0a16b789bc73801b35e47 (diff)
Initial commit for OpenECOMP SDN-C OA&M
Change-Id: I7ab579fd0d206bf356f36d52dcdf4f71f1fa2680 Signed-off-by: Timoney, Daniel (dt5972) <dtimoney@att.com> Former-commit-id: 2a9f0edd09581f907e62ec4689b5ac94dd5382ba
Diffstat (limited to 'dgbuilder/core_nodes/io/32-udp.js')
-rw-r--r--dgbuilder/core_nodes/io/32-udp.js171
1 files changed, 171 insertions, 0 deletions
diff --git a/dgbuilder/core_nodes/io/32-udp.js b/dgbuilder/core_nodes/io/32-udp.js
new file mode 100644
index 00000000..a7968e3a
--- /dev/null
+++ b/dgbuilder/core_nodes/io/32-udp.js
@@ -0,0 +1,171 @@
+/**
+ * Copyright 2013 IBM Corp.
+ *
+ * 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.
+ **/
+
+module.exports = function(RED) {
+ "use strict";
+ var dgram = require('dgram');
+
+ // The Input Node
+ function UDPin(n) {
+ RED.nodes.createNode(this,n);
+ this.group = n.group;
+ this.port = n.port;
+ this.datatype = n.datatype;
+ this.iface = n.iface || null;
+ this.multicast = n.multicast;
+ var node = this;
+
+ var server = dgram.createSocket('udp4');
+
+ server.on("error", function (err) {
+ if ((err.code == "EACCES") && (node.port < 1024)) {
+ node.error("UDP access error, you may need root access for ports below 1024");
+ } else {
+ node.error("UDP error : "+err.code);
+ }
+ server.close();
+ });
+
+ server.on('message', function (message, remote) {
+ var msg;
+ if (node.datatype =="base64") {
+ msg = { payload:message.toString('base64'), fromip:remote.address+':'+remote.port };
+ } else if (node.datatype =="utf8") {
+ msg = { payload:message.toString('utf8'), fromip:remote.address+':'+remote.port };
+ } else {
+ msg = { payload:message, fromip:remote.address+':'+remote.port, ip:remote.address, port:remote.port };
+ }
+ node.send(msg);
+ });
+
+ server.on('listening', function () {
+ var address = server.address();
+ node.log('udp listener at ' + address.address + ":" + address.port);
+ if (node.multicast == "true") {
+ server.setBroadcast(true);
+ try {
+ server.setMulticastTTL(128);
+ server.addMembership(node.group,node.iface);
+ node.log("udp multicast group "+node.group);
+ } catch (e) {
+ if (e.errno == "EINVAL") {
+ node.error("Bad Multicast Address");
+ } else if (e.errno == "ENODEV") {
+ node.error("Must be ip address of the required interface");
+ } else {
+ node.error("Error :"+e.errno);
+ }
+ }
+ }
+ });
+
+ node.on("close", function() {
+ try {
+ server.close();
+ node.log('udp listener stopped');
+ } catch (err) {
+ node.error(err);
+ }
+ });
+
+ server.bind(node.port,node.iface);
+ }
+ RED.nodes.registerType("udp in",UDPin);
+
+
+ // The Output Node
+ function UDPout(n) {
+ RED.nodes.createNode(this,n);
+ //this.group = n.group;
+ this.port = n.port;
+ this.outport = n.outport||"";
+ this.base64 = n.base64;
+ this.addr = n.addr;
+ this.iface = n.iface || null;
+ this.multicast = n.multicast;
+ var node = this;
+
+ var sock = dgram.createSocket('udp4'); // only use ipv4 for now
+
+ if (node.multicast != "false") {
+ if (node.outport == "") { node.outport = node.port; }
+ sock.bind(node.outport, function() { // have to bind before you can enable broadcast...
+ sock.setBroadcast(true); // turn on broadcast
+ if (node.multicast == "multi") {
+ try {
+ sock.setMulticastTTL(128);
+ sock.addMembership(node.addr,node.iface); // Add to the multicast group
+ node.log('udp multicast ready : '+node.outport+' -> '+node.addr+":"+node.port);
+ } catch (e) {
+ if (e.errno == "EINVAL") {
+ node.error("Bad Multicast Address");
+ } else if (e.errno == "ENODEV") {
+ node.error("Must be ip address of the required interface");
+ } else {
+ node.error("Error :"+e.errno);
+ }
+ }
+ } else {
+ node.log('udp broadcast ready : '+node.outport+' -> '+node.addr+":"+node.port);
+ }
+ });
+ } else if (node.outport != "") {
+ sock.bind(node.outport);
+ node.log('udp ready : '+node.outport+' -> '+node.addr+":"+node.port);
+ } else {
+ node.log('udp ready : '+node.addr+":"+node.port);
+ }
+
+ node.on("input", function(msg) {
+ if (msg.payload != null) {
+ var add = node.addr || msg.ip || "";
+ var por = node.port || msg.port || 0;
+ if (add == "") {
+ node.warn("udp: ip address not set");
+ } else if (por == 0) {
+ node.warn("udp: port not set");
+ } else if (isNaN(por) || (por < 1) || (por > 65535)) {
+ node.warn("udp: port number not valid");
+ } else {
+ var message;
+ if (node.base64) {
+ message = new Buffer(msg.payload, 'base64');
+ } else if (msg.payload instanceof Buffer) {
+ message = msg.payload;
+ } else {
+ message = new Buffer(""+msg.payload);
+ }
+ sock.send(message, 0, message.length, por, add, function(err, bytes) {
+ if (err) {
+ node.error("udp : "+err);
+ }
+ message = null;
+ });
+ }
+ }
+ });
+
+ node.on("close", function() {
+ try {
+ sock.close();
+ node.log('udp output stopped');
+ } catch (err) {
+ node.error(err);
+ }
+ });
+ }
+ RED.nodes.registerType("udp out",UDPout);
+}